summaryrefslogtreecommitdiff
path: root/target/arm/bcm28xx
diff options
context:
space:
mode:
Diffstat (limited to 'target/arm/bcm28xx')
-rw-r--r--target/arm/bcm28xx/patches/3.18.8/0000-raspberry-pi.patch15560
-rw-r--r--target/arm/bcm28xx/patches/3.18.8/0002-allow-to-control-volume-for-each-channel.patch26
-rw-r--r--target/arm/bcm28xx/patches/3.18.8/0002-enable-MMAP-by-default-allow-overide-via-use_mmap.patch37
3 files changed, 13572 insertions, 2051 deletions
diff --git a/target/arm/bcm28xx/patches/3.18.8/0000-raspberry-pi.patch b/target/arm/bcm28xx/patches/3.18.8/0000-raspberry-pi.patch
index b66bb6533..8e2ccfc95 100644
--- a/target/arm/bcm28xx/patches/3.18.8/0000-raspberry-pi.patch
+++ b/target/arm/bcm28xx/patches/3.18.8/0000-raspberry-pi.patch
@@ -1,7 +1,7 @@
-diff -Nur linux-3.18.6/arch/arm/boot/dts/bcm2708.dtsi linux-rpi/arch/arm/boot/dts/bcm2708.dtsi
---- linux-3.18.6/arch/arm/boot/dts/bcm2708.dtsi 1970-01-01 01:00:00.000000000 +0100
-+++ linux-rpi/arch/arm/boot/dts/bcm2708.dtsi 2015-02-09 04:39:42.000000000 +0100
-@@ -0,0 +1,105 @@
+diff -Nur linux-3.18.8/arch/arm/boot/dts/bcm2708.dtsi linux-rpi/arch/arm/boot/dts/bcm2708.dtsi
+--- linux-3.18.8/arch/arm/boot/dts/bcm2708.dtsi 1970-01-01 01:00:00.000000000 +0100
++++ linux-rpi/arch/arm/boot/dts/bcm2708.dtsi 2015-03-05 14:40:11.021715840 +0100
+@@ -0,0 +1,109 @@
+/include/ "skeleton.dtsi"
+
+/ {
@@ -84,6 +84,10 @@ diff -Nur linux-3.18.6/arch/arm/boot/dts/bcm2708.dtsi linux-rpi/arch/arm/boot/dt
+ leds: leds {
+ compatible = "gpio-leds";
+ };
++
++ arm-pmu {
++ compatible = "arm,arm1176-pmu";
++ };
+ };
+
+ clocks {
@@ -107,9 +111,9 @@ diff -Nur linux-3.18.6/arch/arm/boot/dts/bcm2708.dtsi linux-rpi/arch/arm/boot/dt
+ };
+ };
+};
-diff -Nur linux-3.18.6/arch/arm/boot/dts/bcm2708-rpi-b.dts linux-rpi/arch/arm/boot/dts/bcm2708-rpi-b.dts
---- linux-3.18.6/arch/arm/boot/dts/bcm2708-rpi-b.dts 1970-01-01 01:00:00.000000000 +0100
-+++ linux-rpi/arch/arm/boot/dts/bcm2708-rpi-b.dts 2015-02-09 04:39:42.000000000 +0100
+diff -Nur linux-3.18.8/arch/arm/boot/dts/bcm2708-rpi-b.dts linux-rpi/arch/arm/boot/dts/bcm2708-rpi-b.dts
+--- linux-3.18.8/arch/arm/boot/dts/bcm2708-rpi-b.dts 1970-01-01 01:00:00.000000000 +0100
++++ linux-rpi/arch/arm/boot/dts/bcm2708-rpi-b.dts 2015-03-05 14:40:11.021715840 +0100
@@ -0,0 +1,107 @@
+/dts-v1/;
+
@@ -218,9 +222,9 @@ diff -Nur linux-3.18.6/arch/arm/boot/dts/bcm2708-rpi-b.dts linux-rpi/arch/arm/bo
+ act_led_trigger = <&act_led>,"linux,default-trigger";
+ };
+};
-diff -Nur linux-3.18.6/arch/arm/boot/dts/bcm2708-rpi-b-plus.dts linux-rpi/arch/arm/boot/dts/bcm2708-rpi-b-plus.dts
---- linux-3.18.6/arch/arm/boot/dts/bcm2708-rpi-b-plus.dts 1970-01-01 01:00:00.000000000 +0100
-+++ linux-rpi/arch/arm/boot/dts/bcm2708-rpi-b-plus.dts 2015-02-09 04:39:42.000000000 +0100
+diff -Nur linux-3.18.8/arch/arm/boot/dts/bcm2708-rpi-b-plus.dts linux-rpi/arch/arm/boot/dts/bcm2708-rpi-b-plus.dts
+--- linux-3.18.8/arch/arm/boot/dts/bcm2708-rpi-b-plus.dts 1970-01-01 01:00:00.000000000 +0100
++++ linux-rpi/arch/arm/boot/dts/bcm2708-rpi-b-plus.dts 2015-03-05 14:40:11.021715840 +0100
@@ -0,0 +1,117 @@
+/dts-v1/;
+
@@ -339,10 +343,10 @@ diff -Nur linux-3.18.6/arch/arm/boot/dts/bcm2708-rpi-b-plus.dts linux-rpi/arch/a
+ pwr_led_trigger = <&pwr_led>,"linux,default-trigger";
+ };
+};
-diff -Nur linux-3.18.6/arch/arm/boot/dts/bcm2709.dtsi linux-rpi/arch/arm/boot/dts/bcm2709.dtsi
---- linux-3.18.6/arch/arm/boot/dts/bcm2709.dtsi 1970-01-01 01:00:00.000000000 +0100
-+++ linux-rpi/arch/arm/boot/dts/bcm2709.dtsi 2015-02-09 04:39:42.000000000 +0100
-@@ -0,0 +1,155 @@
+diff -Nur linux-3.18.8/arch/arm/boot/dts/bcm2709.dtsi linux-rpi/arch/arm/boot/dts/bcm2709.dtsi
+--- linux-3.18.8/arch/arm/boot/dts/bcm2709.dtsi 1970-01-01 01:00:00.000000000 +0100
++++ linux-rpi/arch/arm/boot/dts/bcm2709.dtsi 2015-03-05 14:40:11.021715840 +0100
+@@ -0,0 +1,160 @@
+/include/ "skeleton.dtsi"
+
+/ {
@@ -425,6 +429,11 @@ diff -Nur linux-3.18.6/arch/arm/boot/dts/bcm2709.dtsi linux-rpi/arch/arm/boot/dt
+ leds: leds {
+ compatible = "gpio-leds";
+ };
++
++ arm-pmu {
++ compatible = "arm,cortex-a7-pmu";
++ interrupts = <3 9>;
++ };
+ };
+
+ clocks {
@@ -498,9 +507,9 @@ diff -Nur linux-3.18.6/arch/arm/boot/dts/bcm2709.dtsi linux-rpi/arch/arm/boot/dt
+ <&v7_cpu3>, "clock-frequency:0";
+ };
+};
-diff -Nur linux-3.18.6/arch/arm/boot/dts/bcm2709-rpi-2-b.dts linux-rpi/arch/arm/boot/dts/bcm2709-rpi-2-b.dts
---- linux-3.18.6/arch/arm/boot/dts/bcm2709-rpi-2-b.dts 1970-01-01 01:00:00.000000000 +0100
-+++ linux-rpi/arch/arm/boot/dts/bcm2709-rpi-2-b.dts 2015-02-09 04:39:42.000000000 +0100
+diff -Nur linux-3.18.8/arch/arm/boot/dts/bcm2709-rpi-2-b.dts linux-rpi/arch/arm/boot/dts/bcm2709-rpi-2-b.dts
+--- linux-3.18.8/arch/arm/boot/dts/bcm2709-rpi-2-b.dts 1970-01-01 01:00:00.000000000 +0100
++++ linux-rpi/arch/arm/boot/dts/bcm2709-rpi-2-b.dts 2015-03-05 14:40:11.021715840 +0100
@@ -0,0 +1,117 @@
+/dts-v1/;
+
@@ -619,9 +628,36 @@ diff -Nur linux-3.18.6/arch/arm/boot/dts/bcm2709-rpi-2-b.dts linux-rpi/arch/arm/
+ pwr_led_trigger = <&pwr_led>,"linux,default-trigger";
+ };
+};
-diff -Nur linux-3.18.6/arch/arm/boot/dts/ds1307-rtc-overlay.dts linux-rpi/arch/arm/boot/dts/ds1307-rtc-overlay.dts
---- linux-3.18.6/arch/arm/boot/dts/ds1307-rtc-overlay.dts 1970-01-01 01:00:00.000000000 +0100
-+++ linux-rpi/arch/arm/boot/dts/ds1307-rtc-overlay.dts 2015-02-09 04:39:42.000000000 +0100
+diff -Nur linux-3.18.8/arch/arm/boot/dts/bmp085_i2c-sensor-overlay.dts linux-rpi/arch/arm/boot/dts/bmp085_i2c-sensor-overlay.dts
+--- linux-3.18.8/arch/arm/boot/dts/bmp085_i2c-sensor-overlay.dts 1970-01-01 01:00:00.000000000 +0100
++++ linux-rpi/arch/arm/boot/dts/bmp085_i2c-sensor-overlay.dts 2015-03-05 14:40:11.021715840 +0100
+@@ -0,0 +1,23 @@
++// Definitions for BMP085/BMP180 digital barometric pressure and temperature sensors from Bosch Sensortec
++/dts-v1/;
++/plugin/;
++
++/ {
++ compatible = "brcm,bcm2708";
++
++ fragment@0 {
++ target = <&i2c1>;
++ __overlay__ {
++ #address-cells = <1>;
++ #size-cells = <0>;
++ status = "okay";
++
++ bmp085@77 {
++ compatible = "bosch,bmp085";
++ reg = <0x77>;
++ default-oversampling = <3>;
++ status = "okay";
++ };
++ };
++ };
++};
+diff -Nur linux-3.18.8/arch/arm/boot/dts/ds1307-rtc-overlay.dts linux-rpi/arch/arm/boot/dts/ds1307-rtc-overlay.dts
+--- linux-3.18.8/arch/arm/boot/dts/ds1307-rtc-overlay.dts 1970-01-01 01:00:00.000000000 +0100
++++ linux-rpi/arch/arm/boot/dts/ds1307-rtc-overlay.dts 2015-03-05 14:40:11.025715840 +0100
@@ -0,0 +1,22 @@
+// Definitions for DS1307 Real Time Clock
+/dts-v1/;
@@ -645,9 +681,42 @@ diff -Nur linux-3.18.6/arch/arm/boot/dts/ds1307-rtc-overlay.dts linux-rpi/arch/a
+ };
+ };
+};
-diff -Nur linux-3.18.6/arch/arm/boot/dts/hifiberry-amp-overlay.dts linux-rpi/arch/arm/boot/dts/hifiberry-amp-overlay.dts
---- linux-3.18.6/arch/arm/boot/dts/hifiberry-amp-overlay.dts 1970-01-01 01:00:00.000000000 +0100
-+++ linux-rpi/arch/arm/boot/dts/hifiberry-amp-overlay.dts 2015-02-09 04:39:42.000000000 +0100
+diff -Nur linux-3.18.8/arch/arm/boot/dts/enc28j60-overlay.dts linux-rpi/arch/arm/boot/dts/enc28j60-overlay.dts
+--- linux-3.18.8/arch/arm/boot/dts/enc28j60-overlay.dts 1970-01-01 01:00:00.000000000 +0100
++++ linux-rpi/arch/arm/boot/dts/enc28j60-overlay.dts 2015-03-05 14:40:11.025715840 +0100
+@@ -0,0 +1,29 @@
++// Overlay for the Microchip ENC28J60 Ethernet Controller
++/dts-v1/;
++/plugin/;
++
++/ {
++ compatible = "brcm,bcm2708";
++
++ fragment@0 {
++ target = <&spi0>;
++ __overlay__ {
++ /* needed to avoid dtc warning */
++ #address-cells = <1>;
++ #size-cells = <0>;
++
++ status = "okay";
++
++ spidev@0{
++ status = "disabled";
++ };
++
++ enc28j60@0{
++ compatible = "microchip,enc28j60";
++ reg = <0>; /* CE0 */
++ spi-max-frequency = <12000000>;
++ status = "okay";
++ };
++ };
++ };
++};
+diff -Nur linux-3.18.8/arch/arm/boot/dts/hifiberry-amp-overlay.dts linux-rpi/arch/arm/boot/dts/hifiberry-amp-overlay.dts
+--- linux-3.18.8/arch/arm/boot/dts/hifiberry-amp-overlay.dts 1970-01-01 01:00:00.000000000 +0100
++++ linux-rpi/arch/arm/boot/dts/hifiberry-amp-overlay.dts 2015-03-05 14:40:11.025715840 +0100
@@ -0,0 +1,39 @@
+// Definitions for HiFiBerry Amp/Amp+
+/dts-v1/;
@@ -688,9 +757,9 @@ diff -Nur linux-3.18.6/arch/arm/boot/dts/hifiberry-amp-overlay.dts linux-rpi/arc
+ };
+ };
+};
-diff -Nur linux-3.18.6/arch/arm/boot/dts/hifiberry-dac-overlay.dts linux-rpi/arch/arm/boot/dts/hifiberry-dac-overlay.dts
---- linux-3.18.6/arch/arm/boot/dts/hifiberry-dac-overlay.dts 1970-01-01 01:00:00.000000000 +0100
-+++ linux-rpi/arch/arm/boot/dts/hifiberry-dac-overlay.dts 2015-02-09 04:39:42.000000000 +0100
+diff -Nur linux-3.18.8/arch/arm/boot/dts/hifiberry-dac-overlay.dts linux-rpi/arch/arm/boot/dts/hifiberry-dac-overlay.dts
+--- linux-3.18.8/arch/arm/boot/dts/hifiberry-dac-overlay.dts 1970-01-01 01:00:00.000000000 +0100
++++ linux-rpi/arch/arm/boot/dts/hifiberry-dac-overlay.dts 2015-03-05 14:40:11.025715840 +0100
@@ -0,0 +1,34 @@
+// Definitions for HiFiBerry DAC
+/dts-v1/;
@@ -726,9 +795,9 @@ diff -Nur linux-3.18.6/arch/arm/boot/dts/hifiberry-dac-overlay.dts linux-rpi/arc
+ };
+ };
+};
-diff -Nur linux-3.18.6/arch/arm/boot/dts/hifiberry-dacplus-overlay.dts linux-rpi/arch/arm/boot/dts/hifiberry-dacplus-overlay.dts
---- linux-3.18.6/arch/arm/boot/dts/hifiberry-dacplus-overlay.dts 1970-01-01 01:00:00.000000000 +0100
-+++ linux-rpi/arch/arm/boot/dts/hifiberry-dacplus-overlay.dts 2015-02-09 04:39:42.000000000 +0100
+diff -Nur linux-3.18.8/arch/arm/boot/dts/hifiberry-dacplus-overlay.dts linux-rpi/arch/arm/boot/dts/hifiberry-dacplus-overlay.dts
+--- linux-3.18.8/arch/arm/boot/dts/hifiberry-dacplus-overlay.dts 1970-01-01 01:00:00.000000000 +0100
++++ linux-rpi/arch/arm/boot/dts/hifiberry-dacplus-overlay.dts 2015-03-05 14:40:11.025715840 +0100
@@ -0,0 +1,39 @@
+// Definitions for HiFiBerry DAC+
+/dts-v1/;
@@ -769,9 +838,9 @@ diff -Nur linux-3.18.6/arch/arm/boot/dts/hifiberry-dacplus-overlay.dts linux-rpi
+ };
+ };
+};
-diff -Nur linux-3.18.6/arch/arm/boot/dts/hifiberry-digi-overlay.dts linux-rpi/arch/arm/boot/dts/hifiberry-digi-overlay.dts
---- linux-3.18.6/arch/arm/boot/dts/hifiberry-digi-overlay.dts 1970-01-01 01:00:00.000000000 +0100
-+++ linux-rpi/arch/arm/boot/dts/hifiberry-digi-overlay.dts 2015-02-09 04:39:42.000000000 +0100
+diff -Nur linux-3.18.8/arch/arm/boot/dts/hifiberry-digi-overlay.dts linux-rpi/arch/arm/boot/dts/hifiberry-digi-overlay.dts
+--- linux-3.18.8/arch/arm/boot/dts/hifiberry-digi-overlay.dts 1970-01-01 01:00:00.000000000 +0100
++++ linux-rpi/arch/arm/boot/dts/hifiberry-digi-overlay.dts 2015-03-05 14:40:11.025715840 +0100
@@ -0,0 +1,39 @@
+// Definitions for HiFiBerry Digi
+/dts-v1/;
@@ -812,9 +881,293 @@ diff -Nur linux-3.18.6/arch/arm/boot/dts/hifiberry-digi-overlay.dts linux-rpi/ar
+ };
+ };
+};
-diff -Nur linux-3.18.6/arch/arm/boot/dts/iqaudio-dac-overlay.dts linux-rpi/arch/arm/boot/dts/iqaudio-dac-overlay.dts
---- linux-3.18.6/arch/arm/boot/dts/iqaudio-dac-overlay.dts 1970-01-01 01:00:00.000000000 +0100
-+++ linux-rpi/arch/arm/boot/dts/iqaudio-dac-overlay.dts 2015-02-09 04:39:42.000000000 +0100
+diff -Nur linux-3.18.8/arch/arm/boot/dts/hy28a-overlay.dts linux-rpi/arch/arm/boot/dts/hy28a-overlay.dts
+--- linux-3.18.8/arch/arm/boot/dts/hy28a-overlay.dts 1970-01-01 01:00:00.000000000 +0100
++++ linux-rpi/arch/arm/boot/dts/hy28a-overlay.dts 2015-03-05 14:40:11.025715840 +0100
+@@ -0,0 +1,87 @@
++/*
++ * Device Tree overlay for HY28A display
++ *
++ */
++
++/dts-v1/;
++/plugin/;
++
++/ {
++ compatible = "brcm,bcm2835", "brcm,bcm2708", "brcm,bcm2709";
++
++ fragment@0 {
++ target = <&spi0>;
++ __overlay__ {
++ status = "okay";
++
++ spidev@0{
++ status = "disabled";
++ };
++
++ spidev@1{
++ status = "disabled";
++ };
++ };
++ };
++
++ fragment@1 {
++ target = <&gpio>;
++ __overlay__ {
++ hy28a_pins: hy28a_pins {
++ brcm,pins = <17 25 18>;
++ brcm,function = <0 1 1>; /* in out out */
++ };
++ };
++ };
++
++ fragment@2 {
++ target = <&spi0>;
++ __overlay__ {
++ /* needed to avoid dtc warning */
++ #address-cells = <1>;
++ #size-cells = <0>;
++
++ hy28a: hy28a@0{
++ compatible = "ilitek,ili9320";
++ reg = <0>;
++ pinctrl-names = "default";
++ pinctrl-0 = <&hy28a_pins>;
++
++ spi-max-frequency = <32000000>;
++ spi-cpol;
++ spi-cpha;
++ rotate = <270>;
++ bgr;
++ fps = <50>;
++ buswidth = <8>;
++ startbyte = <0x70>;
++ reset-gpios = <&gpio 25 0>;
++ led-gpios = <&gpio 18 1>;
++ debug = <0>;
++ };
++
++ hy28a_ts: hy28a-ts@1 {
++ compatible = "ti,ads7846";
++ reg = <1>;
++
++ spi-max-frequency = <2000000>;
++ interrupts = <17 2>; /* high-to-low edge triggered */
++ interrupt-parent = <&gpio>;
++ pendown-gpio = <&gpio 17 0>;
++ ti,x-plate-ohms = /bits/ 16 <100>;
++ ti,pressure-max = /bits/ 16 <255>;
++ };
++ };
++ };
++ __overrides__ {
++ speed = <&hy28a>,"spi-max-frequency:0";
++ rotate = <&hy28a>,"rotate:0";
++ fps = <&hy28a>,"fps:0";
++ debug = <&hy28a>,"debug:0";
++ xohms = <&hy28a_ts>,"ti,x-plate-ohms;0";
++ resetgpio = <&hy28a>,"reset-gpios:4",
++ <&hy28a_pins>, "brcm,pins:1";
++ ledgpio = <&hy28a>,"led-gpios:4",
++ <&hy28a_pins>, "brcm,pins:2";
++ };
++};
+diff -Nur linux-3.18.8/arch/arm/boot/dts/hy28b-overlay.dts linux-rpi/arch/arm/boot/dts/hy28b-overlay.dts
+--- linux-3.18.8/arch/arm/boot/dts/hy28b-overlay.dts 1970-01-01 01:00:00.000000000 +0100
++++ linux-rpi/arch/arm/boot/dts/hy28b-overlay.dts 2015-03-05 14:40:11.025715840 +0100
+@@ -0,0 +1,142 @@
++/*
++ * Device Tree overlay for HY28b display shield by Texy
++ *
++ */
++
++/dts-v1/;
++/plugin/;
++
++/ {
++ compatible = "brcm,bcm2835", "brcm,bcm2708", "brcm,bcm2709";
++
++ fragment@0 {
++ target = <&spi0>;
++ __overlay__ {
++ status = "okay";
++
++ spidev@0{
++ status = "disabled";
++ };
++
++ spidev@1{
++ status = "disabled";
++ };
++ };
++ };
++
++ fragment@1 {
++ target = <&gpio>;
++ __overlay__ {
++ hy28b_pins: hy28b_pins {
++ brcm,pins = <17 25 18>;
++ brcm,function = <0 1 1>; /* in out out */
++ };
++ };
++ };
++
++ fragment@2 {
++ target = <&spi0>;
++ __overlay__ {
++ /* needed to avoid dtc warning */
++ #address-cells = <1>;
++ #size-cells = <0>;
++
++ hy28b: hy28b@0{
++ compatible = "ilitek,ili9325";
++ reg = <0>;
++ pinctrl-names = "default";
++ pinctrl-0 = <&hy28b_pins>;
++
++ spi-max-frequency = <48000000>;
++ spi-cpol;
++ spi-cpha;
++ rotate = <270>;
++ bgr;
++ fps = <50>;
++ buswidth = <8>;
++ startbyte = <0x70>;
++ reset-gpios = <&gpio 25 0>;
++ led-gpios = <&gpio 18 1>;
++
++ gamma = "04 1F 4 7 7 0 7 7 6 0\n0F 00 1 7 4 0 0 0 6 7";
++
++ init = <0x10000e7 0x0010
++ 0x1000000 0x0001
++ 0x1000001 0x0100
++ 0x1000002 0x0700
++ 0x1000003 0x1030
++ 0x1000004 0x0000
++ 0x1000008 0x0207
++ 0x1000009 0x0000
++ 0x100000a 0x0000
++ 0x100000c 0x0001
++ 0x100000d 0x0000
++ 0x100000f 0x0000
++ 0x1000010 0x0000
++ 0x1000011 0x0007
++ 0x1000012 0x0000
++ 0x1000013 0x0000
++ 0x2000032
++ 0x1000010 0x1590
++ 0x1000011 0x0227
++ 0x2000032
++ 0x1000012 0x009c
++ 0x2000032
++ 0x1000013 0x1900
++ 0x1000029 0x0023
++ 0x100002b 0x000e
++ 0x2000032
++ 0x1000020 0x0000
++ 0x1000021 0x0000
++ 0x2000032
++ 0x1000050 0x0000
++ 0x1000051 0x00ef
++ 0x1000052 0x0000
++ 0x1000053 0x013f
++ 0x1000060 0xa700
++ 0x1000061 0x0001
++ 0x100006a 0x0000
++ 0x1000080 0x0000
++ 0x1000081 0x0000
++ 0x1000082 0x0000
++ 0x1000083 0x0000
++ 0x1000084 0x0000
++ 0x1000085 0x0000
++ 0x1000090 0x0010
++ 0x1000092 0x0000
++ 0x1000093 0x0003
++ 0x1000095 0x0110
++ 0x1000097 0x0000
++ 0x1000098 0x0000
++ 0x1000007 0x0133
++ 0x1000020 0x0000
++ 0x1000021 0x0000
++ 0x2000064>;
++ debug = <0>;
++ };
++
++ hy28b_ts: hy28b-ts@1 {
++ compatible = "ti,ads7846";
++ reg = <1>;
++
++ spi-max-frequency = <2000000>;
++ interrupts = <17 2>; /* high-to-low edge triggered */
++ interrupt-parent = <&gpio>;
++ pendown-gpio = <&gpio 17 0>;
++ ti,x-plate-ohms = /bits/ 16 <100>;
++ ti,pressure-max = /bits/ 16 <255>;
++ };
++ };
++ };
++ __overrides__ {
++ speed = <&hy28b>,"spi-max-frequency:0";
++ rotate = <&hy28b>,"rotate:0";
++ fps = <&hy28b>,"fps:0";
++ debug = <&hy28b>,"debug:0";
++ xohms = <&hy28b_ts>,"ti,x-plate-ohms;0";
++ resetgpio = <&hy28b>,"reset-gpios:4",
++ <&hy28b_pins>, "brcm,pins:1";
++ ledgpio = <&hy28b>,"led-gpios:4",
++ <&hy28b_pins>, "brcm,pins:2";
++ };
++};
+diff -Nur linux-3.18.8/arch/arm/boot/dts/i2c-rtc-overlay.dts linux-rpi/arch/arm/boot/dts/i2c-rtc-overlay.dts
+--- linux-3.18.8/arch/arm/boot/dts/i2c-rtc-overlay.dts 1970-01-01 01:00:00.000000000 +0100
++++ linux-rpi/arch/arm/boot/dts/i2c-rtc-overlay.dts 2015-03-05 14:40:11.025715840 +0100
+@@ -0,0 +1,43 @@
++// Definitions for several I2C based Real Time Clocks
++/dts-v1/;
++/plugin/;
++
++/ {
++ compatible = "brcm,bcm2708";
++
++ fragment@0 {
++ target = <&i2c1>;
++ __overlay__ {
++ #address-cells = <1>;
++ #size-cells = <0>;
++ status = "okay";
++
++ ds1307: ds1307@68 {
++ compatible = "maxim,ds1307";
++ reg = <0x68>;
++ status = "disable";
++ };
++ ds3231: ds3231@68 {
++ compatible = "maxim,ds3231";
++ reg = <0x68>;
++ status = "disable";
++ };
++ pcf2127: pcf2127@51 {
++ compatible = "nxp,pcf2127";
++ reg = <0x51>;
++ status = "disable";
++ };
++ pcf8523: pcf8523@68 {
++ compatible = "nxp,pcf8523";
++ reg = <0x68>;
++ status = "disable";
++ };
++ };
++ };
++ __overrides__ {
++ ds1307 = <&ds1307>,"status";
++ ds3231 = <&ds3231>,"status";
++ pcf2127 = <&pcf2127>,"status";
++ pcf8523 = <&pcf8523>,"status";
++ };
++};
+diff -Nur linux-3.18.8/arch/arm/boot/dts/iqaudio-dac-overlay.dts linux-rpi/arch/arm/boot/dts/iqaudio-dac-overlay.dts
+--- linux-3.18.8/arch/arm/boot/dts/iqaudio-dac-overlay.dts 1970-01-01 01:00:00.000000000 +0100
++++ linux-rpi/arch/arm/boot/dts/iqaudio-dac-overlay.dts 2015-03-05 14:40:11.061715840 +0100
@@ -0,0 +1,39 @@
+// Definitions for IQaudIO DAC
+/dts-v1/;
@@ -855,9 +1208,9 @@ diff -Nur linux-3.18.6/arch/arm/boot/dts/iqaudio-dac-overlay.dts linux-rpi/arch/
+ };
+ };
+};
-diff -Nur linux-3.18.6/arch/arm/boot/dts/iqaudio-dacplus-overlay.dts linux-rpi/arch/arm/boot/dts/iqaudio-dacplus-overlay.dts
---- linux-3.18.6/arch/arm/boot/dts/iqaudio-dacplus-overlay.dts 1970-01-01 01:00:00.000000000 +0100
-+++ linux-rpi/arch/arm/boot/dts/iqaudio-dacplus-overlay.dts 2015-02-09 04:39:42.000000000 +0100
+diff -Nur linux-3.18.8/arch/arm/boot/dts/iqaudio-dacplus-overlay.dts linux-rpi/arch/arm/boot/dts/iqaudio-dacplus-overlay.dts
+--- linux-3.18.8/arch/arm/boot/dts/iqaudio-dacplus-overlay.dts 1970-01-01 01:00:00.000000000 +0100
++++ linux-rpi/arch/arm/boot/dts/iqaudio-dacplus-overlay.dts 2015-03-05 14:40:11.061715840 +0100
@@ -0,0 +1,39 @@
+// Definitions for IQaudIO DAC+
+/dts-v1/;
@@ -898,9 +1251,9 @@ diff -Nur linux-3.18.6/arch/arm/boot/dts/iqaudio-dacplus-overlay.dts linux-rpi/a
+ };
+ };
+};
-diff -Nur linux-3.18.6/arch/arm/boot/dts/lirc-rpi-overlay.dts linux-rpi/arch/arm/boot/dts/lirc-rpi-overlay.dts
---- linux-3.18.6/arch/arm/boot/dts/lirc-rpi-overlay.dts 1970-01-01 01:00:00.000000000 +0100
-+++ linux-rpi/arch/arm/boot/dts/lirc-rpi-overlay.dts 2015-02-09 04:39:42.000000000 +0100
+diff -Nur linux-3.18.8/arch/arm/boot/dts/lirc-rpi-overlay.dts linux-rpi/arch/arm/boot/dts/lirc-rpi-overlay.dts
+--- linux-3.18.8/arch/arm/boot/dts/lirc-rpi-overlay.dts 1970-01-01 01:00:00.000000000 +0100
++++ linux-rpi/arch/arm/boot/dts/lirc-rpi-overlay.dts 2015-03-05 14:40:11.065715840 +0100
@@ -0,0 +1,57 @@
+// Definitions for lirc-rpi module
+/dts-v1/;
@@ -959,10 +1312,10 @@ diff -Nur linux-3.18.6/arch/arm/boot/dts/lirc-rpi-overlay.dts linux-rpi/arch/arm
+ debug = <&lirc_rpi>,"rpi,debug:0";
+ };
+};
-diff -Nur linux-3.18.6/arch/arm/boot/dts/Makefile linux-rpi/arch/arm/boot/dts/Makefile
---- linux-3.18.6/arch/arm/boot/dts/Makefile 2015-02-06 15:53:48.000000000 +0100
-+++ linux-rpi/arch/arm/boot/dts/Makefile 2015-02-09 04:39:42.000000000 +0100
-@@ -53,7 +53,32 @@
+diff -Nur linux-3.18.8/arch/arm/boot/dts/Makefile linux-rpi/arch/arm/boot/dts/Makefile
+--- linux-3.18.8/arch/arm/boot/dts/Makefile 2015-02-27 02:49:36.000000000 +0100
++++ linux-rpi/arch/arm/boot/dts/Makefile 2015-03-05 14:40:11.017715840 +0100
+@@ -53,7 +53,41 @@
dtb-$(CONFIG_ARCH_ATLAS6) += atlas6-evb.dtb
dtb-$(CONFIG_ARCH_AXXIA) += axm5516-amarillo.dtb
@@ -977,25 +1330,34 @@ diff -Nur linux-3.18.6/arch/arm/boot/dts/Makefile linux-rpi/arch/arm/boot/dts/Ma
+dtb-$(CONFIG_BCM2708_DT) += bcm2708-rpi-b.dtb
+dtb-$(CONFIG_BCM2708_DT) += bcm2708-rpi-b-plus.dtb
+dtb-$(CONFIG_BCM2709_DT) += bcm2709-rpi-2-b.dtb
++dtb-$(RPI_DT_OVERLAYS) += bmp085_i2c-sensor-overlay.dtb
+dtb-$(RPI_DT_OVERLAYS) += ds1307-rtc-overlay.dtb
++dtb-$(RPI_DT_OVERLAYS) += enc28j60-overlay.dtb
++dtb-$(RPI_DT_OVERLAYS) += i2c-rtc-overlay.dtb
+dtb-$(RPI_DT_OVERLAYS) += hifiberry-dac-overlay.dtb
+dtb-$(RPI_DT_OVERLAYS) += hifiberry-dacplus-overlay.dtb
+dtb-$(RPI_DT_OVERLAYS) += hifiberry-digi-overlay.dtb
+dtb-$(RPI_DT_OVERLAYS) += hifiberry-amp-overlay.dtb
++dtb-$(RPI_DT_OVERLAYS) += hy28a-overlay.dtb
++dtb-$(RPI_DT_OVERLAYS) += hy28b-overlay.dtb
+dtb-$(RPI_DT_OVERLAYS) += iqaudio-dac-overlay.dtb
+dtb-$(RPI_DT_OVERLAYS) += iqaudio-dacplus-overlay.dtb
+dtb-$(RPI_DT_OVERLAYS) += lirc-rpi-overlay.dtb
+dtb-$(RPI_DT_OVERLAYS) += pcf2127-rtc-overlay.dtb
+dtb-$(RPI_DT_OVERLAYS) += pcf8523-rtc-overlay.dtb
++dtb-$(RPI_DT_OVERLAYS) += piscreen-overlay.dtb
+dtb-$(RPI_DT_OVERLAYS) += pps-gpio-overlay.dtb
++dtb-$(RPI_DT_OVERLAYS) += rpi-display-overlay.dtb
+dtb-$(RPI_DT_OVERLAYS) += w1-gpio-overlay.dtb
+dtb-$(RPI_DT_OVERLAYS) += w1-gpio-pullup-overlay.dtb
++dtb-$(RPI_DT_OVERLAYS) += spi-bcm2835-overlay.dtb
++dtb-$(RPI_DT_OVERLAYS) += mcp2515-can0-overlay.dtb
dtb-$(CONFIG_ARCH_BCM2835) += bcm2835-rpi-b.dtb
+
dtb-$(CONFIG_ARCH_BCM_5301X) += bcm4708-netgear-r6250.dtb
dtb-$(CONFIG_ARCH_BCM_63XX) += bcm963138dvt.dtb
dtb-$(CONFIG_ARCH_BCM_MOBILE) += bcm28155-ap.dtb \
-@@ -519,6 +544,12 @@
+@@ -519,6 +553,12 @@
targets += dtbs dtbs_install
targets += $(dtb-y)
@@ -1008,9 +1370,82 @@ diff -Nur linux-3.18.6/arch/arm/boot/dts/Makefile linux-rpi/arch/arm/boot/dts/Ma
endif
# *.dtb used to be generated in the directory above. Clean out the
-diff -Nur linux-3.18.6/arch/arm/boot/dts/pcf2127-rtc-overlay.dts linux-rpi/arch/arm/boot/dts/pcf2127-rtc-overlay.dts
---- linux-3.18.6/arch/arm/boot/dts/pcf2127-rtc-overlay.dts 1970-01-01 01:00:00.000000000 +0100
-+++ linux-rpi/arch/arm/boot/dts/pcf2127-rtc-overlay.dts 2015-02-09 04:39:42.000000000 +0100
+diff -Nur linux-3.18.8/arch/arm/boot/dts/mcp2515-can0-overlay.dts linux-rpi/arch/arm/boot/dts/mcp2515-can0-overlay.dts
+--- linux-3.18.8/arch/arm/boot/dts/mcp2515-can0-overlay.dts 1970-01-01 01:00:00.000000000 +0100
++++ linux-rpi/arch/arm/boot/dts/mcp2515-can0-overlay.dts 2015-03-05 14:40:11.065715840 +0100
+@@ -0,0 +1,69 @@
++/*
++ * Device tree overlay for mcp251x/can0 on spi0.0
++ */
++
++/dts-v1/;
++/plugin/;
++
++/ {
++ compatible = "brcm,bcm2835", "brcm,bcm2836", "brcm,bcm2708", "brcm,bcm2709";
++ /* disable spi-dev for spi0.0 */
++ fragment@0 {
++ target = <&spi0>;
++ __overlay__ {
++ status = "okay";
++ spidev@0{
++ status = "disabled";
++ };
++ };
++ };
++
++ /* the interrupt pin of the can-controller */
++ fragment@1 {
++ target = <&gpio>;
++ __overlay__ {
++ can0_pins: can0_pins {
++ brcm,pins = <25>;
++ brcm,function = <0>; /* input */
++ };
++ };
++ };
++
++ /* the clock/oscillator of the can-controller */
++ fragment@2 {
++ target-path = "/clocks";
++ __overlay__ {
++ /* external oscillator of mcp2515 on SPI0.0 */
++ can0_osc: can0_osc {
++ compatible = "fixed-clock";
++ #clock-cells = <0>;
++ clock-frequency = <16000000>;
++ };
++ };
++ };
++
++ /* the spi config of the can-controller itself binding everything together */
++ fragment@3 {
++ target = <&spi0>;
++ __overlay__ {
++ /* needed to avoid dtc warning */
++ #address-cells = <1>;
++ #size-cells = <0>;
++ can0: mcp2515@0 {
++ reg = <0>;
++ compatible = "microchip,mcp2515";
++ pinctrl-names = "default";
++ pinctrl-0 = <&can0_pins>;
++ spi-max-frequency = <10000000>;
++ interrupt-parent = <&gpio>;
++ interrupts = <25 0x2>;
++ clocks = <&can0_osc>;
++ };
++ };
++ };
++ __overrides__ {
++ oscillator = <&can0_osc>,"oscillator-frequency";
++ spimaxfrequency = <&can0>,"spi-max-frequency:0";
++ interrupt = <&can0_pins>,"brcm,pins:0",<&can0>,"interrupts:0";
++ };
++};
+diff -Nur linux-3.18.8/arch/arm/boot/dts/pcf2127-rtc-overlay.dts linux-rpi/arch/arm/boot/dts/pcf2127-rtc-overlay.dts
+--- linux-3.18.8/arch/arm/boot/dts/pcf2127-rtc-overlay.dts 1970-01-01 01:00:00.000000000 +0100
++++ linux-rpi/arch/arm/boot/dts/pcf2127-rtc-overlay.dts 2015-03-05 14:40:11.069715840 +0100
@@ -0,0 +1,22 @@
+// Definitions for PCF2127 Real Time Clock
+/dts-v1/;
@@ -1034,9 +1469,9 @@ diff -Nur linux-3.18.6/arch/arm/boot/dts/pcf2127-rtc-overlay.dts linux-rpi/arch/
+ };
+ };
+};
-diff -Nur linux-3.18.6/arch/arm/boot/dts/pcf8523-rtc-overlay.dts linux-rpi/arch/arm/boot/dts/pcf8523-rtc-overlay.dts
---- linux-3.18.6/arch/arm/boot/dts/pcf8523-rtc-overlay.dts 1970-01-01 01:00:00.000000000 +0100
-+++ linux-rpi/arch/arm/boot/dts/pcf8523-rtc-overlay.dts 2015-02-09 04:39:42.000000000 +0100
+diff -Nur linux-3.18.8/arch/arm/boot/dts/pcf8523-rtc-overlay.dts linux-rpi/arch/arm/boot/dts/pcf8523-rtc-overlay.dts
+--- linux-3.18.8/arch/arm/boot/dts/pcf8523-rtc-overlay.dts 1970-01-01 01:00:00.000000000 +0100
++++ linux-rpi/arch/arm/boot/dts/pcf8523-rtc-overlay.dts 2015-03-05 14:40:11.069715840 +0100
@@ -0,0 +1,22 @@
+// Definitions for PCF8523 Real Time Clock
+/dts-v1/;
@@ -1060,9 +1495,107 @@ diff -Nur linux-3.18.6/arch/arm/boot/dts/pcf8523-rtc-overlay.dts linux-rpi/arch/
+ };
+ };
+};
-diff -Nur linux-3.18.6/arch/arm/boot/dts/pps-gpio-overlay.dts linux-rpi/arch/arm/boot/dts/pps-gpio-overlay.dts
---- linux-3.18.6/arch/arm/boot/dts/pps-gpio-overlay.dts 1970-01-01 01:00:00.000000000 +0100
-+++ linux-rpi/arch/arm/boot/dts/pps-gpio-overlay.dts 2015-02-09 04:39:42.000000000 +0100
+diff -Nur linux-3.18.8/arch/arm/boot/dts/piscreen-overlay.dts linux-rpi/arch/arm/boot/dts/piscreen-overlay.dts
+--- linux-3.18.8/arch/arm/boot/dts/piscreen-overlay.dts 1970-01-01 01:00:00.000000000 +0100
++++ linux-rpi/arch/arm/boot/dts/piscreen-overlay.dts 2015-03-05 14:40:11.069715840 +0100
+@@ -0,0 +1,94 @@
++/*
++ * Device Tree overlay for PiScreen 3.5" display shield by Ozzmaker
++ *
++ */
++
++/dts-v1/;
++/plugin/;
++
++/ {
++ compatible = "brcm,bcm2835", "brcm,bcm2708", "brcm,bcm2709";
++
++ fragment@0 {
++ target = <&spi0>;
++ __overlay__ {
++ status = "okay";
++
++ spidev@0{
++ status = "disabled";
++ };
++
++ spidev@1{
++ status = "disabled";
++ };
++ };
++ };
++
++ fragment@1 {
++ target = <&gpio>;
++ __overlay__ {
++ piscreen_pins: piscreen_pins {
++ brcm,pins = <17 25 24 22>;
++ brcm,function = <0 1 1 1>; /* in out out out */
++ };
++ };
++ };
++
++ fragment@2 {
++ target = <&spi0>;
++ __overlay__ {
++ /* needed to avoid dtc warning */
++ #address-cells = <1>;
++ #size-cells = <0>;
++
++ piscreen: piscreen@0{
++ compatible = "ilitek,ili9486";
++ reg = <0>;
++ pinctrl-names = "default";
++ pinctrl-0 = <&piscreen_pins>;
++
++ spi-max-frequency = <32000000>;
++ rotate = <270>;
++ bgr;
++ fps = <30>;
++ buswidth = <8>;
++ regwidth = <16>;
++ reset-gpios = <&gpio 25 0>;
++ dc-gpios = <&gpio 24 0>;
++ led-gpios = <&gpio 22 1>;
++ debug = <0>;
++
++ init = <0x10000b0 0x00
++ 0x1000011
++ 0x20000ff
++ 0x100003a 0x55
++ 0x1000036 0x28
++ 0x10000c2 0x44
++ 0x10000c5 0x00 0x00 0x00 0x00
++ 0x10000e0 0x0f 0x1f 0x1c 0x0c 0x0f 0x08 0x48 0x98 0x37 0x0a 0x13 0x04 0x11 0x0d 0x00
++ 0x10000e1 0x0f 0x32 0x2e 0x0b 0x0d 0x05 0x47 0x75 0x37 0x06 0x10 0x03 0x24 0x20 0x00
++ 0x10000e2 0x0f 0x32 0x2e 0x0b 0x0d 0x05 0x47 0x75 0x37 0x06 0x10 0x03 0x24 0x20 0x00
++ 0x1000011
++ 0x1000029>;
++ };
++
++ piscreen-ts@1 {
++ compatible = "ti,ads7846";
++ reg = <1>;
++
++ spi-max-frequency = <2000000>;
++ interrupts = <17 2>; /* high-to-low edge triggered */
++ interrupt-parent = <&gpio>;
++ pendown-gpio = <&gpio 17 0>;
++ ti,x-plate-ohms = /bits/ 16 <100>;
++ ti,pressure-max = /bits/ 16 <255>;
++ };
++ };
++ };
++ __overrides__ {
++ speed = <&piscreen>,"spi-max-frequency:0";
++ rotate = <&piscreen>,"rotate:0";
++ fps = <&piscreen>,"fps:0";
++ debug = <&piscreen>,"debug:0";
++ };
++};
+diff -Nur linux-3.18.8/arch/arm/boot/dts/pps-gpio-overlay.dts linux-rpi/arch/arm/boot/dts/pps-gpio-overlay.dts
+--- linux-3.18.8/arch/arm/boot/dts/pps-gpio-overlay.dts 1970-01-01 01:00:00.000000000 +0100
++++ linux-rpi/arch/arm/boot/dts/pps-gpio-overlay.dts 2015-03-05 14:40:11.069715840 +0100
@@ -0,0 +1,34 @@
+/dts-v1/;
+/plugin/;
@@ -1098,9 +1631,116 @@ diff -Nur linux-3.18.6/arch/arm/boot/dts/pps-gpio-overlay.dts linux-rpi/arch/arm
+ <&pps_pins>,"brcm,pins:0";
+ };
+};
-diff -Nur linux-3.18.6/arch/arm/boot/dts/w1-gpio-overlay.dts linux-rpi/arch/arm/boot/dts/w1-gpio-overlay.dts
---- linux-3.18.6/arch/arm/boot/dts/w1-gpio-overlay.dts 1970-01-01 01:00:00.000000000 +0100
-+++ linux-rpi/arch/arm/boot/dts/w1-gpio-overlay.dts 2015-02-09 04:39:42.000000000 +0100
+diff -Nur linux-3.18.8/arch/arm/boot/dts/rpi-display-overlay.dts linux-rpi/arch/arm/boot/dts/rpi-display-overlay.dts
+--- linux-3.18.8/arch/arm/boot/dts/rpi-display-overlay.dts 1970-01-01 01:00:00.000000000 +0100
++++ linux-rpi/arch/arm/boot/dts/rpi-display-overlay.dts 2015-03-05 14:40:11.069715840 +0100
+@@ -0,0 +1,81 @@
++/*
++ * Device Tree overlay for rpi-display by Watterott
++ *
++ */
++
++/dts-v1/;
++/plugin/;
++
++/ {
++ compatible = "brcm,bcm2835", "brcm,bcm2708", "brcm,bcm2709";
++
++ fragment@0 {
++ target = <&spi0>;
++ __overlay__ {
++ status = "okay";
++
++ spidev@0{
++ status = "disabled";
++ };
++
++ spidev@1{
++ status = "disabled";
++ };
++ };
++ };
++
++ fragment@1 {
++ target = <&gpio>;
++ __overlay__ {
++ rpi_display_pins: rpi_display_pins {
++ brcm,pins = <18 23 24 25>;
++ brcm,function = <1 1 1 0>; /* out out out in */
++ };
++ };
++ };
++
++ fragment@2 {
++ target = <&spi0>;
++ __overlay__ {
++ /* needed to avoid dtc warning */
++ #address-cells = <1>;
++ #size-cells = <0>;
++
++ rpidisplay: rpi-display@0{
++ compatible = "ilitek,ili9341";
++ reg = <0>;
++ pinctrl-names = "default";
++ pinctrl-0 = <&rpi_display_pins>;
++
++ spi-max-frequency = <32000000>;
++ rotate = <270>;
++ bgr;
++ fps = <30>;
++ buswidth = <8>;
++ reset-gpios = <&gpio 23 0>;
++ dc-gpios = <&gpio 24 0>;
++ led-gpios = <&gpio 18 1>;
++ debug = <0>;
++ };
++
++ rpidisplay_ts: rpi-display-ts@1 {
++ compatible = "ti,ads7846";
++ reg = <1>;
++
++ spi-max-frequency = <2000000>;
++ interrupts = <25 2>; /* high-to-low edge triggered */
++ interrupt-parent = <&gpio>;
++ pendown-gpio = <&gpio 25 0>;
++ ti,x-plate-ohms = /bits/ 16 <60>;
++ ti,pressure-max = /bits/ 16 <255>;
++ };
++ };
++ };
++ __overrides__ {
++ speed = <&rpidisplay>,"spi-max-frequency:0";
++ rotate = <&rpidisplay>,"rotate:0";
++ fps = <&rpidisplay>,"fps:0";
++ debug = <&rpidisplay>,"debug:0";
++ xohms = <&rpidisplay_ts>,"ti,x-plate-ohms;0";
++ };
++};
+diff -Nur linux-3.18.8/arch/arm/boot/dts/spi-bcm2835-overlay.dts linux-rpi/arch/arm/boot/dts/spi-bcm2835-overlay.dts
+--- linux-3.18.8/arch/arm/boot/dts/spi-bcm2835-overlay.dts 1970-01-01 01:00:00.000000000 +0100
++++ linux-rpi/arch/arm/boot/dts/spi-bcm2835-overlay.dts 2015-03-05 14:40:11.073715840 +0100
+@@ -0,0 +1,18 @@
++/*
++ * Device tree overlay for spi-bcm2835
++ */
++
++/dts-v1/;
++/plugin/;
++
++/ {
++ compatible = "brcm,bcm2835", "brcm,bcm2836", "brcm,bcm2708", "brcm,bcm2709";
++ /* setting up compatiblity to allow loading the spi-bcm2835 driver */
++ fragment@0 {
++ target = <&spi0>;
++ __overlay__ {
++ status = "okay";
++ compatible = "brcm,bcm2835-spi";
++ };
++ };
++};
+diff -Nur linux-3.18.8/arch/arm/boot/dts/w1-gpio-overlay.dts linux-rpi/arch/arm/boot/dts/w1-gpio-overlay.dts
+--- linux-3.18.8/arch/arm/boot/dts/w1-gpio-overlay.dts 1970-01-01 01:00:00.000000000 +0100
++++ linux-rpi/arch/arm/boot/dts/w1-gpio-overlay.dts 2015-03-05 14:40:11.081715840 +0100
@@ -0,0 +1,39 @@
+// Definitions for w1-gpio module (without external pullup)
+/dts-v1/;
@@ -1141,9 +1781,9 @@ diff -Nur linux-3.18.6/arch/arm/boot/dts/w1-gpio-overlay.dts linux-rpi/arch/arm/
+ pullup = <&w1>,"rpi,parasitic-power:0";
+ };
+};
-diff -Nur linux-3.18.6/arch/arm/boot/dts/w1-gpio-pullup-overlay.dts linux-rpi/arch/arm/boot/dts/w1-gpio-pullup-overlay.dts
---- linux-3.18.6/arch/arm/boot/dts/w1-gpio-pullup-overlay.dts 1970-01-01 01:00:00.000000000 +0100
-+++ linux-rpi/arch/arm/boot/dts/w1-gpio-pullup-overlay.dts 2015-02-09 04:39:42.000000000 +0100
+diff -Nur linux-3.18.8/arch/arm/boot/dts/w1-gpio-pullup-overlay.dts linux-rpi/arch/arm/boot/dts/w1-gpio-pullup-overlay.dts
+--- linux-3.18.8/arch/arm/boot/dts/w1-gpio-pullup-overlay.dts 1970-01-01 01:00:00.000000000 +0100
++++ linux-rpi/arch/arm/boot/dts/w1-gpio-pullup-overlay.dts 2015-03-05 14:40:11.081715840 +0100
@@ -0,0 +1,41 @@
+// Definitions for w1-gpio module (with external pullup)
+/dts-v1/;
@@ -1186,10 +1826,10 @@ diff -Nur linux-3.18.6/arch/arm/boot/dts/w1-gpio-pullup-overlay.dts linux-rpi/ar
+ pullup = <&w1>,"rpi,parasitic-power:0";
+ };
+};
-diff -Nur linux-3.18.6/arch/arm/configs/bcm2709_defconfig linux-rpi/arch/arm/configs/bcm2709_defconfig
---- linux-3.18.6/arch/arm/configs/bcm2709_defconfig 1970-01-01 01:00:00.000000000 +0100
-+++ linux-rpi/arch/arm/configs/bcm2709_defconfig 2015-02-09 04:39:42.000000000 +0100
-@@ -0,0 +1,1157 @@
+diff -Nur linux-3.18.8/arch/arm/configs/bcm2709_defconfig linux-rpi/arch/arm/configs/bcm2709_defconfig
+--- linux-3.18.8/arch/arm/configs/bcm2709_defconfig 1970-01-01 01:00:00.000000000 +0100
++++ linux-rpi/arch/arm/configs/bcm2709_defconfig 2015-03-05 14:40:11.085715840 +0100
+@@ -0,0 +1,1193 @@
+# CONFIG_ARM_PATCH_PHYS_VIRT is not set
+CONFIG_PHYS_OFFSET=0
+CONFIG_LOCALVERSION="-v7"
@@ -1247,7 +1887,6 @@ diff -Nur linux-3.18.6/arch/arm/configs/bcm2709_defconfig linux-rpi/arch/arm/con
+CONFIG_ZBOOT_ROM_TEXT=0x0
+CONFIG_ZBOOT_ROM_BSS=0x0
+CONFIG_CMDLINE="console=ttyAMA0,115200 kgdboc=ttyAMA0,115200 root=/dev/mmcblk0p2 rootfstype=ext4 rootwait"
-+CONFIG_KEXEC=y
+CONFIG_CPU_FREQ=y
+CONFIG_CPU_FREQ_STAT=m
+CONFIG_CPU_FREQ_STAT_DETAILS=y
@@ -1256,11 +1895,11 @@ diff -Nur linux-3.18.6/arch/arm/configs/bcm2709_defconfig linux-rpi/arch/arm/con
+CONFIG_CPU_FREQ_GOV_USERSPACE=y
+CONFIG_CPU_FREQ_GOV_ONDEMAND=y
+CONFIG_CPU_FREQ_GOV_CONSERVATIVE=y
-+CONFIG_CPU_IDLE=y
+CONFIG_VFP=y
+CONFIG_NEON=y
+CONFIG_KERNEL_MODE_NEON=y
+CONFIG_BINFMT_MISC=m
++# CONFIG_SUSPEND is not set
+CONFIG_NET=y
+CONFIG_PACKET=y
+CONFIG_UNIX=y
@@ -1474,6 +2113,7 @@ diff -Nur linux-3.18.6/arch/arm/configs/bcm2709_defconfig linux-rpi/arch/arm/con
+CONFIG_VLAN_8021Q=m
+CONFIG_VLAN_8021Q_GVRP=y
+CONFIG_ATALK=m
++CONFIG_6LOWPAN=m
+CONFIG_NET_SCHED=y
+CONFIG_NET_SCH_CBQ=m
+CONFIG_NET_SCH_HTB=m
@@ -1537,6 +2177,9 @@ diff -Nur linux-3.18.6/arch/arm/configs/bcm2709_defconfig linux-rpi/arch/arm/con
+CONFIG_BAYCOM_SER_FDX=m
+CONFIG_BAYCOM_SER_HDX=m
+CONFIG_YAM=m
++CONFIG_CAN=m
++CONFIG_CAN_VCAN=m
++CONFIG_CAN_MCP251X=m
+CONFIG_IRDA=m
+CONFIG_IRLAN=m
+CONFIG_IRNET=m
@@ -1552,6 +2195,7 @@ diff -Nur linux-3.18.6/arch/arm/configs/bcm2709_defconfig linux-rpi/arch/arm/con
+CONFIG_SIGMATEL_FIR=m
+CONFIG_MCS_FIR=m
+CONFIG_BT=m
++CONFIG_BT_6LOWPAN=m
+CONFIG_BT_RFCOMM=m
+CONFIG_BT_RFCOMM_TTY=y
+CONFIG_BT_BNEP=m
@@ -1586,6 +2230,7 @@ diff -Nur linux-3.18.6/arch/arm/configs/bcm2709_defconfig linux-rpi/arch/arm/con
+CONFIG_BLK_DEV_NBD=m
+CONFIG_BLK_DEV_RAM=y
+CONFIG_CDROM_PKTCDVD=m
++CONFIG_ATA_OVER_ETH=m
+CONFIG_EEPROM_AT24=m
+CONFIG_SCSI=y
+# CONFIG_SCSI_PROC_FS is not set
@@ -1719,6 +2364,8 @@ diff -Nur linux-3.18.6/arch/arm/configs/bcm2709_defconfig linux-rpi/arch/arm/con
+CONFIG_JOYSTICK_XPAD_FF=y
+CONFIG_INPUT_TOUCHSCREEN=y
+CONFIG_TOUCHSCREEN_ADS7846=m
++CONFIG_TOUCHSCREEN_EGALAX=m
++CONFIG_TOUCHSCREEN_USB_COMPOSITE=m
+CONFIG_INPUT_MISC=y
+CONFIG_INPUT_AD714X=m
+CONFIG_INPUT_ATI_REMOTE2=m
@@ -1752,6 +2399,7 @@ diff -Nur linux-3.18.6/arch/arm/configs/bcm2709_defconfig linux-rpi/arch/arm/con
+CONFIG_I2C_MUX=m
+CONFIG_I2C_BCM2708=m
+CONFIG_SPI=y
++CONFIG_SPI_BCM2835=m
+CONFIG_SPI_BCM2708=m
+CONFIG_SPI_SPIDEV=y
+CONFIG_PPS=m
@@ -2208,6 +2856,34 @@ diff -Nur linux-3.18.6/arch/arm/configs/bcm2709_defconfig linux-rpi/arch/arm/con
+CONFIG_LIRC_RPI=m
+CONFIG_LIRC_SASEM=m
+CONFIG_LIRC_SERIAL=m
++CONFIG_FB_TFT=m
++CONFIG_FB_TFT_AGM1264K_FL=m
++CONFIG_FB_TFT_BD663474=m
++CONFIG_FB_TFT_HX8340BN=m
++CONFIG_FB_TFT_HX8347D=m
++CONFIG_FB_TFT_HX8353D=m
++CONFIG_FB_TFT_ILI9320=m
++CONFIG_FB_TFT_ILI9325=m
++CONFIG_FB_TFT_ILI9340=m
++CONFIG_FB_TFT_ILI9341=m
++CONFIG_FB_TFT_ILI9481=m
++CONFIG_FB_TFT_ILI9486=m
++CONFIG_FB_TFT_PCD8544=m
++CONFIG_FB_TFT_RA8875=m
++CONFIG_FB_TFT_S6D02A1=m
++CONFIG_FB_TFT_S6D1121=m
++CONFIG_FB_TFT_SSD1289=m
++CONFIG_FB_TFT_SSD1306=m
++CONFIG_FB_TFT_SSD1331=m
++CONFIG_FB_TFT_SSD1351=m
++CONFIG_FB_TFT_ST7735R=m
++CONFIG_FB_TFT_TINYLCD=m
++CONFIG_FB_TFT_TLS8204=m
++CONFIG_FB_TFT_UC1701=m
++CONFIG_FB_TFT_UPD161704=m
++CONFIG_FB_TFT_WATTEROTT=m
++CONFIG_FB_FLEX=m
++CONFIG_FB_TFT_FBTFT_DEVICE=m
+# CONFIG_IOMMU_SUPPORT is not set
+CONFIG_EXTCON=m
+CONFIG_EXTCON_ARIZONA=m
@@ -2347,388 +3023,10 @@ diff -Nur linux-3.18.6/arch/arm/configs/bcm2709_defconfig linux-rpi/arch/arm/con
+# CONFIG_CRYPTO_HW is not set
+CONFIG_CRC_ITU_T=y
+CONFIG_LIBCRC32C=y
-diff -Nur linux-3.18.6/arch/arm/configs/bcm2709_sdcard_defconfig linux-rpi/arch/arm/configs/bcm2709_sdcard_defconfig
---- linux-3.18.6/arch/arm/configs/bcm2709_sdcard_defconfig 1970-01-01 01:00:00.000000000 +0100
-+++ linux-rpi/arch/arm/configs/bcm2709_sdcard_defconfig 2015-02-09 04:39:42.000000000 +0100
-@@ -0,0 +1,129 @@
-+# CONFIG_ARM_PATCH_PHYS_VIRT is not set
-+CONFIG_PHYS_OFFSET=0x0
-+CONFIG_LOCALVERSION="-sdcard"
-+# CONFIG_LOCALVERSION_AUTO is not set
-+# CONFIG_SWAP is not set
-+CONFIG_SYSVIPC=y
-+CONFIG_POSIX_MQUEUE=y
-+CONFIG_FHANDLE=y
-+CONFIG_AUDIT=y
-+CONFIG_NO_HZ=y
-+CONFIG_HIGH_RES_TIMERS=y
-+CONFIG_BSD_PROCESS_ACCT=y
-+CONFIG_BSD_PROCESS_ACCT_V3=y
-+CONFIG_TASKSTATS=y
-+CONFIG_TASK_DELAY_ACCT=y
-+CONFIG_TASK_XACCT=y
-+CONFIG_TASK_IO_ACCOUNTING=y
-+CONFIG_IKCONFIG=y
-+CONFIG_IKCONFIG_PROC=y
-+CONFIG_CGROUP_FREEZER=y
-+CONFIG_CGROUP_DEVICE=y
-+CONFIG_CGROUP_CPUACCT=y
-+CONFIG_RESOURCE_COUNTERS=y
-+CONFIG_MEMCG=y
-+CONFIG_BLK_CGROUP=y
-+CONFIG_NAMESPACES=y
-+CONFIG_SCHED_AUTOGROUP=y
-+CONFIG_RELAY=y
-+CONFIG_BLK_DEV_INITRD=y
-+CONFIG_EMBEDDED=y
-+# CONFIG_PERF_EVENTS is not set
-+# CONFIG_COMPAT_BRK is not set
-+CONFIG_PROFILING=y
-+CONFIG_JUMP_LABEL=y
-+CONFIG_BLK_DEV_BSGLIB=y
-+CONFIG_BLK_DEV_THROTTLING=y
-+CONFIG_CFQ_GROUP_IOSCHED=y
-+CONFIG_ARCH_BCM2709=y
-+# CONFIG_CACHE_L2X0 is not set
-+CONFIG_SMP=y
-+CONFIG_HAVE_ARM_ARCH_TIMER=y
-+CONFIG_HOTPLUG_CPU=y
-+CONFIG_PREEMPT=y
-+CONFIG_AEABI=y
-+CONFIG_CMA=y
-+CONFIG_UACCESS_WITH_MEMCPY=y
-+CONFIG_SECCOMP=y
-+CONFIG_ZBOOT_ROM_TEXT=0x0
-+CONFIG_ZBOOT_ROM_BSS=0x0
-+CONFIG_CMDLINE="console=ttyAMA0,115200 kgdboc=ttyAMA0,115200 root=/dev/mmcblk0p2 rootfstype=ext4 rootwait"
-+CONFIG_CPU_IDLE=y
-+CONFIG_VFP=y
-+# CONFIG_COREDUMP is not set
-+# CONFIG_SUSPEND is not set
-+CONFIG_NET=y
-+CONFIG_UNIX=y
-+CONFIG_CGROUP_NET_CLASSID=y
-+# CONFIG_WIRELESS is not set
-+CONFIG_DEVTMPFS=y
-+CONFIG_DEVTMPFS_MOUNT=y
-+CONFIG_DMA_CMA=y
-+CONFIG_CMA_SIZE_MBYTES=8
-+CONFIG_BLK_DEV_LOOP=y
-+CONFIG_BLK_DEV_RAM=y
-+# CONFIG_INPUT_MOUSEDEV_PSAUX is not set
-+# CONFIG_INPUT_KEYBOARD is not set
-+# CONFIG_INPUT_MOUSE is not set
-+# CONFIG_SERIO is not set
-+# CONFIG_LEGACY_PTYS is not set
-+# CONFIG_DEVKMEM is not set
-+CONFIG_SERIAL_AMBA_PL011=y
-+CONFIG_SERIAL_AMBA_PL011_CONSOLE=y
-+CONFIG_TTY_PRINTK=y
-+# CONFIG_HW_RANDOM is not set
-+CONFIG_BRCM_CHAR_DRIVERS=y
-+CONFIG_BCM_VC_CMA=y
-+CONFIG_GPIO_SYSFS=y
-+# CONFIG_HWMON is not set
-+CONFIG_FB=y
-+CONFIG_FB_BCM2708=y
-+CONFIG_FRAMEBUFFER_CONSOLE=y
-+# CONFIG_HID is not set
-+# CONFIG_USB_SUPPORT is not set
-+CONFIG_MMC=y
-+CONFIG_MMC_BLOCK_MINORS=32
-+CONFIG_MMC_SDHCI=y
-+CONFIG_MMC_SDHCI_PLTFM=y
-+CONFIG_MMC_BCM2835=y
-+CONFIG_MMC_BCM2835_DMA=y
-+CONFIG_DMADEVICES=y
-+CONFIG_DMA_BCM2708=y
-+# CONFIG_IOMMU_SUPPORT is not set
-+CONFIG_EXT4_FS=y
-+CONFIG_EXT4_FS_POSIX_ACL=y
-+CONFIG_EXT4_FS_SECURITY=y
-+CONFIG_FANOTIFY=y
-+CONFIG_FSCACHE=y
-+CONFIG_FSCACHE_STATS=y
-+CONFIG_FSCACHE_HISTOGRAM=y
-+CONFIG_CACHEFILES=y
-+CONFIG_MSDOS_FS=y
-+CONFIG_VFAT_FS=y
-+CONFIG_FAT_DEFAULT_IOCHARSET="ascii"
-+CONFIG_TMPFS=y
-+CONFIG_TMPFS_POSIX_ACL=y
-+CONFIG_CONFIGFS_FS=y
-+# CONFIG_MISC_FILESYSTEMS is not set
-+# CONFIG_NETWORK_FILESYSTEMS is not set
-+CONFIG_NLS_DEFAULT="utf8"
-+CONFIG_NLS_CODEPAGE_437=y
-+CONFIG_NLS_ASCII=y
-+CONFIG_PRINTK_TIME=y
-+CONFIG_BOOT_PRINTK_DELAY=y
-+CONFIG_DEBUG_FS=y
-+CONFIG_MAGIC_SYSRQ=y
-+CONFIG_DETECT_HUNG_TASK=y
-+CONFIG_TIMER_STATS=y
-+# CONFIG_DEBUG_PREEMPT is not set
-+CONFIG_DEBUG_LL=y
-+CONFIG_EARLY_PRINTK=y
-+CONFIG_KEYS=y
-+CONFIG_CRYPTO_CBC=y
-+CONFIG_CRYPTO_AES=y
-+CONFIG_CRYPTO_DES=y
-+# CONFIG_CRYPTO_ANSI_CPRNG is not set
-+# CONFIG_CRYPTO_HW is not set
-+CONFIG_CRC_ITU_T=y
-+CONFIG_LIBCRC32C=y
-+CONFIG_AVERAGE=y
-diff -Nur linux-3.18.6/arch/arm/configs/bcm2709_small_defconfig linux-rpi/arch/arm/configs/bcm2709_small_defconfig
---- linux-3.18.6/arch/arm/configs/bcm2709_small_defconfig 1970-01-01 01:00:00.000000000 +0100
-+++ linux-rpi/arch/arm/configs/bcm2709_small_defconfig 2015-02-09 04:39:42.000000000 +0100
-@@ -0,0 +1,61 @@
-+CONFIG_LOCALVERSION="-small"
-+# CONFIG_LOCALVERSION_AUTO is not set
-+# CONFIG_SWAP is not set
-+CONFIG_SYSVIPC=y
-+CONFIG_HIGH_RES_TIMERS=y
-+CONFIG_LOG_BUF_SHIFT=16
-+CONFIG_BLK_DEV_INITRD=y
-+CONFIG_INITRAMFS_SOURCE="../target_fs"
-+CONFIG_SLAB=y
-+# CONFIG_BLK_DEV_BSG is not set
-+# CONFIG_IOSCHED_CFQ is not set
-+CONFIG_ARCH_BCM2709=y
-+# CONFIG_BCM2708_GPIO is not set
-+# CONFIG_BCM2708_VCMEM is not set
-+CONFIG_ARM_THUMBEE=y
-+# CONFIG_SWP_EMULATE is not set
-+# CONFIG_CACHE_L2X0 is not set
-+CONFIG_ARM_ERRATA_720789=y
-+CONFIG_SMP=y
-+CONFIG_SCHED_MC=y
-+CONFIG_SCHED_SMT=y
-+CONFIG_HOTPLUG_CPU=y
-+CONFIG_PREEMPT=y
-+CONFIG_AEABI=y
-+CONFIG_HIGHMEM=y
-+CONFIG_HIGHPTE=y
-+# CONFIG_COMPACTION is not set
-+CONFIG_ZBOOT_ROM_TEXT=0x0
-+CONFIG_ZBOOT_ROM_BSS=0x0
-+CONFIG_CMDLINE="earlyprintk=ttyAMA0,19200 loglevel=9 console=ttyAMA0,19200"
-+CONFIG_AUTO_ZRELADDR=y
-+CONFIG_BINFMT_MISC=y
-+# CONFIG_SUSPEND is not set
-+# CONFIG_UEVENT_HELPER is not set
-+# CONFIG_FIRMWARE_IN_KERNEL is not set
-+# CONFIG_INPUT_MOUSEDEV_PSAUX is not set
-+# CONFIG_INPUT_KEYBOARD is not set
-+# CONFIG_INPUT_MOUSE is not set
-+# CONFIG_SERIO is not set
-+# CONFIG_LEGACY_PTYS is not set
-+# CONFIG_DEVKMEM is not set
-+CONFIG_SERIAL_AMBA_PL011=y
-+CONFIG_SERIAL_AMBA_PL011_CONSOLE=y
-+# CONFIG_HW_RANDOM is not set
-+# CONFIG_HWMON is not set
-+# CONFIG_HID is not set
-+# CONFIG_USB_SUPPORT is not set
-+# CONFIG_IOMMU_SUPPORT is not set
-+CONFIG_AUTOFS4_FS=y
-+# CONFIG_MISC_FILESYSTEMS is not set
-+CONFIG_PRINTK_TIME=y
-+CONFIG_FRAME_WARN=4096
-+CONFIG_MAGIC_SYSRQ=y
-+CONFIG_DEBUG_KERNEL=y
-+CONFIG_RCU_CPU_STALL_TIMEOUT=60
-+# CONFIG_FTRACE is not set
-+# CONFIG_ARM_UNWIND is not set
-+CONFIG_DEBUG_LL=y
-+CONFIG_EARLY_PRINTK=y
-+CONFIG_CRC16=y
-+CONFIG_CRC_ITU_T=y
-diff -Nur linux-3.18.6/arch/arm/configs/bcm2835_sdcard_defconfig linux-rpi/arch/arm/configs/bcm2835_sdcard_defconfig
---- linux-3.18.6/arch/arm/configs/bcm2835_sdcard_defconfig 1970-01-01 01:00:00.000000000 +0100
-+++ linux-rpi/arch/arm/configs/bcm2835_sdcard_defconfig 2015-02-09 04:39:42.000000000 +0100
-@@ -0,0 +1,176 @@
-+# CONFIG_ARM_PATCH_PHYS_VIRT is not set
-+CONFIG_LOCALVERSION="-quick"
-+# CONFIG_LOCALVERSION_AUTO is not set
-+# CONFIG_SWAP is not set
-+CONFIG_SYSVIPC=y
-+CONFIG_POSIX_MQUEUE=y
-+CONFIG_NO_HZ=y
-+CONFIG_HIGH_RES_TIMERS=y
-+CONFIG_IKCONFIG=y
-+CONFIG_IKCONFIG_PROC=y
-+CONFIG_KALLSYMS_ALL=y
-+CONFIG_EMBEDDED=y
-+CONFIG_PERF_EVENTS=y
-+# CONFIG_COMPAT_BRK is not set
-+CONFIG_SLAB=y
-+# CONFIG_BLK_DEV_BSG is not set
-+CONFIG_ARCH_BCM2708=y
-+# CONFIG_BCM2708_GPIO is not set
-+CONFIG_PREEMPT=y
-+CONFIG_AEABI=y
-+CONFIG_UACCESS_WITH_MEMCPY=y
-+CONFIG_ZBOOT_ROM_TEXT=0x0
-+CONFIG_ZBOOT_ROM_BSS=0x0
-+CONFIG_CMDLINE="dwc_otg.lpm_enable=0 console=ttyAMA0,115200 kgdboc=ttyAMA0,115200 root=/dev/mmcblk0p2 rootfstype=ext4 rootwait"
-+CONFIG_CPU_FREQ=y
-+CONFIG_CPU_FREQ_DEFAULT_GOV_POWERSAVE=y
-+CONFIG_CPU_FREQ_GOV_PERFORMANCE=y
-+CONFIG_CPU_FREQ_GOV_USERSPACE=y
-+CONFIG_CPU_FREQ_GOV_ONDEMAND=y
-+CONFIG_CPU_FREQ_GOV_CONSERVATIVE=y
-+CONFIG_CPU_IDLE=y
-+CONFIG_VFP=y
-+CONFIG_BINFMT_MISC=y
-+CONFIG_NET=y
-+CONFIG_PACKET=y
-+CONFIG_UNIX=y
-+CONFIG_INET=y
-+CONFIG_IP_MULTICAST=y
-+CONFIG_IP_PNP=y
-+CONFIG_IP_PNP_DHCP=y
-+CONFIG_IP_PNP_RARP=y
-+CONFIG_SYN_COOKIES=y
-+# CONFIG_INET_XFRM_MODE_TRANSPORT is not set
-+# CONFIG_INET_XFRM_MODE_TUNNEL is not set
-+# CONFIG_INET_XFRM_MODE_BEET is not set
-+# CONFIG_INET_LRO is not set
-+# CONFIG_INET_DIAG is not set
-+# CONFIG_IPV6 is not set
-+# CONFIG_WIRELESS is not set
-+CONFIG_DEVTMPFS=y
-+CONFIG_DEVTMPFS_MOUNT=y
-+CONFIG_BLK_DEV_LOOP=y
-+CONFIG_BLK_DEV_RAM=y
-+CONFIG_SCSI=y
-+# CONFIG_SCSI_PROC_FS is not set
-+# CONFIG_SCSI_LOWLEVEL is not set
-+CONFIG_NETDEVICES=y
-+CONFIG_MII=y
-+# CONFIG_NET_VENDOR_BROADCOM is not set
-+# CONFIG_NET_VENDOR_CIRRUS is not set
-+# CONFIG_NET_VENDOR_FARADAY is not set
-+# CONFIG_NET_VENDOR_INTEL is not set
-+# CONFIG_NET_VENDOR_MARVELL is not set
-+# CONFIG_NET_VENDOR_MICREL is not set
-+# CONFIG_NET_VENDOR_NATSEMI is not set
-+# CONFIG_NET_VENDOR_SEEQ is not set
-+# CONFIG_NET_VENDOR_STMICRO is not set
-+# CONFIG_NET_VENDOR_WIZNET is not set
-+CONFIG_PHYLIB=y
-+# CONFIG_WLAN is not set
-+# CONFIG_INPUT_MOUSEDEV is not set
-+CONFIG_INPUT_EVDEV=y
-+# CONFIG_INPUT_KEYBOARD is not set
-+# CONFIG_INPUT_MOUSE is not set
-+# CONFIG_SERIO is not set
-+CONFIG_VT_HW_CONSOLE_BINDING=y
-+# CONFIG_LEGACY_PTYS is not set
-+# CONFIG_DEVKMEM is not set
-+CONFIG_SERIAL_AMBA_PL011=y
-+CONFIG_SERIAL_AMBA_PL011_CONSOLE=y
-+CONFIG_TTY_PRINTK=y
-+CONFIG_RAW_DRIVER=y
-+CONFIG_WATCHDOG=y
-+CONFIG_REGULATOR=y
-+CONFIG_REGULATOR_DEBUG=y
-+CONFIG_REGULATOR_FIXED_VOLTAGE=y
-+CONFIG_REGULATOR_VIRTUAL_CONSUMER=y
-+CONFIG_REGULATOR_USERSPACE_CONSUMER=y
-+CONFIG_FB=y
-+CONFIG_FRAMEBUFFER_CONSOLE=y
-+CONFIG_LOGO=y
-+# CONFIG_LOGO_LINUX_MONO is not set
-+# CONFIG_LOGO_LINUX_VGA16 is not set
-+CONFIG_SOUND=y
-+CONFIG_SND=y
-+CONFIG_MMC=y
-+CONFIG_MMC_SDHCI=y
-+CONFIG_MMC_SDHCI_PLTFM=y
-+CONFIG_MMC_SDHCI_BCM2708=y
-+CONFIG_MMC_SDHCI_BCM2708_DMA=y
-+CONFIG_NEW_LEDS=y
-+CONFIG_LEDS_CLASS=y
-+CONFIG_LEDS_TRIGGERS=y
-+# CONFIG_IOMMU_SUPPORT is not set
-+CONFIG_EXT4_FS=y
-+CONFIG_EXT4_FS_POSIX_ACL=y
-+CONFIG_EXT4_FS_SECURITY=y
-+CONFIG_AUTOFS4_FS=y
-+CONFIG_FSCACHE=y
-+CONFIG_CACHEFILES=y
-+CONFIG_MSDOS_FS=y
-+CONFIG_VFAT_FS=y
-+CONFIG_FAT_DEFAULT_IOCHARSET="ascii"
-+CONFIG_TMPFS=y
-+CONFIG_TMPFS_POSIX_ACL=y
-+CONFIG_CONFIGFS_FS=y
-+# CONFIG_MISC_FILESYSTEMS is not set
-+CONFIG_NFS_FS=y
-+CONFIG_NFS_V3_ACL=y
-+CONFIG_NFS_V4=y
-+CONFIG_ROOT_NFS=y
-+CONFIG_NFS_FSCACHE=y
-+CONFIG_NLS_DEFAULT="utf8"
-+CONFIG_NLS_CODEPAGE_437=y
-+CONFIG_NLS_CODEPAGE_737=y
-+CONFIG_NLS_CODEPAGE_775=y
-+CONFIG_NLS_CODEPAGE_850=y
-+CONFIG_NLS_CODEPAGE_852=y
-+CONFIG_NLS_CODEPAGE_855=y
-+CONFIG_NLS_CODEPAGE_857=y
-+CONFIG_NLS_CODEPAGE_860=y
-+CONFIG_NLS_CODEPAGE_861=y
-+CONFIG_NLS_CODEPAGE_862=y
-+CONFIG_NLS_CODEPAGE_863=y
-+CONFIG_NLS_CODEPAGE_864=y
-+CONFIG_NLS_CODEPAGE_865=y
-+CONFIG_NLS_CODEPAGE_866=y
-+CONFIG_NLS_CODEPAGE_869=y
-+CONFIG_NLS_CODEPAGE_936=y
-+CONFIG_NLS_CODEPAGE_950=y
-+CONFIG_NLS_CODEPAGE_932=y
-+CONFIG_NLS_CODEPAGE_949=y
-+CONFIG_NLS_CODEPAGE_874=y
-+CONFIG_NLS_ISO8859_8=y
-+CONFIG_NLS_CODEPAGE_1250=y
-+CONFIG_NLS_CODEPAGE_1251=y
-+CONFIG_NLS_ASCII=y
-+CONFIG_NLS_ISO8859_1=y
-+CONFIG_NLS_ISO8859_2=y
-+CONFIG_NLS_ISO8859_3=y
-+CONFIG_NLS_ISO8859_4=y
-+CONFIG_NLS_ISO8859_5=y
-+CONFIG_NLS_ISO8859_6=y
-+CONFIG_NLS_ISO8859_7=y
-+CONFIG_NLS_ISO8859_9=y
-+CONFIG_NLS_ISO8859_13=y
-+CONFIG_NLS_ISO8859_14=y
-+CONFIG_NLS_ISO8859_15=y
-+CONFIG_NLS_UTF8=y
-+CONFIG_PRINTK_TIME=y
-+CONFIG_DEBUG_FS=y
-+# CONFIG_DEBUG_PREEMPT is not set
-+# CONFIG_DEBUG_BUGVERBOSE is not set
-+# CONFIG_FTRACE is not set
-+CONFIG_KGDB=y
-+CONFIG_KGDB_KDB=y
-+# CONFIG_ARM_UNWIND is not set
-+CONFIG_CRYPTO_CBC=y
-+CONFIG_CRYPTO_HMAC=y
-+CONFIG_CRYPTO_MD5=y
-+CONFIG_CRYPTO_SHA1=y
-+CONFIG_CRYPTO_DES=y
-+# CONFIG_CRYPTO_ANSI_CPRNG is not set
-+# CONFIG_CRYPTO_HW is not set
-+CONFIG_CRC_ITU_T=y
-+CONFIG_LIBCRC32C=y
-diff -Nur linux-3.18.6/arch/arm/configs/bcmrpi_defconfig linux-rpi/arch/arm/configs/bcmrpi_defconfig
---- linux-3.18.6/arch/arm/configs/bcmrpi_defconfig 1970-01-01 01:00:00.000000000 +0100
-+++ linux-rpi/arch/arm/configs/bcmrpi_defconfig 2015-02-09 04:39:42.000000000 +0100
-@@ -0,0 +1,1152 @@
+diff -Nur linux-3.18.8/arch/arm/configs/bcmrpi_defconfig linux-rpi/arch/arm/configs/bcmrpi_defconfig
+--- linux-3.18.8/arch/arm/configs/bcmrpi_defconfig 1970-01-01 01:00:00.000000000 +0100
++++ linux-rpi/arch/arm/configs/bcmrpi_defconfig 2015-03-05 14:40:11.085715840 +0100
+@@ -0,0 +1,1189 @@
+# CONFIG_ARM_PATCH_PHYS_VIRT is not set
+CONFIG_PHYS_OFFSET=0
+# CONFIG_LOCALVERSION_AUTO is not set
@@ -2790,9 +3088,9 @@ diff -Nur linux-3.18.6/arch/arm/configs/bcmrpi_defconfig linux-rpi/arch/arm/conf
+CONFIG_CPU_FREQ_GOV_USERSPACE=y
+CONFIG_CPU_FREQ_GOV_ONDEMAND=y
+CONFIG_CPU_FREQ_GOV_CONSERVATIVE=y
-+CONFIG_CPU_IDLE=y
+CONFIG_VFP=y
+CONFIG_BINFMT_MISC=m
++# CONFIG_SUSPEND is not set
+CONFIG_NET=y
+CONFIG_PACKET=y
+CONFIG_UNIX=y
@@ -3006,6 +3304,7 @@ diff -Nur linux-3.18.6/arch/arm/configs/bcmrpi_defconfig linux-rpi/arch/arm/conf
+CONFIG_VLAN_8021Q=m
+CONFIG_VLAN_8021Q_GVRP=y
+CONFIG_ATALK=m
++CONFIG_6LOWPAN=m
+CONFIG_NET_SCHED=y
+CONFIG_NET_SCH_CBQ=m
+CONFIG_NET_SCH_HTB=m
@@ -3069,6 +3368,9 @@ diff -Nur linux-3.18.6/arch/arm/configs/bcmrpi_defconfig linux-rpi/arch/arm/conf
+CONFIG_BAYCOM_SER_FDX=m
+CONFIG_BAYCOM_SER_HDX=m
+CONFIG_YAM=m
++CONFIG_CAN=m
++CONFIG_CAN_VCAN=m
++CONFIG_CAN_MCP251X=m
+CONFIG_IRDA=m
+CONFIG_IRLAN=m
+CONFIG_IRNET=m
@@ -3084,6 +3386,7 @@ diff -Nur linux-3.18.6/arch/arm/configs/bcmrpi_defconfig linux-rpi/arch/arm/conf
+CONFIG_SIGMATEL_FIR=m
+CONFIG_MCS_FIR=m
+CONFIG_BT=m
++CONFIG_BT_6LOWPAN=m
+CONFIG_BT_RFCOMM=m
+CONFIG_BT_RFCOMM_TTY=y
+CONFIG_BT_BNEP=m
@@ -3118,6 +3421,7 @@ diff -Nur linux-3.18.6/arch/arm/configs/bcmrpi_defconfig linux-rpi/arch/arm/conf
+CONFIG_BLK_DEV_NBD=m
+CONFIG_BLK_DEV_RAM=y
+CONFIG_CDROM_PKTCDVD=m
++CONFIG_ATA_OVER_ETH=m
+CONFIG_EEPROM_AT24=m
+CONFIG_SCSI=y
+# CONFIG_SCSI_PROC_FS is not set
@@ -3251,6 +3555,8 @@ diff -Nur linux-3.18.6/arch/arm/configs/bcmrpi_defconfig linux-rpi/arch/arm/conf
+CONFIG_JOYSTICK_XPAD_FF=y
+CONFIG_INPUT_TOUCHSCREEN=y
+CONFIG_TOUCHSCREEN_ADS7846=m
++CONFIG_TOUCHSCREEN_EGALAX=m
++CONFIG_TOUCHSCREEN_USB_COMPOSITE=m
+CONFIG_INPUT_MISC=y
+CONFIG_INPUT_AD714X=m
+CONFIG_INPUT_ATI_REMOTE2=m
@@ -3284,6 +3590,7 @@ diff -Nur linux-3.18.6/arch/arm/configs/bcmrpi_defconfig linux-rpi/arch/arm/conf
+CONFIG_I2C_MUX=m
+CONFIG_I2C_BCM2708=m
+CONFIG_SPI=y
++CONFIG_SPI_BCM2835=m
+CONFIG_SPI_BCM2708=m
+CONFIG_SPI_SPIDEV=y
+CONFIG_PPS=m
@@ -3740,6 +4047,34 @@ diff -Nur linux-3.18.6/arch/arm/configs/bcmrpi_defconfig linux-rpi/arch/arm/conf
+CONFIG_LIRC_RPI=m
+CONFIG_LIRC_SASEM=m
+CONFIG_LIRC_SERIAL=m
++CONFIG_FB_TFT=m
++CONFIG_FB_TFT_AGM1264K_FL=m
++CONFIG_FB_TFT_BD663474=m
++CONFIG_FB_TFT_HX8340BN=m
++CONFIG_FB_TFT_HX8347D=m
++CONFIG_FB_TFT_HX8353D=m
++CONFIG_FB_TFT_ILI9320=m
++CONFIG_FB_TFT_ILI9325=m
++CONFIG_FB_TFT_ILI9340=m
++CONFIG_FB_TFT_ILI9341=m
++CONFIG_FB_TFT_ILI9481=m
++CONFIG_FB_TFT_ILI9486=m
++CONFIG_FB_TFT_PCD8544=m
++CONFIG_FB_TFT_RA8875=m
++CONFIG_FB_TFT_S6D02A1=m
++CONFIG_FB_TFT_S6D1121=m
++CONFIG_FB_TFT_SSD1289=m
++CONFIG_FB_TFT_SSD1306=m
++CONFIG_FB_TFT_SSD1331=m
++CONFIG_FB_TFT_SSD1351=m
++CONFIG_FB_TFT_ST7735R=m
++CONFIG_FB_TFT_TINYLCD=m
++CONFIG_FB_TFT_TLS8204=m
++CONFIG_FB_TFT_UC1701=m
++CONFIG_FB_TFT_UPD161704=m
++CONFIG_FB_TFT_WATTEROTT=m
++CONFIG_FB_FLEX=m
++CONFIG_FB_TFT_FBTFT_DEVICE=m
+# CONFIG_IOMMU_SUPPORT is not set
+CONFIG_EXTCON=m
+CONFIG_EXTCON_ARIZONA=m
@@ -3881,497 +4216,9 @@ diff -Nur linux-3.18.6/arch/arm/configs/bcmrpi_defconfig linux-rpi/arch/arm/conf
+# CONFIG_CRYPTO_HW is not set
+CONFIG_CRC_ITU_T=y
+CONFIG_LIBCRC32C=y
-diff -Nur linux-3.18.6/arch/arm/configs/bcmrpi_quick_defconfig linux-rpi/arch/arm/configs/bcmrpi_quick_defconfig
---- linux-3.18.6/arch/arm/configs/bcmrpi_quick_defconfig 1970-01-01 01:00:00.000000000 +0100
-+++ linux-rpi/arch/arm/configs/bcmrpi_quick_defconfig 2015-02-09 04:39:42.000000000 +0100
-@@ -0,0 +1,197 @@
-+# CONFIG_ARM_PATCH_PHYS_VIRT is not set
-+CONFIG_LOCALVERSION="-quick"
-+# CONFIG_LOCALVERSION_AUTO is not set
-+# CONFIG_SWAP is not set
-+CONFIG_SYSVIPC=y
-+CONFIG_POSIX_MQUEUE=y
-+CONFIG_NO_HZ=y
-+CONFIG_HIGH_RES_TIMERS=y
-+CONFIG_IKCONFIG=y
-+CONFIG_IKCONFIG_PROC=y
-+CONFIG_KALLSYMS_ALL=y
-+CONFIG_EMBEDDED=y
-+CONFIG_PERF_EVENTS=y
-+# CONFIG_COMPAT_BRK is not set
-+CONFIG_SLAB=y
-+CONFIG_MODULES=y
-+CONFIG_MODULE_UNLOAD=y
-+CONFIG_MODVERSIONS=y
-+CONFIG_MODULE_SRCVERSION_ALL=y
-+# CONFIG_BLK_DEV_BSG is not set
-+CONFIG_ARCH_BCM2708=y
-+CONFIG_PREEMPT=y
-+CONFIG_AEABI=y
-+CONFIG_UACCESS_WITH_MEMCPY=y
-+CONFIG_ZBOOT_ROM_TEXT=0x0
-+CONFIG_ZBOOT_ROM_BSS=0x0
-+CONFIG_CMDLINE="dwc_otg.lpm_enable=0 console=ttyAMA0,115200 kgdboc=ttyAMA0,115200 root=/dev/mmcblk0p2 rootfstype=ext4 rootwait"
-+CONFIG_CPU_FREQ=y
-+CONFIG_CPU_FREQ_DEFAULT_GOV_POWERSAVE=y
-+CONFIG_CPU_FREQ_GOV_PERFORMANCE=y
-+CONFIG_CPU_FREQ_GOV_USERSPACE=y
-+CONFIG_CPU_FREQ_GOV_ONDEMAND=y
-+CONFIG_CPU_FREQ_GOV_CONSERVATIVE=y
-+CONFIG_CPU_IDLE=y
-+CONFIG_VFP=y
-+CONFIG_BINFMT_MISC=y
-+CONFIG_NET=y
-+CONFIG_PACKET=y
-+CONFIG_UNIX=y
-+CONFIG_INET=y
-+CONFIG_IP_MULTICAST=y
-+CONFIG_IP_PNP=y
-+CONFIG_IP_PNP_DHCP=y
-+CONFIG_IP_PNP_RARP=y
-+CONFIG_SYN_COOKIES=y
-+# CONFIG_INET_XFRM_MODE_TRANSPORT is not set
-+# CONFIG_INET_XFRM_MODE_TUNNEL is not set
-+# CONFIG_INET_XFRM_MODE_BEET is not set
-+# CONFIG_INET_LRO is not set
-+# CONFIG_INET_DIAG is not set
-+# CONFIG_IPV6 is not set
-+# CONFIG_WIRELESS is not set
-+CONFIG_DEVTMPFS=y
-+CONFIG_DEVTMPFS_MOUNT=y
-+CONFIG_BLK_DEV_LOOP=y
-+CONFIG_BLK_DEV_RAM=y
-+CONFIG_SCSI=y
-+# CONFIG_SCSI_PROC_FS is not set
-+# CONFIG_SCSI_LOWLEVEL is not set
-+CONFIG_NETDEVICES=y
-+# CONFIG_NET_VENDOR_BROADCOM is not set
-+# CONFIG_NET_VENDOR_CIRRUS is not set
-+# CONFIG_NET_VENDOR_FARADAY is not set
-+# CONFIG_NET_VENDOR_INTEL is not set
-+# CONFIG_NET_VENDOR_MARVELL is not set
-+# CONFIG_NET_VENDOR_MICREL is not set
-+# CONFIG_NET_VENDOR_NATSEMI is not set
-+# CONFIG_NET_VENDOR_SEEQ is not set
-+# CONFIG_NET_VENDOR_STMICRO is not set
-+# CONFIG_NET_VENDOR_WIZNET is not set
-+CONFIG_USB_USBNET=y
-+# CONFIG_USB_NET_AX8817X is not set
-+# CONFIG_USB_NET_CDCETHER is not set
-+# CONFIG_USB_NET_CDC_NCM is not set
-+CONFIG_USB_NET_SMSC95XX=y
-+# CONFIG_USB_NET_NET1080 is not set
-+# CONFIG_USB_NET_CDC_SUBSET is not set
-+# CONFIG_USB_NET_ZAURUS is not set
-+# CONFIG_WLAN is not set
-+# CONFIG_INPUT_MOUSEDEV is not set
-+CONFIG_INPUT_EVDEV=y
-+# CONFIG_INPUT_KEYBOARD is not set
-+# CONFIG_INPUT_MOUSE is not set
-+# CONFIG_SERIO is not set
-+CONFIG_VT_HW_CONSOLE_BINDING=y
-+# CONFIG_LEGACY_PTYS is not set
-+# CONFIG_DEVKMEM is not set
-+CONFIG_SERIAL_AMBA_PL011=y
-+CONFIG_SERIAL_AMBA_PL011_CONSOLE=y
-+CONFIG_TTY_PRINTK=y
-+CONFIG_HW_RANDOM=y
-+CONFIG_HW_RANDOM_BCM2708=y
-+CONFIG_RAW_DRIVER=y
-+CONFIG_THERMAL=y
-+CONFIG_THERMAL_BCM2835=y
-+CONFIG_WATCHDOG=y
-+CONFIG_BCM2708_WDT=y
-+CONFIG_REGULATOR=y
-+CONFIG_REGULATOR_DEBUG=y
-+CONFIG_REGULATOR_FIXED_VOLTAGE=y
-+CONFIG_REGULATOR_VIRTUAL_CONSUMER=y
-+CONFIG_REGULATOR_USERSPACE_CONSUMER=y
-+CONFIG_FB=y
-+CONFIG_FB_BCM2708=y
-+CONFIG_FRAMEBUFFER_CONSOLE=y
-+CONFIG_LOGO=y
-+# CONFIG_LOGO_LINUX_MONO is not set
-+# CONFIG_LOGO_LINUX_VGA16 is not set
-+CONFIG_SOUND=y
-+CONFIG_SND=y
-+CONFIG_SND_BCM2835=y
-+# CONFIG_SND_USB is not set
-+CONFIG_USB=y
-+CONFIG_USB_ANNOUNCE_NEW_DEVICES=y
-+CONFIG_USB_DWCOTG=y
-+CONFIG_MMC=y
-+CONFIG_MMC_SDHCI=y
-+CONFIG_MMC_SDHCI_PLTFM=y
-+CONFIG_MMC_SDHCI_BCM2708=y
-+CONFIG_MMC_SDHCI_BCM2708_DMA=y
-+CONFIG_NEW_LEDS=y
-+CONFIG_LEDS_CLASS=y
-+CONFIG_LEDS_TRIGGERS=y
-+# CONFIG_IOMMU_SUPPORT is not set
-+CONFIG_EXT4_FS=y
-+CONFIG_EXT4_FS_POSIX_ACL=y
-+CONFIG_EXT4_FS_SECURITY=y
-+CONFIG_AUTOFS4_FS=y
-+CONFIG_FSCACHE=y
-+CONFIG_CACHEFILES=y
-+CONFIG_MSDOS_FS=y
-+CONFIG_VFAT_FS=y
-+CONFIG_FAT_DEFAULT_IOCHARSET="ascii"
-+CONFIG_TMPFS=y
-+CONFIG_TMPFS_POSIX_ACL=y
-+CONFIG_CONFIGFS_FS=y
-+# CONFIG_MISC_FILESYSTEMS is not set
-+CONFIG_NFS_FS=y
-+CONFIG_NFS_V3_ACL=y
-+CONFIG_NFS_V4=y
-+CONFIG_ROOT_NFS=y
-+CONFIG_NFS_FSCACHE=y
-+CONFIG_NLS_DEFAULT="utf8"
-+CONFIG_NLS_CODEPAGE_437=y
-+CONFIG_NLS_CODEPAGE_737=y
-+CONFIG_NLS_CODEPAGE_775=y
-+CONFIG_NLS_CODEPAGE_850=y
-+CONFIG_NLS_CODEPAGE_852=y
-+CONFIG_NLS_CODEPAGE_855=y
-+CONFIG_NLS_CODEPAGE_857=y
-+CONFIG_NLS_CODEPAGE_860=y
-+CONFIG_NLS_CODEPAGE_861=y
-+CONFIG_NLS_CODEPAGE_862=y
-+CONFIG_NLS_CODEPAGE_863=y
-+CONFIG_NLS_CODEPAGE_864=y
-+CONFIG_NLS_CODEPAGE_865=y
-+CONFIG_NLS_CODEPAGE_866=y
-+CONFIG_NLS_CODEPAGE_869=y
-+CONFIG_NLS_CODEPAGE_936=y
-+CONFIG_NLS_CODEPAGE_950=y
-+CONFIG_NLS_CODEPAGE_932=y
-+CONFIG_NLS_CODEPAGE_949=y
-+CONFIG_NLS_CODEPAGE_874=y
-+CONFIG_NLS_ISO8859_8=y
-+CONFIG_NLS_CODEPAGE_1250=y
-+CONFIG_NLS_CODEPAGE_1251=y
-+CONFIG_NLS_ASCII=y
-+CONFIG_NLS_ISO8859_1=y
-+CONFIG_NLS_ISO8859_2=y
-+CONFIG_NLS_ISO8859_3=y
-+CONFIG_NLS_ISO8859_4=y
-+CONFIG_NLS_ISO8859_5=y
-+CONFIG_NLS_ISO8859_6=y
-+CONFIG_NLS_ISO8859_7=y
-+CONFIG_NLS_ISO8859_9=y
-+CONFIG_NLS_ISO8859_13=y
-+CONFIG_NLS_ISO8859_14=y
-+CONFIG_NLS_ISO8859_15=y
-+CONFIG_NLS_UTF8=y
-+CONFIG_PRINTK_TIME=y
-+CONFIG_DEBUG_FS=y
-+CONFIG_DETECT_HUNG_TASK=y
-+# CONFIG_DEBUG_PREEMPT is not set
-+# CONFIG_DEBUG_BUGVERBOSE is not set
-+# CONFIG_FTRACE is not set
-+CONFIG_KGDB=y
-+CONFIG_KGDB_KDB=y
-+# CONFIG_ARM_UNWIND is not set
-+CONFIG_CRYPTO_CBC=y
-+CONFIG_CRYPTO_HMAC=y
-+CONFIG_CRYPTO_MD5=y
-+CONFIG_CRYPTO_SHA1=y
-+CONFIG_CRYPTO_DES=y
-+# CONFIG_CRYPTO_ANSI_CPRNG is not set
-+# CONFIG_CRYPTO_HW is not set
-+CONFIG_CRC_ITU_T=y
-+CONFIG_LIBCRC32C=y
-diff -Nur linux-3.18.6/arch/arm/configs/bcmrpi_sdcard_defconfig linux-rpi/arch/arm/configs/bcmrpi_sdcard_defconfig
---- linux-3.18.6/arch/arm/configs/bcmrpi_sdcard_defconfig 1970-01-01 01:00:00.000000000 +0100
-+++ linux-rpi/arch/arm/configs/bcmrpi_sdcard_defconfig 2015-02-09 04:39:42.000000000 +0100
-@@ -0,0 +1,176 @@
-+# CONFIG_ARM_PATCH_PHYS_VIRT is not set
-+CONFIG_LOCALVERSION="-quick"
-+# CONFIG_LOCALVERSION_AUTO is not set
-+# CONFIG_SWAP is not set
-+CONFIG_SYSVIPC=y
-+CONFIG_POSIX_MQUEUE=y
-+CONFIG_NO_HZ=y
-+CONFIG_HIGH_RES_TIMERS=y
-+CONFIG_IKCONFIG=y
-+CONFIG_IKCONFIG_PROC=y
-+CONFIG_KALLSYMS_ALL=y
-+CONFIG_EMBEDDED=y
-+CONFIG_PERF_EVENTS=y
-+# CONFIG_COMPAT_BRK is not set
-+CONFIG_SLAB=y
-+# CONFIG_BLK_DEV_BSG is not set
-+CONFIG_ARCH_BCM2708=y
-+CONFIG_PREEMPT=y
-+CONFIG_AEABI=y
-+CONFIG_UACCESS_WITH_MEMCPY=y
-+CONFIG_ZBOOT_ROM_TEXT=0x0
-+CONFIG_ZBOOT_ROM_BSS=0x0
-+CONFIG_CMDLINE="dwc_otg.lpm_enable=0 console=ttyAMA0,115200 kgdboc=ttyAMA0,115200 root=/dev/mmcblk0p2 rootfstype=ext4 rootwait"
-+CONFIG_CPU_FREQ=y
-+CONFIG_CPU_FREQ_DEFAULT_GOV_POWERSAVE=y
-+CONFIG_CPU_FREQ_GOV_PERFORMANCE=y
-+CONFIG_CPU_FREQ_GOV_USERSPACE=y
-+CONFIG_CPU_FREQ_GOV_ONDEMAND=y
-+CONFIG_CPU_FREQ_GOV_CONSERVATIVE=y
-+CONFIG_CPU_IDLE=y
-+CONFIG_VFP=y
-+CONFIG_BINFMT_MISC=y
-+CONFIG_NET=y
-+CONFIG_PACKET=y
-+CONFIG_UNIX=y
-+CONFIG_INET=y
-+CONFIG_IP_MULTICAST=y
-+CONFIG_IP_PNP=y
-+CONFIG_IP_PNP_DHCP=y
-+CONFIG_IP_PNP_RARP=y
-+CONFIG_SYN_COOKIES=y
-+# CONFIG_INET_XFRM_MODE_TRANSPORT is not set
-+# CONFIG_INET_XFRM_MODE_TUNNEL is not set
-+# CONFIG_INET_XFRM_MODE_BEET is not set
-+# CONFIG_INET_LRO is not set
-+# CONFIG_INET_DIAG is not set
-+# CONFIG_IPV6 is not set
-+# CONFIG_WIRELESS is not set
-+CONFIG_DEVTMPFS=y
-+CONFIG_DEVTMPFS_MOUNT=y
-+CONFIG_BLK_DEV_LOOP=y
-+CONFIG_BLK_DEV_RAM=y
-+CONFIG_SCSI=y
-+# CONFIG_SCSI_PROC_FS is not set
-+# CONFIG_SCSI_LOWLEVEL is not set
-+CONFIG_NETDEVICES=y
-+CONFIG_MII=y
-+# CONFIG_NET_VENDOR_BROADCOM is not set
-+# CONFIG_NET_VENDOR_CIRRUS is not set
-+# CONFIG_NET_VENDOR_FARADAY is not set
-+# CONFIG_NET_VENDOR_INTEL is not set
-+# CONFIG_NET_VENDOR_MARVELL is not set
-+# CONFIG_NET_VENDOR_MICREL is not set
-+# CONFIG_NET_VENDOR_NATSEMI is not set
-+# CONFIG_NET_VENDOR_SEEQ is not set
-+# CONFIG_NET_VENDOR_STMICRO is not set
-+# CONFIG_NET_VENDOR_WIZNET is not set
-+CONFIG_PHYLIB=y
-+# CONFIG_WLAN is not set
-+# CONFIG_INPUT_MOUSEDEV is not set
-+CONFIG_INPUT_EVDEV=y
-+# CONFIG_INPUT_KEYBOARD is not set
-+# CONFIG_INPUT_MOUSE is not set
-+# CONFIG_SERIO is not set
-+CONFIG_VT_HW_CONSOLE_BINDING=y
-+# CONFIG_LEGACY_PTYS is not set
-+# CONFIG_DEVKMEM is not set
-+CONFIG_SERIAL_AMBA_PL011=y
-+CONFIG_SERIAL_AMBA_PL011_CONSOLE=y
-+CONFIG_TTY_PRINTK=y
-+CONFIG_RAW_DRIVER=y
-+CONFIG_WATCHDOG=y
-+CONFIG_REGULATOR=y
-+CONFIG_REGULATOR_DEBUG=y
-+CONFIG_REGULATOR_FIXED_VOLTAGE=y
-+CONFIG_REGULATOR_VIRTUAL_CONSUMER=y
-+CONFIG_REGULATOR_USERSPACE_CONSUMER=y
-+CONFIG_FB=y
-+CONFIG_FRAMEBUFFER_CONSOLE=y
-+CONFIG_LOGO=y
-+# CONFIG_LOGO_LINUX_MONO is not set
-+# CONFIG_LOGO_LINUX_VGA16 is not set
-+CONFIG_SOUND=y
-+CONFIG_SND=y
-+CONFIG_MMC=y
-+CONFIG_MMC_SDHCI=y
-+CONFIG_MMC_SDHCI_PLTFM=y
-+CONFIG_MMC_SDHCI_BCM2708=y
-+CONFIG_MMC_SDHCI_BCM2708_DMA=y
-+CONFIG_NEW_LEDS=y
-+CONFIG_LEDS_CLASS=y
-+CONFIG_LEDS_TRIGGERS=y
-+# CONFIG_IOMMU_SUPPORT is not set
-+CONFIG_EXT4_FS=y
-+CONFIG_EXT4_FS_POSIX_ACL=y
-+CONFIG_EXT4_FS_SECURITY=y
-+CONFIG_AUTOFS4_FS=y
-+CONFIG_FSCACHE=y
-+CONFIG_CACHEFILES=y
-+CONFIG_MSDOS_FS=y
-+CONFIG_VFAT_FS=y
-+CONFIG_FAT_DEFAULT_IOCHARSET="ascii"
-+CONFIG_TMPFS=y
-+CONFIG_TMPFS_POSIX_ACL=y
-+CONFIG_CONFIGFS_FS=y
-+# CONFIG_MISC_FILESYSTEMS is not set
-+CONFIG_NFS_FS=y
-+CONFIG_NFS_V3_ACL=y
-+CONFIG_NFS_V4=y
-+CONFIG_ROOT_NFS=y
-+CONFIG_NFS_FSCACHE=y
-+CONFIG_NLS_DEFAULT="utf8"
-+CONFIG_NLS_CODEPAGE_437=y
-+CONFIG_NLS_CODEPAGE_737=y
-+CONFIG_NLS_CODEPAGE_775=y
-+CONFIG_NLS_CODEPAGE_850=y
-+CONFIG_NLS_CODEPAGE_852=y
-+CONFIG_NLS_CODEPAGE_855=y
-+CONFIG_NLS_CODEPAGE_857=y
-+CONFIG_NLS_CODEPAGE_860=y
-+CONFIG_NLS_CODEPAGE_861=y
-+CONFIG_NLS_CODEPAGE_862=y
-+CONFIG_NLS_CODEPAGE_863=y
-+CONFIG_NLS_CODEPAGE_864=y
-+CONFIG_NLS_CODEPAGE_865=y
-+CONFIG_NLS_CODEPAGE_866=y
-+CONFIG_NLS_CODEPAGE_869=y
-+CONFIG_NLS_CODEPAGE_936=y
-+CONFIG_NLS_CODEPAGE_950=y
-+CONFIG_NLS_CODEPAGE_932=y
-+CONFIG_NLS_CODEPAGE_949=y
-+CONFIG_NLS_CODEPAGE_874=y
-+CONFIG_NLS_ISO8859_8=y
-+CONFIG_NLS_CODEPAGE_1250=y
-+CONFIG_NLS_CODEPAGE_1251=y
-+CONFIG_NLS_ASCII=y
-+CONFIG_NLS_ISO8859_1=y
-+CONFIG_NLS_ISO8859_2=y
-+CONFIG_NLS_ISO8859_3=y
-+CONFIG_NLS_ISO8859_4=y
-+CONFIG_NLS_ISO8859_5=y
-+CONFIG_NLS_ISO8859_6=y
-+CONFIG_NLS_ISO8859_7=y
-+CONFIG_NLS_ISO8859_9=y
-+CONFIG_NLS_ISO8859_13=y
-+CONFIG_NLS_ISO8859_14=y
-+CONFIG_NLS_ISO8859_15=y
-+CONFIG_NLS_UTF8=y
-+CONFIG_PRINTK_TIME=y
-+CONFIG_DEBUG_FS=y
-+CONFIG_DETECT_HUNG_TASK=y
-+# CONFIG_DEBUG_PREEMPT is not set
-+# CONFIG_DEBUG_BUGVERBOSE is not set
-+# CONFIG_FTRACE is not set
-+CONFIG_KGDB=y
-+CONFIG_KGDB_KDB=y
-+# CONFIG_ARM_UNWIND is not set
-+CONFIG_CRYPTO_CBC=y
-+CONFIG_CRYPTO_HMAC=y
-+CONFIG_CRYPTO_MD5=y
-+CONFIG_CRYPTO_SHA1=y
-+CONFIG_CRYPTO_DES=y
-+# CONFIG_CRYPTO_ANSI_CPRNG is not set
-+# CONFIG_CRYPTO_HW is not set
-+CONFIG_CRC_ITU_T=y
-+CONFIG_LIBCRC32C=y
-diff -Nur linux-3.18.6/arch/arm/configs/bcmrpi_small_defconfig linux-rpi/arch/arm/configs/bcmrpi_small_defconfig
---- linux-3.18.6/arch/arm/configs/bcmrpi_small_defconfig 1970-01-01 01:00:00.000000000 +0100
-+++ linux-rpi/arch/arm/configs/bcmrpi_small_defconfig 2015-02-09 04:39:42.000000000 +0100
-@@ -0,0 +1,103 @@
-+CONFIG_LOCALVERSION="-quick"
-+# CONFIG_LOCALVERSION_AUTO is not set
-+# CONFIG_SWAP is not set
-+CONFIG_SYSVIPC=y
-+CONFIG_NO_HZ=y
-+CONFIG_HIGH_RES_TIMERS=y
-+CONFIG_IKCONFIG=y
-+CONFIG_IKCONFIG_PROC=y
-+CONFIG_KALLSYMS_ALL=y
-+CONFIG_PERF_EVENTS=y
-+# CONFIG_COMPAT_BRK is not set
-+# CONFIG_BLK_DEV_BSG is not set
-+CONFIG_ARCH_BCM2836=y
-+# CONFIG_BCM2708_GPIO is not set
-+# CONFIG_BCM2708_VCMEM is not set
-+# CONFIG_CACHE_L2X0 is not set
-+CONFIG_SMP=y
-+CONFIG_HAVE_ARM_ARCH_TIMER=y
-+CONFIG_PREEMPT=y
-+CONFIG_AEABI=y
-+CONFIG_ZBOOT_ROM_TEXT=0x0
-+CONFIG_ZBOOT_ROM_BSS=0x0
-+CONFIG_CMDLINE="console=ttyAMA0,115200 kgdboc=ttyAMA0,115200 root=/dev/mmcblk0p2 rootfstype=ext4 rootwait"
-+CONFIG_CPU_IDLE=y
-+# CONFIG_SUSPEND is not set
-+CONFIG_DEVTMPFS=y
-+CONFIG_DEVTMPFS_MOUNT=y
-+CONFIG_BLK_DEV_LOOP=y
-+CONFIG_BLK_DEV_RAM=y
-+# CONFIG_BCM2708_VCHIQ is not set
-+# CONFIG_INPUT_MOUSEDEV is not set
-+CONFIG_INPUT_EVDEV=y
-+# CONFIG_INPUT_KEYBOARD is not set
-+# CONFIG_INPUT_MOUSE is not set
-+# CONFIG_SERIO is not set
-+# CONFIG_LEGACY_PTYS is not set
-+# CONFIG_DEVKMEM is not set
-+CONFIG_SERIAL_AMBA_PL011=y
-+CONFIG_SERIAL_AMBA_PL011_CONSOLE=y
-+CONFIG_RAW_DRIVER=y
-+# CONFIG_HID is not set
-+CONFIG_DMADEVICES=y
-+# CONFIG_IOMMU_SUPPORT is not set
-+CONFIG_TMPFS=y
-+CONFIG_TMPFS_POSIX_ACL=y
-+# CONFIG_MISC_FILESYSTEMS is not set
-+CONFIG_NLS=y
-+CONFIG_NLS_DEFAULT="utf8"
-+CONFIG_NLS_CODEPAGE_437=y
-+CONFIG_NLS_CODEPAGE_737=y
-+CONFIG_NLS_CODEPAGE_775=y
-+CONFIG_NLS_CODEPAGE_850=y
-+CONFIG_NLS_CODEPAGE_852=y
-+CONFIG_NLS_CODEPAGE_855=y
-+CONFIG_NLS_CODEPAGE_857=y
-+CONFIG_NLS_CODEPAGE_860=y
-+CONFIG_NLS_CODEPAGE_861=y
-+CONFIG_NLS_CODEPAGE_862=y
-+CONFIG_NLS_CODEPAGE_863=y
-+CONFIG_NLS_CODEPAGE_864=y
-+CONFIG_NLS_CODEPAGE_865=y
-+CONFIG_NLS_CODEPAGE_866=y
-+CONFIG_NLS_CODEPAGE_869=y
-+CONFIG_NLS_CODEPAGE_936=y
-+CONFIG_NLS_CODEPAGE_950=y
-+CONFIG_NLS_CODEPAGE_932=y
-+CONFIG_NLS_CODEPAGE_949=y
-+CONFIG_NLS_CODEPAGE_874=y
-+CONFIG_NLS_ISO8859_8=y
-+CONFIG_NLS_CODEPAGE_1250=y
-+CONFIG_NLS_CODEPAGE_1251=y
-+CONFIG_NLS_ASCII=y
-+CONFIG_NLS_ISO8859_1=y
-+CONFIG_NLS_ISO8859_2=y
-+CONFIG_NLS_ISO8859_3=y
-+CONFIG_NLS_ISO8859_4=y
-+CONFIG_NLS_ISO8859_5=y
-+CONFIG_NLS_ISO8859_6=y
-+CONFIG_NLS_ISO8859_7=y
-+CONFIG_NLS_ISO8859_9=y
-+CONFIG_NLS_ISO8859_13=y
-+CONFIG_NLS_ISO8859_14=y
-+CONFIG_NLS_ISO8859_15=y
-+CONFIG_NLS_UTF8=y
-+CONFIG_PRINTK_TIME=y
-+CONFIG_DEBUG_KERNEL=y
-+# CONFIG_DEBUG_PREEMPT is not set
-+# CONFIG_FTRACE is not set
-+CONFIG_KGDB=y
-+CONFIG_KGDB_KDB=y
-+# CONFIG_ARM_UNWIND is not set
-+CONFIG_DEBUG_LL=y
-+CONFIG_EARLY_PRINTK=y
-+CONFIG_CRYPTO_CBC=y
-+CONFIG_CRYPTO_HMAC=y
-+CONFIG_CRYPTO_MD5=y
-+CONFIG_CRYPTO_SHA1=y
-+CONFIG_CRYPTO_DES=y
-+# CONFIG_CRYPTO_ANSI_CPRNG is not set
-+# CONFIG_CRYPTO_HW is not set
-+CONFIG_CRC16=y
-+CONFIG_CRC_ITU_T=y
-+CONFIG_LIBCRC32C=y
-diff -Nur linux-3.18.6/arch/arm/include/asm/dma-mapping.h linux-rpi/arch/arm/include/asm/dma-mapping.h
---- linux-3.18.6/arch/arm/include/asm/dma-mapping.h 2015-02-06 15:53:48.000000000 +0100
-+++ linux-rpi/arch/arm/include/asm/dma-mapping.h 2015-02-09 04:39:42.000000000 +0100
+diff -Nur linux-3.18.8/arch/arm/include/asm/dma-mapping.h linux-rpi/arch/arm/include/asm/dma-mapping.h
+--- linux-3.18.8/arch/arm/include/asm/dma-mapping.h 2015-02-27 02:49:36.000000000 +0100
++++ linux-rpi/arch/arm/include/asm/dma-mapping.h 2015-03-05 14:40:11.093715840 +0100
@@ -58,37 +58,21 @@
#ifndef __arch_pfn_to_dma
static inline dma_addr_t pfn_to_dma(struct device *dev, unsigned long pfn)
@@ -4411,9 +4258,9 @@ diff -Nur linux-3.18.6/arch/arm/include/asm/dma-mapping.h linux-rpi/arch/arm/inc
return (dma_addr_t)__virt_to_bus((unsigned long)(addr));
}
-diff -Nur linux-3.18.6/arch/arm/include/asm/entry-macro-multi.S linux-rpi/arch/arm/include/asm/entry-macro-multi.S
---- linux-3.18.6/arch/arm/include/asm/entry-macro-multi.S 2015-02-06 15:53:48.000000000 +0100
-+++ linux-rpi/arch/arm/include/asm/entry-macro-multi.S 2015-02-09 04:39:42.000000000 +0100
+diff -Nur linux-3.18.8/arch/arm/include/asm/entry-macro-multi.S linux-rpi/arch/arm/include/asm/entry-macro-multi.S
+--- linux-3.18.8/arch/arm/include/asm/entry-macro-multi.S 2015-02-27 02:49:36.000000000 +0100
++++ linux-rpi/arch/arm/include/asm/entry-macro-multi.S 2015-03-05 14:40:11.093715840 +0100
@@ -1,5 +1,6 @@
#include <asm/assembler.h>
@@ -4429,9 +4276,9 @@ diff -Nur linux-3.18.6/arch/arm/include/asm/entry-macro-multi.S linux-rpi/arch/a
.macro arch_irq_handler, symbol_name
.align 5
-diff -Nur linux-3.18.6/arch/arm/include/asm/irqflags.h linux-rpi/arch/arm/include/asm/irqflags.h
---- linux-3.18.6/arch/arm/include/asm/irqflags.h 2015-02-06 15:53:48.000000000 +0100
-+++ linux-rpi/arch/arm/include/asm/irqflags.h 2015-02-09 04:39:42.000000000 +0100
+diff -Nur linux-3.18.8/arch/arm/include/asm/irqflags.h linux-rpi/arch/arm/include/asm/irqflags.h
+--- linux-3.18.8/arch/arm/include/asm/irqflags.h 2015-02-27 02:49:36.000000000 +0100
++++ linux-rpi/arch/arm/include/asm/irqflags.h 2015-03-05 14:40:11.097715840 +0100
@@ -145,12 +145,22 @@
}
@@ -4458,9 +4305,9 @@ diff -Nur linux-3.18.6/arch/arm/include/asm/irqflags.h linux-rpi/arch/arm/includ
:
: "r" (flags)
: "memory", "cc");
-diff -Nur linux-3.18.6/arch/arm/include/asm/string.h linux-rpi/arch/arm/include/asm/string.h
---- linux-3.18.6/arch/arm/include/asm/string.h 2015-02-06 15:53:48.000000000 +0100
-+++ linux-rpi/arch/arm/include/asm/string.h 2015-02-09 04:39:42.000000000 +0100
+diff -Nur linux-3.18.8/arch/arm/include/asm/string.h linux-rpi/arch/arm/include/asm/string.h
+--- linux-3.18.8/arch/arm/include/asm/string.h 2015-02-27 02:49:36.000000000 +0100
++++ linux-rpi/arch/arm/include/asm/string.h 2015-03-05 14:40:11.097715840 +0100
@@ -24,6 +24,11 @@
#define __HAVE_ARCH_MEMSET
extern void * memset(void *, int, __kernel_size_t);
@@ -4473,9 +4320,9 @@ diff -Nur linux-3.18.6/arch/arm/include/asm/string.h linux-rpi/arch/arm/include/
extern void __memzero(void *ptr, __kernel_size_t n);
#define memset(p,v,n) \
-diff -Nur linux-3.18.6/arch/arm/include/asm/uaccess.h linux-rpi/arch/arm/include/asm/uaccess.h
---- linux-3.18.6/arch/arm/include/asm/uaccess.h 2015-02-06 15:53:48.000000000 +0100
-+++ linux-rpi/arch/arm/include/asm/uaccess.h 2015-02-09 04:39:42.000000000 +0100
+diff -Nur linux-3.18.8/arch/arm/include/asm/uaccess.h linux-rpi/arch/arm/include/asm/uaccess.h
+--- linux-3.18.8/arch/arm/include/asm/uaccess.h 2015-02-27 02:49:36.000000000 +0100
++++ linux-rpi/arch/arm/include/asm/uaccess.h 2015-03-05 14:40:11.097715840 +0100
@@ -475,6 +475,7 @@
#ifdef CONFIG_MMU
@@ -4484,9 +4331,9 @@ diff -Nur linux-3.18.6/arch/arm/include/asm/uaccess.h linux-rpi/arch/arm/include
extern unsigned long __must_check __copy_to_user(void __user *to, const void *from, unsigned long n);
extern unsigned long __must_check __copy_to_user_std(void __user *to, const void *from, unsigned long n);
extern unsigned long __must_check __clear_user(void __user *addr, unsigned long n);
-diff -Nur linux-3.18.6/arch/arm/Kconfig linux-rpi/arch/arm/Kconfig
---- linux-3.18.6/arch/arm/Kconfig 2015-02-06 15:53:48.000000000 +0100
-+++ linux-rpi/arch/arm/Kconfig 2015-02-09 04:39:42.000000000 +0100
+diff -Nur linux-3.18.8/arch/arm/Kconfig linux-rpi/arch/arm/Kconfig
+--- linux-3.18.8/arch/arm/Kconfig 2015-02-27 02:49:36.000000000 +0100
++++ linux-rpi/arch/arm/Kconfig 2015-03-05 14:40:11.017715840 +0100
@@ -381,6 +381,23 @@
This enables support for systems based on Atmel
AT91RM9200 and AT91SAM9* processors.
@@ -4547,9 +4394,9 @@ diff -Nur linux-3.18.6/arch/arm/Kconfig linux-rpi/arch/arm/Kconfig
source "arch/arm/mach-zynq/Kconfig"
-diff -Nur linux-3.18.6/arch/arm/Kconfig.debug linux-rpi/arch/arm/Kconfig.debug
---- linux-3.18.6/arch/arm/Kconfig.debug 2015-02-06 15:53:48.000000000 +0100
-+++ linux-rpi/arch/arm/Kconfig.debug 2015-02-09 04:39:42.000000000 +0100
+diff -Nur linux-3.18.8/arch/arm/Kconfig.debug linux-rpi/arch/arm/Kconfig.debug
+--- linux-3.18.8/arch/arm/Kconfig.debug 2015-02-27 02:49:36.000000000 +0100
++++ linux-rpi/arch/arm/Kconfig.debug 2015-03-05 14:40:11.017715840 +0100
@@ -985,6 +985,14 @@
options; the platform specific options are deprecated
and will be soon removed.
@@ -4565,9 +4412,9 @@ diff -Nur linux-3.18.6/arch/arm/Kconfig.debug linux-rpi/arch/arm/Kconfig.debug
endchoice
config DEBUG_EXYNOS_UART
-diff -Nur linux-3.18.6/arch/arm/kernel/fiqasm.S linux-rpi/arch/arm/kernel/fiqasm.S
---- linux-3.18.6/arch/arm/kernel/fiqasm.S 2015-02-06 15:53:48.000000000 +0100
-+++ linux-rpi/arch/arm/kernel/fiqasm.S 2015-02-09 04:39:42.000000000 +0100
+diff -Nur linux-3.18.8/arch/arm/kernel/fiqasm.S linux-rpi/arch/arm/kernel/fiqasm.S
+--- linux-3.18.8/arch/arm/kernel/fiqasm.S 2015-02-27 02:49:36.000000000 +0100
++++ linux-rpi/arch/arm/kernel/fiqasm.S 2015-03-05 14:40:11.137715839 +0100
@@ -47,3 +47,7 @@
mov r0, r0 @ avoid hazard prior to ARMv4
ret lr
@@ -4576,9 +4423,9 @@ diff -Nur linux-3.18.6/arch/arm/kernel/fiqasm.S linux-rpi/arch/arm/kernel/fiqasm
+ENTRY(__FIQ_Branch)
+ mov pc, r8
+ENDPROC(__FIQ_Branch)
-diff -Nur linux-3.18.6/arch/arm/kernel/head.S linux-rpi/arch/arm/kernel/head.S
---- linux-3.18.6/arch/arm/kernel/head.S 2015-02-06 15:53:48.000000000 +0100
-+++ linux-rpi/arch/arm/kernel/head.S 2015-02-09 04:39:42.000000000 +0100
+diff -Nur linux-3.18.8/arch/arm/kernel/head.S linux-rpi/arch/arm/kernel/head.S
+--- linux-3.18.8/arch/arm/kernel/head.S 2015-02-27 02:49:36.000000000 +0100
++++ linux-rpi/arch/arm/kernel/head.S 2015-03-05 14:40:11.137715839 +0100
@@ -673,6 +673,14 @@
ldrcc r7, [r4], #4 @ use branch for delay slot
bcc 1b
@@ -4594,9 +4441,9 @@ diff -Nur linux-3.18.6/arch/arm/kernel/head.S linux-rpi/arch/arm/kernel/head.S
#endif
ENDPROC(__fixup_a_pv_table)
-diff -Nur linux-3.18.6/arch/arm/kernel/process.c linux-rpi/arch/arm/kernel/process.c
---- linux-3.18.6/arch/arm/kernel/process.c 2015-02-06 15:53:48.000000000 +0100
-+++ linux-rpi/arch/arm/kernel/process.c 2015-02-09 04:39:42.000000000 +0100
+diff -Nur linux-3.18.8/arch/arm/kernel/process.c linux-rpi/arch/arm/kernel/process.c
+--- linux-3.18.8/arch/arm/kernel/process.c 2015-02-27 02:49:36.000000000 +0100
++++ linux-rpi/arch/arm/kernel/process.c 2015-03-05 14:40:11.141715839 +0100
@@ -166,6 +166,16 @@
}
#endif
@@ -4614,9 +4461,9 @@ diff -Nur linux-3.18.6/arch/arm/kernel/process.c linux-rpi/arch/arm/kernel/proce
/*
* Called by kexec, immediately prior to machine_kexec().
*
-diff -Nur linux-3.18.6/arch/arm/lib/arm-mem.h linux-rpi/arch/arm/lib/arm-mem.h
---- linux-3.18.6/arch/arm/lib/arm-mem.h 1970-01-01 01:00:00.000000000 +0100
-+++ linux-rpi/arch/arm/lib/arm-mem.h 2015-02-09 04:39:42.000000000 +0100
+diff -Nur linux-3.18.8/arch/arm/lib/arm-mem.h linux-rpi/arch/arm/lib/arm-mem.h
+--- linux-3.18.8/arch/arm/lib/arm-mem.h 1970-01-01 01:00:00.000000000 +0100
++++ linux-rpi/arch/arm/lib/arm-mem.h 2015-03-05 14:40:11.145715839 +0100
@@ -0,0 +1,159 @@
+/*
+Copyright (c) 2013, Raspberry Pi Foundation
@@ -4777,9 +4624,9 @@ diff -Nur linux-3.18.6/arch/arm/lib/arm-mem.h linux-rpi/arch/arm/lib/arm-mem.h
+ .endif
+92:
+.endm
-diff -Nur linux-3.18.6/arch/arm/lib/copy_from_user.S linux-rpi/arch/arm/lib/copy_from_user.S
---- linux-3.18.6/arch/arm/lib/copy_from_user.S 2015-02-06 15:53:48.000000000 +0100
-+++ linux-rpi/arch/arm/lib/copy_from_user.S 2015-02-09 04:39:42.000000000 +0100
+diff -Nur linux-3.18.8/arch/arm/lib/copy_from_user.S linux-rpi/arch/arm/lib/copy_from_user.S
+--- linux-3.18.8/arch/arm/lib/copy_from_user.S 2015-02-27 02:49:36.000000000 +0100
++++ linux-rpi/arch/arm/lib/copy_from_user.S 2015-03-05 14:40:11.145715839 +0100
@@ -84,11 +84,13 @@
.text
@@ -4795,9 +4642,9 @@ diff -Nur linux-3.18.6/arch/arm/lib/copy_from_user.S linux-rpi/arch/arm/lib/copy
.pushsection .fixup,"ax"
.align 0
-diff -Nur linux-3.18.6/arch/arm/lib/exports_rpi.c linux-rpi/arch/arm/lib/exports_rpi.c
---- linux-3.18.6/arch/arm/lib/exports_rpi.c 1970-01-01 01:00:00.000000000 +0100
-+++ linux-rpi/arch/arm/lib/exports_rpi.c 2015-02-09 04:39:42.000000000 +0100
+diff -Nur linux-3.18.8/arch/arm/lib/exports_rpi.c linux-rpi/arch/arm/lib/exports_rpi.c
+--- linux-3.18.8/arch/arm/lib/exports_rpi.c 1970-01-01 01:00:00.000000000 +0100
++++ linux-rpi/arch/arm/lib/exports_rpi.c 2015-03-05 14:40:11.145715839 +0100
@@ -0,0 +1,37 @@
+/**
+ * Copyright (c) 2014, Raspberry Pi (Trading) Ltd.
@@ -4836,9 +4683,9 @@ diff -Nur linux-3.18.6/arch/arm/lib/exports_rpi.c linux-rpi/arch/arm/lib/exports
+#include <linux/module.h>
+
+EXPORT_SYMBOL(memcmp);
-diff -Nur linux-3.18.6/arch/arm/lib/Makefile linux-rpi/arch/arm/lib/Makefile
---- linux-3.18.6/arch/arm/lib/Makefile 2015-02-06 15:53:48.000000000 +0100
-+++ linux-rpi/arch/arm/lib/Makefile 2015-02-09 04:39:42.000000000 +0100
+diff -Nur linux-3.18.8/arch/arm/lib/Makefile linux-rpi/arch/arm/lib/Makefile
+--- linux-3.18.8/arch/arm/lib/Makefile 2015-02-27 02:49:36.000000000 +0100
++++ linux-rpi/arch/arm/lib/Makefile 2015-03-05 14:40:11.145715839 +0100
@@ -6,15 +6,24 @@
lib-y := backtrace.o changebit.o csumipv6.o csumpartial.o \
@@ -4867,9 +4714,9 @@ diff -Nur linux-3.18.6/arch/arm/lib/Makefile linux-rpi/arch/arm/lib/Makefile
mmu-y := clear_user.o copy_page.o getuser.o putuser.o
# the code in uaccess.S is not preemption safe and
-diff -Nur linux-3.18.6/arch/arm/lib/memcmp_rpi.S linux-rpi/arch/arm/lib/memcmp_rpi.S
---- linux-3.18.6/arch/arm/lib/memcmp_rpi.S 1970-01-01 01:00:00.000000000 +0100
-+++ linux-rpi/arch/arm/lib/memcmp_rpi.S 2015-02-09 04:39:42.000000000 +0100
+diff -Nur linux-3.18.8/arch/arm/lib/memcmp_rpi.S linux-rpi/arch/arm/lib/memcmp_rpi.S
+--- linux-3.18.8/arch/arm/lib/memcmp_rpi.S 1970-01-01 01:00:00.000000000 +0100
++++ linux-rpi/arch/arm/lib/memcmp_rpi.S 2015-03-05 14:40:11.145715839 +0100
@@ -0,0 +1,285 @@
+/*
+Copyright (c) 2013, Raspberry Pi Foundation
@@ -5156,9 +5003,9 @@ diff -Nur linux-3.18.6/arch/arm/lib/memcmp_rpi.S linux-rpi/arch/arm/lib/memcmp_r
+ .unreq DAT7
+ .unreq OFF
+ENDPROC(memcmp)
-diff -Nur linux-3.18.6/arch/arm/lib/memcpymove.h linux-rpi/arch/arm/lib/memcpymove.h
---- linux-3.18.6/arch/arm/lib/memcpymove.h 1970-01-01 01:00:00.000000000 +0100
-+++ linux-rpi/arch/arm/lib/memcpymove.h 2015-02-09 04:39:42.000000000 +0100
+diff -Nur linux-3.18.8/arch/arm/lib/memcpymove.h linux-rpi/arch/arm/lib/memcpymove.h
+--- linux-3.18.8/arch/arm/lib/memcpymove.h 1970-01-01 01:00:00.000000000 +0100
++++ linux-rpi/arch/arm/lib/memcpymove.h 2015-03-05 14:40:11.145715839 +0100
@@ -0,0 +1,506 @@
+/*
+Copyright (c) 2013, Raspberry Pi Foundation
@@ -5666,9 +5513,9 @@ diff -Nur linux-3.18.6/arch/arm/lib/memcpymove.h linux-rpi/arch/arm/lib/memcpymo
+ .unreq LAST
+ .unreq OFF
+.endm
-diff -Nur linux-3.18.6/arch/arm/lib/memcpy_rpi.S linux-rpi/arch/arm/lib/memcpy_rpi.S
---- linux-3.18.6/arch/arm/lib/memcpy_rpi.S 1970-01-01 01:00:00.000000000 +0100
-+++ linux-rpi/arch/arm/lib/memcpy_rpi.S 2015-02-09 04:39:42.000000000 +0100
+diff -Nur linux-3.18.8/arch/arm/lib/memcpy_rpi.S linux-rpi/arch/arm/lib/memcpy_rpi.S
+--- linux-3.18.8/arch/arm/lib/memcpy_rpi.S 1970-01-01 01:00:00.000000000 +0100
++++ linux-rpi/arch/arm/lib/memcpy_rpi.S 2015-03-05 14:40:11.145715839 +0100
@@ -0,0 +1,59 @@
+/*
+Copyright (c) 2013, Raspberry Pi Foundation
@@ -5729,9 +5576,9 @@ diff -Nur linux-3.18.6/arch/arm/lib/memcpy_rpi.S linux-rpi/arch/arm/lib/memcpy_r
+ENTRY(memcpy)
+ memcpy 0
+ENDPROC(memcpy)
-diff -Nur linux-3.18.6/arch/arm/lib/memmove_rpi.S linux-rpi/arch/arm/lib/memmove_rpi.S
---- linux-3.18.6/arch/arm/lib/memmove_rpi.S 1970-01-01 01:00:00.000000000 +0100
-+++ linux-rpi/arch/arm/lib/memmove_rpi.S 2015-02-09 04:39:42.000000000 +0100
+diff -Nur linux-3.18.8/arch/arm/lib/memmove_rpi.S linux-rpi/arch/arm/lib/memmove_rpi.S
+--- linux-3.18.8/arch/arm/lib/memmove_rpi.S 1970-01-01 01:00:00.000000000 +0100
++++ linux-rpi/arch/arm/lib/memmove_rpi.S 2015-03-05 14:40:11.145715839 +0100
@@ -0,0 +1,61 @@
+/*
+Copyright (c) 2013, Raspberry Pi Foundation
@@ -5794,9 +5641,9 @@ diff -Nur linux-3.18.6/arch/arm/lib/memmove_rpi.S linux-rpi/arch/arm/lib/memmove
+ bpl memcpy /* pl works even over -1 - 0 and 0x7fffffff - 0x80000000 boundaries */
+ memcpy 1
+ENDPROC(memmove)
-diff -Nur linux-3.18.6/arch/arm/lib/memset_rpi.S linux-rpi/arch/arm/lib/memset_rpi.S
---- linux-3.18.6/arch/arm/lib/memset_rpi.S 1970-01-01 01:00:00.000000000 +0100
-+++ linux-rpi/arch/arm/lib/memset_rpi.S 2015-02-09 04:39:42.000000000 +0100
+diff -Nur linux-3.18.8/arch/arm/lib/memset_rpi.S linux-rpi/arch/arm/lib/memset_rpi.S
+--- linux-3.18.8/arch/arm/lib/memset_rpi.S 1970-01-01 01:00:00.000000000 +0100
++++ linux-rpi/arch/arm/lib/memset_rpi.S 2015-03-05 14:40:11.145715839 +0100
@@ -0,0 +1,121 @@
+/*
+Copyright (c) 2013, Raspberry Pi Foundation
@@ -5919,9 +5766,9 @@ diff -Nur linux-3.18.6/arch/arm/lib/memset_rpi.S linux-rpi/arch/arm/lib/memset_r
+ .unreq DAT2
+ .unreq DAT3
+ENDPROC(memset)
-diff -Nur linux-3.18.6/arch/arm/lib/uaccess_with_memcpy.c linux-rpi/arch/arm/lib/uaccess_with_memcpy.c
---- linux-3.18.6/arch/arm/lib/uaccess_with_memcpy.c 2015-02-06 15:53:48.000000000 +0100
-+++ linux-rpi/arch/arm/lib/uaccess_with_memcpy.c 2015-02-09 04:39:42.000000000 +0100
+diff -Nur linux-3.18.8/arch/arm/lib/uaccess_with_memcpy.c linux-rpi/arch/arm/lib/uaccess_with_memcpy.c
+--- linux-3.18.8/arch/arm/lib/uaccess_with_memcpy.c 2015-02-27 02:49:36.000000000 +0100
++++ linux-rpi/arch/arm/lib/uaccess_with_memcpy.c 2015-03-05 14:40:11.145715839 +0100
@@ -22,6 +22,14 @@
#include <asm/current.h>
#include <asm/page.h>
@@ -6065,9 +5912,9 @@ diff -Nur linux-3.18.6/arch/arm/lib/uaccess_with_memcpy.c linux-rpi/arch/arm/lib
static unsigned long noinline
__clear_user_memset(void __user *addr, unsigned long n)
-diff -Nur linux-3.18.6/arch/arm/mach-bcm2708/armctrl.c linux-rpi/arch/arm/mach-bcm2708/armctrl.c
---- linux-3.18.6/arch/arm/mach-bcm2708/armctrl.c 1970-01-01 01:00:00.000000000 +0100
-+++ linux-rpi/arch/arm/mach-bcm2708/armctrl.c 2015-02-09 04:39:42.000000000 +0100
+diff -Nur linux-3.18.8/arch/arm/mach-bcm2708/armctrl.c linux-rpi/arch/arm/mach-bcm2708/armctrl.c
+--- linux-3.18.8/arch/arm/mach-bcm2708/armctrl.c 1970-01-01 01:00:00.000000000 +0100
++++ linux-rpi/arch/arm/mach-bcm2708/armctrl.c 2015-03-05 14:40:11.153715839 +0100
@@ -0,0 +1,315 @@
+/*
+ * linux/arch/arm/mach-bcm2708/armctrl.c
@@ -6384,9 +6231,9 @@ diff -Nur linux-3.18.6/arch/arm/mach-bcm2708/armctrl.c linux-rpi/arch/arm/mach-b
+ armctrl_dt_init();
+ return 0;
+}
-diff -Nur linux-3.18.6/arch/arm/mach-bcm2708/armctrl.h linux-rpi/arch/arm/mach-bcm2708/armctrl.h
---- linux-3.18.6/arch/arm/mach-bcm2708/armctrl.h 1970-01-01 01:00:00.000000000 +0100
-+++ linux-rpi/arch/arm/mach-bcm2708/armctrl.h 2015-02-09 04:39:42.000000000 +0100
+diff -Nur linux-3.18.8/arch/arm/mach-bcm2708/armctrl.h linux-rpi/arch/arm/mach-bcm2708/armctrl.h
+--- linux-3.18.8/arch/arm/mach-bcm2708/armctrl.h 1970-01-01 01:00:00.000000000 +0100
++++ linux-rpi/arch/arm/mach-bcm2708/armctrl.h 2015-03-05 14:40:11.153715839 +0100
@@ -0,0 +1,27 @@
+/*
+ * linux/arch/arm/mach-bcm2708/armctrl.h
@@ -6415,9 +6262,9 @@ diff -Nur linux-3.18.6/arch/arm/mach-bcm2708/armctrl.h linux-rpi/arch/arm/mach-b
+ u32 armctrl_sources, u32 resume_sources);
+
+#endif
-diff -Nur linux-3.18.6/arch/arm/mach-bcm2708/bcm2708.c linux-rpi/arch/arm/mach-bcm2708/bcm2708.c
---- linux-3.18.6/arch/arm/mach-bcm2708/bcm2708.c 1970-01-01 01:00:00.000000000 +0100
-+++ linux-rpi/arch/arm/mach-bcm2708/bcm2708.c 2015-02-09 04:39:42.000000000 +0100
+diff -Nur linux-3.18.8/arch/arm/mach-bcm2708/bcm2708.c linux-rpi/arch/arm/mach-bcm2708/bcm2708.c
+--- linux-3.18.8/arch/arm/mach-bcm2708/bcm2708.c 1970-01-01 01:00:00.000000000 +0100
++++ linux-rpi/arch/arm/mach-bcm2708/bcm2708.c 2015-03-05 14:40:11.153715839 +0100
@@ -0,0 +1,1132 @@
+/*
+ * linux/arch/arm/mach-bcm2708/bcm2708.c
@@ -7551,9 +7398,9 @@ diff -Nur linux-3.18.6/arch/arm/mach-bcm2708/bcm2708.c linux-rpi/arch/arm/mach-b
+MODULE_PARM_DESC(pps_gpio_pin, "Set GPIO pin to reserve for PPS");
+module_param(vc_i2c_override, bool, 0644);
+MODULE_PARM_DESC(vc_i2c_override, "Allow the use of VC's I2C peripheral.");
-diff -Nur linux-3.18.6/arch/arm/mach-bcm2708/bcm2708_gpio.c linux-rpi/arch/arm/mach-bcm2708/bcm2708_gpio.c
---- linux-3.18.6/arch/arm/mach-bcm2708/bcm2708_gpio.c 1970-01-01 01:00:00.000000000 +0100
-+++ linux-rpi/arch/arm/mach-bcm2708/bcm2708_gpio.c 2015-02-09 04:39:42.000000000 +0100
+diff -Nur linux-3.18.8/arch/arm/mach-bcm2708/bcm2708_gpio.c linux-rpi/arch/arm/mach-bcm2708/bcm2708_gpio.c
+--- linux-3.18.8/arch/arm/mach-bcm2708/bcm2708_gpio.c 1970-01-01 01:00:00.000000000 +0100
++++ linux-rpi/arch/arm/mach-bcm2708/bcm2708_gpio.c 2015-03-05 14:40:11.153715839 +0100
@@ -0,0 +1,426 @@
+/*
+ * linux/arch/arm/mach-bcm2708/bcm2708_gpio.c
@@ -7981,9 +7828,9 @@ diff -Nur linux-3.18.6/arch/arm/mach-bcm2708/bcm2708_gpio.c linux-rpi/arch/arm/m
+
+MODULE_DESCRIPTION("Broadcom BCM2708 GPIO driver");
+MODULE_LICENSE("GPL");
-diff -Nur linux-3.18.6/arch/arm/mach-bcm2708/bcm2708.h linux-rpi/arch/arm/mach-bcm2708/bcm2708.h
---- linux-3.18.6/arch/arm/mach-bcm2708/bcm2708.h 1970-01-01 01:00:00.000000000 +0100
-+++ linux-rpi/arch/arm/mach-bcm2708/bcm2708.h 2015-02-09 04:39:42.000000000 +0100
+diff -Nur linux-3.18.8/arch/arm/mach-bcm2708/bcm2708.h linux-rpi/arch/arm/mach-bcm2708/bcm2708.h
+--- linux-3.18.8/arch/arm/mach-bcm2708/bcm2708.h 1970-01-01 01:00:00.000000000 +0100
++++ linux-rpi/arch/arm/mach-bcm2708/bcm2708.h 2015-03-05 14:40:11.153715839 +0100
@@ -0,0 +1,49 @@
+/*
+ * linux/arch/arm/mach-bcm2708/bcm2708.h
@@ -8034,9 +7881,9 @@ diff -Nur linux-3.18.6/arch/arm/mach-bcm2708/bcm2708.h linux-rpi/arch/arm/mach-b
+}
+
+#endif
-diff -Nur linux-3.18.6/arch/arm/mach-bcm2708/dma.c linux-rpi/arch/arm/mach-bcm2708/dma.c
---- linux-3.18.6/arch/arm/mach-bcm2708/dma.c 1970-01-01 01:00:00.000000000 +0100
-+++ linux-rpi/arch/arm/mach-bcm2708/dma.c 2015-02-09 04:39:42.000000000 +0100
+diff -Nur linux-3.18.8/arch/arm/mach-bcm2708/dma.c linux-rpi/arch/arm/mach-bcm2708/dma.c
+--- linux-3.18.8/arch/arm/mach-bcm2708/dma.c 1970-01-01 01:00:00.000000000 +0100
++++ linux-rpi/arch/arm/mach-bcm2708/dma.c 2015-03-05 14:40:11.153715839 +0100
@@ -0,0 +1,409 @@
+/*
+ * linux/arch/arm/mach-bcm2708/dma.c
@@ -8447,9 +8294,9 @@ diff -Nur linux-3.18.6/arch/arm/mach-bcm2708/dma.c linux-rpi/arch/arm/mach-bcm27
+MODULE_LICENSE("GPL");
+
+MODULE_PARM_DESC(dmachans, "Bitmap of DMA channels available to the ARM");
-diff -Nur linux-3.18.6/arch/arm/mach-bcm2708/include/mach/arm_control.h linux-rpi/arch/arm/mach-bcm2708/include/mach/arm_control.h
---- linux-3.18.6/arch/arm/mach-bcm2708/include/mach/arm_control.h 1970-01-01 01:00:00.000000000 +0100
-+++ linux-rpi/arch/arm/mach-bcm2708/include/mach/arm_control.h 2015-02-09 04:39:42.000000000 +0100
+diff -Nur linux-3.18.8/arch/arm/mach-bcm2708/include/mach/arm_control.h linux-rpi/arch/arm/mach-bcm2708/include/mach/arm_control.h
+--- linux-3.18.8/arch/arm/mach-bcm2708/include/mach/arm_control.h 1970-01-01 01:00:00.000000000 +0100
++++ linux-rpi/arch/arm/mach-bcm2708/include/mach/arm_control.h 2015-03-05 14:40:11.153715839 +0100
@@ -0,0 +1,419 @@
+/*
+ * linux/arch/arm/mach-bcm2708/arm_control.h
@@ -8870,9 +8717,9 @@ diff -Nur linux-3.18.6/arch/arm/mach-bcm2708/include/mach/arm_control.h linux-rp
+#define AJBTDO HW_REGISTER_RW(AJB_BASE+0x0c)
+
+#endif
-diff -Nur linux-3.18.6/arch/arm/mach-bcm2708/include/mach/arm_power.h linux-rpi/arch/arm/mach-bcm2708/include/mach/arm_power.h
---- linux-3.18.6/arch/arm/mach-bcm2708/include/mach/arm_power.h 1970-01-01 01:00:00.000000000 +0100
-+++ linux-rpi/arch/arm/mach-bcm2708/include/mach/arm_power.h 2015-02-09 04:39:42.000000000 +0100
+diff -Nur linux-3.18.8/arch/arm/mach-bcm2708/include/mach/arm_power.h linux-rpi/arch/arm/mach-bcm2708/include/mach/arm_power.h
+--- linux-3.18.8/arch/arm/mach-bcm2708/include/mach/arm_power.h 1970-01-01 01:00:00.000000000 +0100
++++ linux-rpi/arch/arm/mach-bcm2708/include/mach/arm_power.h 2015-03-05 14:40:11.153715839 +0100
@@ -0,0 +1,62 @@
+/*
+ * linux/arch/arm/mach-bcm2708/include/mach/arm_power.h
@@ -8936,9 +8783,9 @@ diff -Nur linux-3.18.6/arch/arm/mach-bcm2708/include/mach/arm_power.h linux-rpi/
+};
+
+#endif
-diff -Nur linux-3.18.6/arch/arm/mach-bcm2708/include/mach/clkdev.h linux-rpi/arch/arm/mach-bcm2708/include/mach/clkdev.h
---- linux-3.18.6/arch/arm/mach-bcm2708/include/mach/clkdev.h 1970-01-01 01:00:00.000000000 +0100
-+++ linux-rpi/arch/arm/mach-bcm2708/include/mach/clkdev.h 2015-02-09 04:39:42.000000000 +0100
+diff -Nur linux-3.18.8/arch/arm/mach-bcm2708/include/mach/clkdev.h linux-rpi/arch/arm/mach-bcm2708/include/mach/clkdev.h
+--- linux-3.18.8/arch/arm/mach-bcm2708/include/mach/clkdev.h 1970-01-01 01:00:00.000000000 +0100
++++ linux-rpi/arch/arm/mach-bcm2708/include/mach/clkdev.h 2015-03-05 14:40:11.153715839 +0100
@@ -0,0 +1,7 @@
+#ifndef __ASM_MACH_CLKDEV_H
+#define __ASM_MACH_CLKDEV_H
@@ -8947,9 +8794,9 @@ diff -Nur linux-3.18.6/arch/arm/mach-bcm2708/include/mach/clkdev.h linux-rpi/arc
+#define __clk_put(clk) do { } while (0)
+
+#endif
-diff -Nur linux-3.18.6/arch/arm/mach-bcm2708/include/mach/debug-macro.S linux-rpi/arch/arm/mach-bcm2708/include/mach/debug-macro.S
---- linux-3.18.6/arch/arm/mach-bcm2708/include/mach/debug-macro.S 1970-01-01 01:00:00.000000000 +0100
-+++ linux-rpi/arch/arm/mach-bcm2708/include/mach/debug-macro.S 2015-02-09 04:39:42.000000000 +0100
+diff -Nur linux-3.18.8/arch/arm/mach-bcm2708/include/mach/debug-macro.S linux-rpi/arch/arm/mach-bcm2708/include/mach/debug-macro.S
+--- linux-3.18.8/arch/arm/mach-bcm2708/include/mach/debug-macro.S 1970-01-01 01:00:00.000000000 +0100
++++ linux-rpi/arch/arm/mach-bcm2708/include/mach/debug-macro.S 2015-03-05 14:40:11.153715839 +0100
@@ -0,0 +1,22 @@
+/* arch/arm/mach-bcm2708/include/mach/debug-macro.S
+ *
@@ -8973,9 +8820,9 @@ diff -Nur linux-3.18.6/arch/arm/mach-bcm2708/include/mach/debug-macro.S linux-rp
+ .endm
+
+#include <debug/pl01x.S>
-diff -Nur linux-3.18.6/arch/arm/mach-bcm2708/include/mach/dma.h linux-rpi/arch/arm/mach-bcm2708/include/mach/dma.h
---- linux-3.18.6/arch/arm/mach-bcm2708/include/mach/dma.h 1970-01-01 01:00:00.000000000 +0100
-+++ linux-rpi/arch/arm/mach-bcm2708/include/mach/dma.h 2015-02-09 04:39:42.000000000 +0100
+diff -Nur linux-3.18.8/arch/arm/mach-bcm2708/include/mach/dma.h linux-rpi/arch/arm/mach-bcm2708/include/mach/dma.h
+--- linux-3.18.8/arch/arm/mach-bcm2708/include/mach/dma.h 1970-01-01 01:00:00.000000000 +0100
++++ linux-rpi/arch/arm/mach-bcm2708/include/mach/dma.h 2015-03-05 14:40:11.153715839 +0100
@@ -0,0 +1,94 @@
+/*
+ * linux/arch/arm/mach-bcm2708/include/mach/dma.h
@@ -9071,9 +8918,9 @@ diff -Nur linux-3.18.6/arch/arm/mach-bcm2708/include/mach/dma.h linux-rpi/arch/a
+
+
+#endif /* _MACH_BCM2708_DMA_H */
-diff -Nur linux-3.18.6/arch/arm/mach-bcm2708/include/mach/entry-macro.S linux-rpi/arch/arm/mach-bcm2708/include/mach/entry-macro.S
---- linux-3.18.6/arch/arm/mach-bcm2708/include/mach/entry-macro.S 1970-01-01 01:00:00.000000000 +0100
-+++ linux-rpi/arch/arm/mach-bcm2708/include/mach/entry-macro.S 2015-02-09 04:39:42.000000000 +0100
+diff -Nur linux-3.18.8/arch/arm/mach-bcm2708/include/mach/entry-macro.S linux-rpi/arch/arm/mach-bcm2708/include/mach/entry-macro.S
+--- linux-3.18.8/arch/arm/mach-bcm2708/include/mach/entry-macro.S 1970-01-01 01:00:00.000000000 +0100
++++ linux-rpi/arch/arm/mach-bcm2708/include/mach/entry-macro.S 2015-03-05 14:40:11.153715839 +0100
@@ -0,0 +1,69 @@
+/*
+ * arch/arm/mach-bcm2708/include/mach/entry-macro.S
@@ -9144,9 +8991,9 @@ diff -Nur linux-3.18.6/arch/arm/mach-bcm2708/include/mach/entry-macro.S linux-rp
+1020: @ EQ will be set if no irqs pending
+
+ .endm
-diff -Nur linux-3.18.6/arch/arm/mach-bcm2708/include/mach/frc.h linux-rpi/arch/arm/mach-bcm2708/include/mach/frc.h
---- linux-3.18.6/arch/arm/mach-bcm2708/include/mach/frc.h 1970-01-01 01:00:00.000000000 +0100
-+++ linux-rpi/arch/arm/mach-bcm2708/include/mach/frc.h 2015-02-09 04:39:42.000000000 +0100
+diff -Nur linux-3.18.8/arch/arm/mach-bcm2708/include/mach/frc.h linux-rpi/arch/arm/mach-bcm2708/include/mach/frc.h
+--- linux-3.18.8/arch/arm/mach-bcm2708/include/mach/frc.h 1970-01-01 01:00:00.000000000 +0100
++++ linux-rpi/arch/arm/mach-bcm2708/include/mach/frc.h 2015-03-05 14:40:11.153715839 +0100
@@ -0,0 +1,38 @@
+/*
+ * arch/arm/mach-bcm2708/include/mach/timex.h
@@ -9186,9 +9033,9 @@ diff -Nur linux-3.18.6/arch/arm/mach-bcm2708/include/mach/frc.h linux-rpi/arch/a
+extern unsigned long long frc_clock_ticks63(void);
+
+#endif
-diff -Nur linux-3.18.6/arch/arm/mach-bcm2708/include/mach/gpio.h linux-rpi/arch/arm/mach-bcm2708/include/mach/gpio.h
---- linux-3.18.6/arch/arm/mach-bcm2708/include/mach/gpio.h 1970-01-01 01:00:00.000000000 +0100
-+++ linux-rpi/arch/arm/mach-bcm2708/include/mach/gpio.h 2015-02-09 04:39:42.000000000 +0100
+diff -Nur linux-3.18.8/arch/arm/mach-bcm2708/include/mach/gpio.h linux-rpi/arch/arm/mach-bcm2708/include/mach/gpio.h
+--- linux-3.18.8/arch/arm/mach-bcm2708/include/mach/gpio.h 1970-01-01 01:00:00.000000000 +0100
++++ linux-rpi/arch/arm/mach-bcm2708/include/mach/gpio.h 2015-03-05 14:40:11.153715839 +0100
@@ -0,0 +1,17 @@
+/*
+ * arch/arm/mach-bcm2708/include/mach/gpio.h
@@ -9207,9 +9054,9 @@ diff -Nur linux-3.18.6/arch/arm/mach-bcm2708/include/mach/gpio.h linux-rpi/arch/
+#define irq_to_gpio(x) ((x) - GPIO_IRQ_START)
+
+#endif
-diff -Nur linux-3.18.6/arch/arm/mach-bcm2708/include/mach/hardware.h linux-rpi/arch/arm/mach-bcm2708/include/mach/hardware.h
---- linux-3.18.6/arch/arm/mach-bcm2708/include/mach/hardware.h 1970-01-01 01:00:00.000000000 +0100
-+++ linux-rpi/arch/arm/mach-bcm2708/include/mach/hardware.h 2015-02-09 04:39:42.000000000 +0100
+diff -Nur linux-3.18.8/arch/arm/mach-bcm2708/include/mach/hardware.h linux-rpi/arch/arm/mach-bcm2708/include/mach/hardware.h
+--- linux-3.18.8/arch/arm/mach-bcm2708/include/mach/hardware.h 1970-01-01 01:00:00.000000000 +0100
++++ linux-rpi/arch/arm/mach-bcm2708/include/mach/hardware.h 2015-03-05 14:40:11.153715839 +0100
@@ -0,0 +1,28 @@
+/*
+ * arch/arm/mach-bcm2708/include/mach/hardware.h
@@ -9239,9 +9086,9 @@ diff -Nur linux-3.18.6/arch/arm/mach-bcm2708/include/mach/hardware.h linux-rpi/a
+#include <mach/platform.h>
+
+#endif
-diff -Nur linux-3.18.6/arch/arm/mach-bcm2708/include/mach/io.h linux-rpi/arch/arm/mach-bcm2708/include/mach/io.h
---- linux-3.18.6/arch/arm/mach-bcm2708/include/mach/io.h 1970-01-01 01:00:00.000000000 +0100
-+++ linux-rpi/arch/arm/mach-bcm2708/include/mach/io.h 2015-02-09 04:39:42.000000000 +0100
+diff -Nur linux-3.18.8/arch/arm/mach-bcm2708/include/mach/io.h linux-rpi/arch/arm/mach-bcm2708/include/mach/io.h
+--- linux-3.18.8/arch/arm/mach-bcm2708/include/mach/io.h 1970-01-01 01:00:00.000000000 +0100
++++ linux-rpi/arch/arm/mach-bcm2708/include/mach/io.h 2015-03-05 14:40:11.153715839 +0100
@@ -0,0 +1,27 @@
+/*
+ * arch/arm/mach-bcm2708/include/mach/io.h
@@ -9270,9 +9117,9 @@ diff -Nur linux-3.18.6/arch/arm/mach-bcm2708/include/mach/io.h linux-rpi/arch/ar
+#define __io(a) __typesafe_io(a)
+
+#endif
-diff -Nur linux-3.18.6/arch/arm/mach-bcm2708/include/mach/irqs.h linux-rpi/arch/arm/mach-bcm2708/include/mach/irqs.h
---- linux-3.18.6/arch/arm/mach-bcm2708/include/mach/irqs.h 1970-01-01 01:00:00.000000000 +0100
-+++ linux-rpi/arch/arm/mach-bcm2708/include/mach/irqs.h 2015-02-09 04:39:42.000000000 +0100
+diff -Nur linux-3.18.8/arch/arm/mach-bcm2708/include/mach/irqs.h linux-rpi/arch/arm/mach-bcm2708/include/mach/irqs.h
+--- linux-3.18.8/arch/arm/mach-bcm2708/include/mach/irqs.h 1970-01-01 01:00:00.000000000 +0100
++++ linux-rpi/arch/arm/mach-bcm2708/include/mach/irqs.h 2015-03-05 14:40:11.153715839 +0100
@@ -0,0 +1,199 @@
+/*
+ * arch/arm/mach-bcm2708/include/mach/irqs.h
@@ -9473,9 +9320,9 @@ diff -Nur linux-3.18.6/arch/arm/mach-bcm2708/include/mach/irqs.h linux-rpi/arch/
+#define NR_IRQS (BCM2708_ALLOC_IRQS+FREE_IRQS)
+
+#endif /* _BCM2708_IRQS_H_ */
-diff -Nur linux-3.18.6/arch/arm/mach-bcm2708/include/mach/memory.h linux-rpi/arch/arm/mach-bcm2708/include/mach/memory.h
---- linux-3.18.6/arch/arm/mach-bcm2708/include/mach/memory.h 1970-01-01 01:00:00.000000000 +0100
-+++ linux-rpi/arch/arm/mach-bcm2708/include/mach/memory.h 2015-02-09 04:39:42.000000000 +0100
+diff -Nur linux-3.18.8/arch/arm/mach-bcm2708/include/mach/memory.h linux-rpi/arch/arm/mach-bcm2708/include/mach/memory.h
+--- linux-3.18.8/arch/arm/mach-bcm2708/include/mach/memory.h 1970-01-01 01:00:00.000000000 +0100
++++ linux-rpi/arch/arm/mach-bcm2708/include/mach/memory.h 2015-03-05 14:40:11.153715839 +0100
@@ -0,0 +1,57 @@
+/*
+ * arch/arm/mach-bcm2708/include/mach/memory.h
@@ -9534,9 +9381,9 @@ diff -Nur linux-3.18.6/arch/arm/mach-bcm2708/include/mach/memory.h linux-rpi/arc
+#define __bus_to_pfn(x) __phys_to_pfn((x) - (BUS_OFFSET - BCM_PLAT_PHYS_OFFSET))
+
+#endif
-diff -Nur linux-3.18.6/arch/arm/mach-bcm2708/include/mach/platform.h linux-rpi/arch/arm/mach-bcm2708/include/mach/platform.h
---- linux-3.18.6/arch/arm/mach-bcm2708/include/mach/platform.h 1970-01-01 01:00:00.000000000 +0100
-+++ linux-rpi/arch/arm/mach-bcm2708/include/mach/platform.h 2015-02-09 04:39:42.000000000 +0100
+diff -Nur linux-3.18.8/arch/arm/mach-bcm2708/include/mach/platform.h linux-rpi/arch/arm/mach-bcm2708/include/mach/platform.h
+--- linux-3.18.8/arch/arm/mach-bcm2708/include/mach/platform.h 1970-01-01 01:00:00.000000000 +0100
++++ linux-rpi/arch/arm/mach-bcm2708/include/mach/platform.h 2015-03-05 14:40:11.153715839 +0100
@@ -0,0 +1,228 @@
+/*
+ * arch/arm/mach-bcm2708/include/mach/platform.h
@@ -9766,9 +9613,9 @@ diff -Nur linux-3.18.6/arch/arm/mach-bcm2708/include/mach/platform.h linux-rpi/a
+#endif
+
+/* END */
-diff -Nur linux-3.18.6/arch/arm/mach-bcm2708/include/mach/power.h linux-rpi/arch/arm/mach-bcm2708/include/mach/power.h
---- linux-3.18.6/arch/arm/mach-bcm2708/include/mach/power.h 1970-01-01 01:00:00.000000000 +0100
-+++ linux-rpi/arch/arm/mach-bcm2708/include/mach/power.h 2015-02-09 04:39:42.000000000 +0100
+diff -Nur linux-3.18.8/arch/arm/mach-bcm2708/include/mach/power.h linux-rpi/arch/arm/mach-bcm2708/include/mach/power.h
+--- linux-3.18.8/arch/arm/mach-bcm2708/include/mach/power.h 1970-01-01 01:00:00.000000000 +0100
++++ linux-rpi/arch/arm/mach-bcm2708/include/mach/power.h 2015-03-05 14:40:11.153715839 +0100
@@ -0,0 +1,26 @@
+/*
+ * linux/arch/arm/mach-bcm2708/power.h
@@ -9796,9 +9643,9 @@ diff -Nur linux-3.18.6/arch/arm/mach-bcm2708/include/mach/power.h linux-rpi/arch
+extern int bcm_power_close(BCM_POWER_HANDLE_T handle);
+
+#endif
-diff -Nur linux-3.18.6/arch/arm/mach-bcm2708/include/mach/system.h linux-rpi/arch/arm/mach-bcm2708/include/mach/system.h
---- linux-3.18.6/arch/arm/mach-bcm2708/include/mach/system.h 1970-01-01 01:00:00.000000000 +0100
-+++ linux-rpi/arch/arm/mach-bcm2708/include/mach/system.h 2015-02-09 04:39:42.000000000 +0100
+diff -Nur linux-3.18.8/arch/arm/mach-bcm2708/include/mach/system.h linux-rpi/arch/arm/mach-bcm2708/include/mach/system.h
+--- linux-3.18.8/arch/arm/mach-bcm2708/include/mach/system.h 1970-01-01 01:00:00.000000000 +0100
++++ linux-rpi/arch/arm/mach-bcm2708/include/mach/system.h 2015-03-05 14:40:11.153715839 +0100
@@ -0,0 +1,38 @@
+/*
+ * arch/arm/mach-bcm2708/include/mach/system.h
@@ -9838,9 +9685,9 @@ diff -Nur linux-3.18.6/arch/arm/mach-bcm2708/include/mach/system.h linux-rpi/arc
+}
+
+#endif
-diff -Nur linux-3.18.6/arch/arm/mach-bcm2708/include/mach/timex.h linux-rpi/arch/arm/mach-bcm2708/include/mach/timex.h
---- linux-3.18.6/arch/arm/mach-bcm2708/include/mach/timex.h 1970-01-01 01:00:00.000000000 +0100
-+++ linux-rpi/arch/arm/mach-bcm2708/include/mach/timex.h 2015-02-09 04:39:42.000000000 +0100
+diff -Nur linux-3.18.8/arch/arm/mach-bcm2708/include/mach/timex.h linux-rpi/arch/arm/mach-bcm2708/include/mach/timex.h
+--- linux-3.18.8/arch/arm/mach-bcm2708/include/mach/timex.h 1970-01-01 01:00:00.000000000 +0100
++++ linux-rpi/arch/arm/mach-bcm2708/include/mach/timex.h 2015-03-05 14:40:11.153715839 +0100
@@ -0,0 +1,23 @@
+/*
+ * arch/arm/mach-bcm2708/include/mach/timex.h
@@ -9865,9 +9712,9 @@ diff -Nur linux-3.18.6/arch/arm/mach-bcm2708/include/mach/timex.h linux-rpi/arch
+ */
+
+#define CLOCK_TICK_RATE (1000000)
-diff -Nur linux-3.18.6/arch/arm/mach-bcm2708/include/mach/uncompress.h linux-rpi/arch/arm/mach-bcm2708/include/mach/uncompress.h
---- linux-3.18.6/arch/arm/mach-bcm2708/include/mach/uncompress.h 1970-01-01 01:00:00.000000000 +0100
-+++ linux-rpi/arch/arm/mach-bcm2708/include/mach/uncompress.h 2015-02-09 04:39:42.000000000 +0100
+diff -Nur linux-3.18.8/arch/arm/mach-bcm2708/include/mach/uncompress.h linux-rpi/arch/arm/mach-bcm2708/include/mach/uncompress.h
+--- linux-3.18.8/arch/arm/mach-bcm2708/include/mach/uncompress.h 1970-01-01 01:00:00.000000000 +0100
++++ linux-rpi/arch/arm/mach-bcm2708/include/mach/uncompress.h 2015-03-05 14:40:11.153715839 +0100
@@ -0,0 +1,84 @@
+/*
+ * arch/arm/mach-bcn2708/include/mach/uncompress.h
@@ -9953,9 +9800,9 @@ diff -Nur linux-3.18.6/arch/arm/mach-bcm2708/include/mach/uncompress.h linux-rpi
+ * nothing to do
+ */
+#define arch_decomp_wdog()
-diff -Nur linux-3.18.6/arch/arm/mach-bcm2708/include/mach/vcio.h linux-rpi/arch/arm/mach-bcm2708/include/mach/vcio.h
---- linux-3.18.6/arch/arm/mach-bcm2708/include/mach/vcio.h 1970-01-01 01:00:00.000000000 +0100
-+++ linux-rpi/arch/arm/mach-bcm2708/include/mach/vcio.h 2015-02-09 04:39:42.000000000 +0100
+diff -Nur linux-3.18.8/arch/arm/mach-bcm2708/include/mach/vcio.h linux-rpi/arch/arm/mach-bcm2708/include/mach/vcio.h
+--- linux-3.18.8/arch/arm/mach-bcm2708/include/mach/vcio.h 1970-01-01 01:00:00.000000000 +0100
++++ linux-rpi/arch/arm/mach-bcm2708/include/mach/vcio.h 2015-03-05 14:40:11.153715839 +0100
@@ -0,0 +1,165 @@
+/*
+ * arch/arm/mach-bcm2708/include/mach/vcio.h
@@ -10122,9 +9969,9 @@ diff -Nur linux-3.18.6/arch/arm/mach-bcm2708/include/mach/vcio.h linux-rpi/arch/
+#define DEVICE_FILE_NAME "vcio"
+
+#endif
-diff -Nur linux-3.18.6/arch/arm/mach-bcm2708/include/mach/vc_mem.h linux-rpi/arch/arm/mach-bcm2708/include/mach/vc_mem.h
---- linux-3.18.6/arch/arm/mach-bcm2708/include/mach/vc_mem.h 1970-01-01 01:00:00.000000000 +0100
-+++ linux-rpi/arch/arm/mach-bcm2708/include/mach/vc_mem.h 2015-02-09 04:39:42.000000000 +0100
+diff -Nur linux-3.18.8/arch/arm/mach-bcm2708/include/mach/vc_mem.h linux-rpi/arch/arm/mach-bcm2708/include/mach/vc_mem.h
+--- linux-3.18.8/arch/arm/mach-bcm2708/include/mach/vc_mem.h 1970-01-01 01:00:00.000000000 +0100
++++ linux-rpi/arch/arm/mach-bcm2708/include/mach/vc_mem.h 2015-03-05 14:40:11.153715839 +0100
@@ -0,0 +1,35 @@
+/*****************************************************************************
+* Copyright 2010 - 2011 Broadcom Corporation. All rights reserved.
@@ -10161,9 +10008,9 @@ diff -Nur linux-3.18.6/arch/arm/mach-bcm2708/include/mach/vc_mem.h linux-rpi/arc
+#endif
+
+#endif /* VC_MEM_H */
-diff -Nur linux-3.18.6/arch/arm/mach-bcm2708/include/mach/vc_sm_defs.h linux-rpi/arch/arm/mach-bcm2708/include/mach/vc_sm_defs.h
---- linux-3.18.6/arch/arm/mach-bcm2708/include/mach/vc_sm_defs.h 1970-01-01 01:00:00.000000000 +0100
-+++ linux-rpi/arch/arm/mach-bcm2708/include/mach/vc_sm_defs.h 2015-02-09 04:39:42.000000000 +0100
+diff -Nur linux-3.18.8/arch/arm/mach-bcm2708/include/mach/vc_sm_defs.h linux-rpi/arch/arm/mach-bcm2708/include/mach/vc_sm_defs.h
+--- linux-3.18.8/arch/arm/mach-bcm2708/include/mach/vc_sm_defs.h 1970-01-01 01:00:00.000000000 +0100
++++ linux-rpi/arch/arm/mach-bcm2708/include/mach/vc_sm_defs.h 2015-03-05 14:40:11.153715839 +0100
@@ -0,0 +1,181 @@
+/*****************************************************************************
+* Copyright 2011 Broadcom Corporation. All rights reserved.
@@ -10346,9 +10193,9 @@ diff -Nur linux-3.18.6/arch/arm/mach-bcm2708/include/mach/vc_sm_defs.h linux-rpi
+} VC_SM_MSG_UNION_T;
+
+#endif /* __VC_SM_DEFS_H__INCLUDED__ */
-diff -Nur linux-3.18.6/arch/arm/mach-bcm2708/include/mach/vc_sm_knl.h linux-rpi/arch/arm/mach-bcm2708/include/mach/vc_sm_knl.h
---- linux-3.18.6/arch/arm/mach-bcm2708/include/mach/vc_sm_knl.h 1970-01-01 01:00:00.000000000 +0100
-+++ linux-rpi/arch/arm/mach-bcm2708/include/mach/vc_sm_knl.h 2015-02-09 04:39:42.000000000 +0100
+diff -Nur linux-3.18.8/arch/arm/mach-bcm2708/include/mach/vc_sm_knl.h linux-rpi/arch/arm/mach-bcm2708/include/mach/vc_sm_knl.h
+--- linux-3.18.8/arch/arm/mach-bcm2708/include/mach/vc_sm_knl.h 1970-01-01 01:00:00.000000000 +0100
++++ linux-rpi/arch/arm/mach-bcm2708/include/mach/vc_sm_knl.h 2015-03-05 14:40:11.153715839 +0100
@@ -0,0 +1,55 @@
+/*****************************************************************************
+* Copyright 2011 Broadcom Corporation. All rights reserved.
@@ -10405,9 +10252,9 @@ diff -Nur linux-3.18.6/arch/arm/mach-bcm2708/include/mach/vc_sm_knl.h linux-rpi/
+ long unsigned int *data);
+
+#endif /* __VC_SM_KNL_H__INCLUDED__ */
-diff -Nur linux-3.18.6/arch/arm/mach-bcm2708/include/mach/vc_vchi_sm.h linux-rpi/arch/arm/mach-bcm2708/include/mach/vc_vchi_sm.h
---- linux-3.18.6/arch/arm/mach-bcm2708/include/mach/vc_vchi_sm.h 1970-01-01 01:00:00.000000000 +0100
-+++ linux-rpi/arch/arm/mach-bcm2708/include/mach/vc_vchi_sm.h 2015-02-09 04:39:42.000000000 +0100
+diff -Nur linux-3.18.8/arch/arm/mach-bcm2708/include/mach/vc_vchi_sm.h linux-rpi/arch/arm/mach-bcm2708/include/mach/vc_vchi_sm.h
+--- linux-3.18.8/arch/arm/mach-bcm2708/include/mach/vc_vchi_sm.h 1970-01-01 01:00:00.000000000 +0100
++++ linux-rpi/arch/arm/mach-bcm2708/include/mach/vc_vchi_sm.h 2015-03-05 14:40:11.153715839 +0100
@@ -0,0 +1,82 @@
+/*****************************************************************************
+* Copyright 2011 Broadcom Corporation. All rights reserved.
@@ -10491,9 +10338,9 @@ diff -Nur linux-3.18.6/arch/arm/mach-bcm2708/include/mach/vc_vchi_sm.h linux-rpi
+ VC_SM_ACTION_CLEAN_T *action_clean);
+
+#endif /* __VC_VCHI_SM_H__INCLUDED__ */
-diff -Nur linux-3.18.6/arch/arm/mach-bcm2708/include/mach/vmalloc.h linux-rpi/arch/arm/mach-bcm2708/include/mach/vmalloc.h
---- linux-3.18.6/arch/arm/mach-bcm2708/include/mach/vmalloc.h 1970-01-01 01:00:00.000000000 +0100
-+++ linux-rpi/arch/arm/mach-bcm2708/include/mach/vmalloc.h 2015-02-09 04:39:42.000000000 +0100
+diff -Nur linux-3.18.8/arch/arm/mach-bcm2708/include/mach/vmalloc.h linux-rpi/arch/arm/mach-bcm2708/include/mach/vmalloc.h
+--- linux-3.18.8/arch/arm/mach-bcm2708/include/mach/vmalloc.h 1970-01-01 01:00:00.000000000 +0100
++++ linux-rpi/arch/arm/mach-bcm2708/include/mach/vmalloc.h 2015-03-05 14:40:11.153715839 +0100
@@ -0,0 +1,20 @@
+/*
+ * arch/arm/mach-bcm2708/include/mach/vmalloc.h
@@ -10515,9 +10362,9 @@ diff -Nur linux-3.18.6/arch/arm/mach-bcm2708/include/mach/vmalloc.h linux-rpi/ar
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ */
+#define VMALLOC_END (0xe8000000)
-diff -Nur linux-3.18.6/arch/arm/mach-bcm2708/include/mach/vmcs_sm_ioctl.h linux-rpi/arch/arm/mach-bcm2708/include/mach/vmcs_sm_ioctl.h
---- linux-3.18.6/arch/arm/mach-bcm2708/include/mach/vmcs_sm_ioctl.h 1970-01-01 01:00:00.000000000 +0100
-+++ linux-rpi/arch/arm/mach-bcm2708/include/mach/vmcs_sm_ioctl.h 2015-02-09 04:39:42.000000000 +0100
+diff -Nur linux-3.18.8/arch/arm/mach-bcm2708/include/mach/vmcs_sm_ioctl.h linux-rpi/arch/arm/mach-bcm2708/include/mach/vmcs_sm_ioctl.h
+--- linux-3.18.8/arch/arm/mach-bcm2708/include/mach/vmcs_sm_ioctl.h 1970-01-01 01:00:00.000000000 +0100
++++ linux-rpi/arch/arm/mach-bcm2708/include/mach/vmcs_sm_ioctl.h 2015-03-05 14:40:11.153715839 +0100
@@ -0,0 +1,233 @@
+/*****************************************************************************
+* Copyright 2011 Broadcom Corporation. All rights reserved.
@@ -10752,9 +10599,9 @@ diff -Nur linux-3.18.6/arch/arm/mach-bcm2708/include/mach/vmcs_sm_ioctl.h linux-
+/* ---- Function Prototypes ---------------------------------------------- */
+
+#endif /* __VMCS_SM_IOCTL_H__INCLUDED__ */
-diff -Nur linux-3.18.6/arch/arm/mach-bcm2708/Kconfig linux-rpi/arch/arm/mach-bcm2708/Kconfig
---- linux-3.18.6/arch/arm/mach-bcm2708/Kconfig 1970-01-01 01:00:00.000000000 +0100
-+++ linux-rpi/arch/arm/mach-bcm2708/Kconfig 2015-02-09 04:39:42.000000000 +0100
+diff -Nur linux-3.18.8/arch/arm/mach-bcm2708/Kconfig linux-rpi/arch/arm/mach-bcm2708/Kconfig
+--- linux-3.18.8/arch/arm/mach-bcm2708/Kconfig 1970-01-01 01:00:00.000000000 +0100
++++ linux-rpi/arch/arm/mach-bcm2708/Kconfig 2015-03-05 14:40:11.153715839 +0100
@@ -0,0 +1,52 @@
+menu "Broadcom BCM2708 Implementations"
+ depends on ARCH_BCM2708
@@ -10808,9 +10655,9 @@ diff -Nur linux-3.18.6/arch/arm/mach-bcm2708/Kconfig linux-rpi/arch/arm/mach-bcm
+ help
+ Binds spidev driver to the SPI0 master
+endmenu
-diff -Nur linux-3.18.6/arch/arm/mach-bcm2708/Makefile linux-rpi/arch/arm/mach-bcm2708/Makefile
---- linux-3.18.6/arch/arm/mach-bcm2708/Makefile 1970-01-01 01:00:00.000000000 +0100
-+++ linux-rpi/arch/arm/mach-bcm2708/Makefile 2015-02-09 04:39:42.000000000 +0100
+diff -Nur linux-3.18.8/arch/arm/mach-bcm2708/Makefile linux-rpi/arch/arm/mach-bcm2708/Makefile
+--- linux-3.18.8/arch/arm/mach-bcm2708/Makefile 1970-01-01 01:00:00.000000000 +0100
++++ linux-rpi/arch/arm/mach-bcm2708/Makefile 2015-03-05 14:40:11.153715839 +0100
@@ -0,0 +1,7 @@
+#
+# Makefile for the linux kernel.
@@ -10819,16 +10666,16 @@ diff -Nur linux-3.18.6/arch/arm/mach-bcm2708/Makefile linux-rpi/arch/arm/mach-bc
+obj-$(CONFIG_MACH_BCM2708) += bcm2708.o armctrl.o vcio.o power.o dma.o
+obj-$(CONFIG_BCM2708_GPIO) += bcm2708_gpio.o
+obj-$(CONFIG_BCM2708_VCMEM) += vc_mem.o
-diff -Nur linux-3.18.6/arch/arm/mach-bcm2708/Makefile.boot linux-rpi/arch/arm/mach-bcm2708/Makefile.boot
---- linux-3.18.6/arch/arm/mach-bcm2708/Makefile.boot 1970-01-01 01:00:00.000000000 +0100
-+++ linux-rpi/arch/arm/mach-bcm2708/Makefile.boot 2015-02-09 04:39:42.000000000 +0100
+diff -Nur linux-3.18.8/arch/arm/mach-bcm2708/Makefile.boot linux-rpi/arch/arm/mach-bcm2708/Makefile.boot
+--- linux-3.18.8/arch/arm/mach-bcm2708/Makefile.boot 1970-01-01 01:00:00.000000000 +0100
++++ linux-rpi/arch/arm/mach-bcm2708/Makefile.boot 2015-03-05 14:40:11.153715839 +0100
@@ -0,0 +1,3 @@
+ zreladdr-y := 0x00008000
+params_phys-y := 0x00000100
+initrd_phys-y := 0x00800000
-diff -Nur linux-3.18.6/arch/arm/mach-bcm2708/power.c linux-rpi/arch/arm/mach-bcm2708/power.c
---- linux-3.18.6/arch/arm/mach-bcm2708/power.c 1970-01-01 01:00:00.000000000 +0100
-+++ linux-rpi/arch/arm/mach-bcm2708/power.c 2015-02-09 04:39:42.000000000 +0100
+diff -Nur linux-3.18.8/arch/arm/mach-bcm2708/power.c linux-rpi/arch/arm/mach-bcm2708/power.c
+--- linux-3.18.8/arch/arm/mach-bcm2708/power.c 1970-01-01 01:00:00.000000000 +0100
++++ linux-rpi/arch/arm/mach-bcm2708/power.c 2015-03-05 14:40:11.153715839 +0100
@@ -0,0 +1,197 @@
+/*
+ * linux/arch/arm/mach-bcm2708/power.c
@@ -11027,9 +10874,9 @@ diff -Nur linux-3.18.6/arch/arm/mach-bcm2708/power.c linux-rpi/arch/arm/mach-bcm
+MODULE_AUTHOR("Phil Elwell");
+MODULE_DESCRIPTION("Interface to BCM2708 power management");
+MODULE_LICENSE("GPL");
-diff -Nur linux-3.18.6/arch/arm/mach-bcm2708/vcio.c linux-rpi/arch/arm/mach-bcm2708/vcio.c
---- linux-3.18.6/arch/arm/mach-bcm2708/vcio.c 1970-01-01 01:00:00.000000000 +0100
-+++ linux-rpi/arch/arm/mach-bcm2708/vcio.c 2015-02-09 04:39:42.000000000 +0100
+diff -Nur linux-3.18.8/arch/arm/mach-bcm2708/vcio.c linux-rpi/arch/arm/mach-bcm2708/vcio.c
+--- linux-3.18.8/arch/arm/mach-bcm2708/vcio.c 1970-01-01 01:00:00.000000000 +0100
++++ linux-rpi/arch/arm/mach-bcm2708/vcio.c 2015-03-05 14:40:11.153715839 +0100
@@ -0,0 +1,484 @@
+/*
+ * linux/arch/arm/mach-bcm2708/vcio.c
@@ -11515,9 +11362,9 @@ diff -Nur linux-3.18.6/arch/arm/mach-bcm2708/vcio.c linux-rpi/arch/arm/mach-bcm2
+MODULE_DESCRIPTION("ARM I/O to VideoCore processor");
+MODULE_LICENSE("GPL");
+MODULE_ALIAS("platform:bcm-mbox");
-diff -Nur linux-3.18.6/arch/arm/mach-bcm2708/vc_mem.c linux-rpi/arch/arm/mach-bcm2708/vc_mem.c
---- linux-3.18.6/arch/arm/mach-bcm2708/vc_mem.c 1970-01-01 01:00:00.000000000 +0100
-+++ linux-rpi/arch/arm/mach-bcm2708/vc_mem.c 2015-02-09 04:39:42.000000000 +0100
+diff -Nur linux-3.18.8/arch/arm/mach-bcm2708/vc_mem.c linux-rpi/arch/arm/mach-bcm2708/vc_mem.c
+--- linux-3.18.8/arch/arm/mach-bcm2708/vc_mem.c 1970-01-01 01:00:00.000000000 +0100
++++ linux-rpi/arch/arm/mach-bcm2708/vc_mem.c 2015-03-05 14:40:11.153715839 +0100
@@ -0,0 +1,432 @@
+/*****************************************************************************
+* Copyright 2010 - 2011 Broadcom Corporation. All rights reserved.
@@ -11951,10 +11798,10 @@ diff -Nur linux-3.18.6/arch/arm/mach-bcm2708/vc_mem.c linux-rpi/arch/arm/mach-bc
+module_param(mem_size, uint, 0644);
+module_param(mem_base, uint, 0644);
+
-diff -Nur linux-3.18.6/arch/arm/mach-bcm2709/armctrl.c linux-rpi/arch/arm/mach-bcm2709/armctrl.c
---- linux-3.18.6/arch/arm/mach-bcm2709/armctrl.c 1970-01-01 01:00:00.000000000 +0100
-+++ linux-rpi/arch/arm/mach-bcm2709/armctrl.c 2015-02-09 04:39:42.000000000 +0100
-@@ -0,0 +1,365 @@
+diff -Nur linux-3.18.8/arch/arm/mach-bcm2709/armctrl.c linux-rpi/arch/arm/mach-bcm2709/armctrl.c
+--- linux-3.18.8/arch/arm/mach-bcm2709/armctrl.c 1970-01-01 01:00:00.000000000 +0100
++++ linux-rpi/arch/arm/mach-bcm2709/armctrl.c 2015-03-05 14:40:11.153715839 +0100
+@@ -0,0 +1,369 @@
+/*
+ * linux/arch/arm/mach-bcm2708/armctrl.c
+ *
@@ -12033,6 +11880,8 @@ diff -Nur linux-3.18.6/arch/arm/mach-bcm2709/armctrl.c linux-rpi/arch/arm/mach-b
+ } else if (d->irq >= ARM_IRQ1_BASE && d->irq < ARM_IRQ_LOCAL_BASE) {
+ unsigned int data = (unsigned int)irq_get_chip_data(d->irq);
+ writel(1 << (data & 0x1f), __io_address(disables[(data >> 5) & 0x3]));
++ } else if (d->irq == INTERRUPT_ARM_LOCAL_PMU_FAST) {
++ writel(0xf, __io_address(ARM_LOCAL_PM_ROUTING_CLR));
+ } else { printk("%s: %d\n", __func__, d->irq); BUG(); }
+}
+
@@ -12076,6 +11925,8 @@ diff -Nur linux-3.18.6/arch/arm/mach-bcm2709/armctrl.c linux-rpi/arch/arm/mach-b
+ } else if (d->irq >= ARM_IRQ1_BASE && d->irq < ARM_IRQ_LOCAL_BASE) {
+ unsigned int data = (unsigned int)irq_get_chip_data(d->irq);
+ writel(1 << (data & 0x1f), __io_address(enables[(data >> 5) & 0x3]));
++ } else if (d->irq == INTERRUPT_ARM_LOCAL_PMU_FAST) {
++ writel(0xf, __io_address(ARM_LOCAL_PM_ROUTING_SET));
+ } else { printk("%s: %d\n", __func__, d->irq); BUG(); }
+}
+
@@ -12102,7 +11953,7 @@ diff -Nur linux-3.18.6/arch/arm/mach-bcm2709/armctrl.c linux-rpi/arch/arm/mach-b
+ if (WARN_ON(intspec[0] == 0 && intspec[1] >= NR_IRQS_BANK0))
+ return -EINVAL;
+
-+ if (WARN_ON(intspec[0] == 3 && intspec[1] > 3 && intspec[1] != 5))
++ if (WARN_ON(intspec[0] == 3 && intspec[1] > 3 && intspec[1] != 5 && intspec[1] != 9))
+ return -EINVAL;
+
+ if (intspec[0] == 0)
@@ -12320,9 +12171,9 @@ diff -Nur linux-3.18.6/arch/arm/mach-bcm2709/armctrl.c linux-rpi/arch/arm/mach-b
+ armctrl_dt_init();
+ return 0;
+}
-diff -Nur linux-3.18.6/arch/arm/mach-bcm2709/armctrl.h linux-rpi/arch/arm/mach-bcm2709/armctrl.h
---- linux-3.18.6/arch/arm/mach-bcm2709/armctrl.h 1970-01-01 01:00:00.000000000 +0100
-+++ linux-rpi/arch/arm/mach-bcm2709/armctrl.h 2015-02-09 04:39:42.000000000 +0100
+diff -Nur linux-3.18.8/arch/arm/mach-bcm2709/armctrl.h linux-rpi/arch/arm/mach-bcm2709/armctrl.h
+--- linux-3.18.8/arch/arm/mach-bcm2709/armctrl.h 1970-01-01 01:00:00.000000000 +0100
++++ linux-rpi/arch/arm/mach-bcm2709/armctrl.h 2015-03-05 14:40:11.153715839 +0100
@@ -0,0 +1,27 @@
+/*
+ * linux/arch/arm/mach-bcm2708/armctrl.h
@@ -12351,9 +12202,9 @@ diff -Nur linux-3.18.6/arch/arm/mach-bcm2709/armctrl.h linux-rpi/arch/arm/mach-b
+ u32 armctrl_sources, u32 resume_sources);
+
+#endif
-diff -Nur linux-3.18.6/arch/arm/mach-bcm2709/bcm2708_gpio.c linux-rpi/arch/arm/mach-bcm2709/bcm2708_gpio.c
---- linux-3.18.6/arch/arm/mach-bcm2709/bcm2708_gpio.c 1970-01-01 01:00:00.000000000 +0100
-+++ linux-rpi/arch/arm/mach-bcm2709/bcm2708_gpio.c 2015-02-09 04:39:42.000000000 +0100
+diff -Nur linux-3.18.8/arch/arm/mach-bcm2709/bcm2708_gpio.c linux-rpi/arch/arm/mach-bcm2709/bcm2708_gpio.c
+--- linux-3.18.8/arch/arm/mach-bcm2709/bcm2708_gpio.c 1970-01-01 01:00:00.000000000 +0100
++++ linux-rpi/arch/arm/mach-bcm2709/bcm2708_gpio.c 2015-03-05 14:40:11.153715839 +0100
@@ -0,0 +1,426 @@
+/*
+ * linux/arch/arm/mach-bcm2708/bcm2708_gpio.c
@@ -12781,9 +12632,9 @@ diff -Nur linux-3.18.6/arch/arm/mach-bcm2709/bcm2708_gpio.c linux-rpi/arch/arm/m
+
+MODULE_DESCRIPTION("Broadcom BCM2708 GPIO driver");
+MODULE_LICENSE("GPL");
-diff -Nur linux-3.18.6/arch/arm/mach-bcm2709/bcm2709.c linux-rpi/arch/arm/mach-bcm2709/bcm2709.c
---- linux-3.18.6/arch/arm/mach-bcm2709/bcm2709.c 1970-01-01 01:00:00.000000000 +0100
-+++ linux-rpi/arch/arm/mach-bcm2709/bcm2709.c 2015-02-09 04:39:42.000000000 +0100
+diff -Nur linux-3.18.8/arch/arm/mach-bcm2709/bcm2709.c linux-rpi/arch/arm/mach-bcm2709/bcm2709.c
+--- linux-3.18.8/arch/arm/mach-bcm2709/bcm2709.c 1970-01-01 01:00:00.000000000 +0100
++++ linux-rpi/arch/arm/mach-bcm2709/bcm2709.c 2015-03-05 14:40:11.153715839 +0100
@@ -0,0 +1,1297 @@
+/*
+ * linux/arch/arm/mach-bcm2709/bcm2709.c
@@ -14082,9 +13933,9 @@ diff -Nur linux-3.18.6/arch/arm/mach-bcm2709/bcm2709.c linux-rpi/arch/arm/mach-b
+MODULE_PARM_DESC(pps_gpio_pin, "Set GPIO pin to reserve for PPS");
+module_param(vc_i2c_override, bool, 0644);
+MODULE_PARM_DESC(vc_i2c_override, "Allow the use of VC's I2C peripheral.");
-diff -Nur linux-3.18.6/arch/arm/mach-bcm2709/bcm2709.h linux-rpi/arch/arm/mach-bcm2709/bcm2709.h
---- linux-3.18.6/arch/arm/mach-bcm2709/bcm2709.h 1970-01-01 01:00:00.000000000 +0100
-+++ linux-rpi/arch/arm/mach-bcm2709/bcm2709.h 2015-02-09 04:39:42.000000000 +0100
+diff -Nur linux-3.18.8/arch/arm/mach-bcm2709/bcm2709.h linux-rpi/arch/arm/mach-bcm2709/bcm2709.h
+--- linux-3.18.8/arch/arm/mach-bcm2709/bcm2709.h 1970-01-01 01:00:00.000000000 +0100
++++ linux-rpi/arch/arm/mach-bcm2709/bcm2709.h 2015-03-05 14:40:11.153715839 +0100
@@ -0,0 +1,49 @@
+/*
+ * linux/arch/arm/mach-bcm2708/bcm2708.h
@@ -14135,9 +13986,9 @@ diff -Nur linux-3.18.6/arch/arm/mach-bcm2709/bcm2709.h linux-rpi/arch/arm/mach-b
+}
+
+#endif
-diff -Nur linux-3.18.6/arch/arm/mach-bcm2709/clock.c linux-rpi/arch/arm/mach-bcm2709/clock.c
---- linux-3.18.6/arch/arm/mach-bcm2709/clock.c 1970-01-01 01:00:00.000000000 +0100
-+++ linux-rpi/arch/arm/mach-bcm2709/clock.c 2015-02-09 04:39:42.000000000 +0100
+diff -Nur linux-3.18.8/arch/arm/mach-bcm2709/clock.c linux-rpi/arch/arm/mach-bcm2709/clock.c
+--- linux-3.18.8/arch/arm/mach-bcm2709/clock.c 1970-01-01 01:00:00.000000000 +0100
++++ linux-rpi/arch/arm/mach-bcm2709/clock.c 2015-03-05 14:40:11.153715839 +0100
@@ -0,0 +1,61 @@
+/*
+ * linux/arch/arm/mach-bcm2708/clock.c
@@ -14200,9 +14051,9 @@ diff -Nur linux-3.18.6/arch/arm/mach-bcm2709/clock.c linux-rpi/arch/arm/mach-bcm
+ return -EIO;
+}
+EXPORT_SYMBOL(clk_set_rate);
-diff -Nur linux-3.18.6/arch/arm/mach-bcm2709/clock.h linux-rpi/arch/arm/mach-bcm2709/clock.h
---- linux-3.18.6/arch/arm/mach-bcm2709/clock.h 1970-01-01 01:00:00.000000000 +0100
-+++ linux-rpi/arch/arm/mach-bcm2709/clock.h 2015-02-09 04:39:42.000000000 +0100
+diff -Nur linux-3.18.8/arch/arm/mach-bcm2709/clock.h linux-rpi/arch/arm/mach-bcm2709/clock.h
+--- linux-3.18.8/arch/arm/mach-bcm2709/clock.h 1970-01-01 01:00:00.000000000 +0100
++++ linux-rpi/arch/arm/mach-bcm2709/clock.h 2015-03-05 14:40:11.153715839 +0100
@@ -0,0 +1,24 @@
+/*
+ * linux/arch/arm/mach-bcm2708/clock.h
@@ -14228,9 +14079,9 @@ diff -Nur linux-3.18.6/arch/arm/mach-bcm2709/clock.h linux-rpi/arch/arm/mach-bcm
+struct clk {
+ unsigned long rate;
+};
-diff -Nur linux-3.18.6/arch/arm/mach-bcm2709/delay.S linux-rpi/arch/arm/mach-bcm2709/delay.S
---- linux-3.18.6/arch/arm/mach-bcm2709/delay.S 1970-01-01 01:00:00.000000000 +0100
-+++ linux-rpi/arch/arm/mach-bcm2709/delay.S 2015-02-09 04:39:42.000000000 +0100
+diff -Nur linux-3.18.8/arch/arm/mach-bcm2709/delay.S linux-rpi/arch/arm/mach-bcm2709/delay.S
+--- linux-3.18.8/arch/arm/mach-bcm2709/delay.S 1970-01-01 01:00:00.000000000 +0100
++++ linux-rpi/arch/arm/mach-bcm2709/delay.S 2015-03-05 14:40:11.153715839 +0100
@@ -0,0 +1,21 @@
+/*
+ * linux/arch/arm/lib/delay.S
@@ -14253,9 +14104,9 @@ diff -Nur linux-3.18.6/arch/arm/mach-bcm2709/delay.S linux-rpi/arch/arm/mach-bcm
+ bhi bcm2708_delay
+ mov pc, lr
+ENDPROC(bcm2708_delay)
-diff -Nur linux-3.18.6/arch/arm/mach-bcm2709/dma.c linux-rpi/arch/arm/mach-bcm2709/dma.c
---- linux-3.18.6/arch/arm/mach-bcm2709/dma.c 1970-01-01 01:00:00.000000000 +0100
-+++ linux-rpi/arch/arm/mach-bcm2709/dma.c 2015-02-09 04:39:42.000000000 +0100
+diff -Nur linux-3.18.8/arch/arm/mach-bcm2709/dma.c linux-rpi/arch/arm/mach-bcm2709/dma.c
+--- linux-3.18.8/arch/arm/mach-bcm2709/dma.c 1970-01-01 01:00:00.000000000 +0100
++++ linux-rpi/arch/arm/mach-bcm2709/dma.c 2015-03-05 14:40:11.153715839 +0100
@@ -0,0 +1,409 @@
+/*
+ * linux/arch/arm/mach-bcm2708/dma.c
@@ -14666,9 +14517,9 @@ diff -Nur linux-3.18.6/arch/arm/mach-bcm2709/dma.c linux-rpi/arch/arm/mach-bcm27
+MODULE_LICENSE("GPL");
+
+MODULE_PARM_DESC(dmachans, "Bitmap of DMA channels available to the ARM");
-diff -Nur linux-3.18.6/arch/arm/mach-bcm2709/dmaer.c linux-rpi/arch/arm/mach-bcm2709/dmaer.c
---- linux-3.18.6/arch/arm/mach-bcm2709/dmaer.c 1970-01-01 01:00:00.000000000 +0100
-+++ linux-rpi/arch/arm/mach-bcm2709/dmaer.c 2015-02-09 04:39:42.000000000 +0100
+diff -Nur linux-3.18.8/arch/arm/mach-bcm2709/dmaer.c linux-rpi/arch/arm/mach-bcm2709/dmaer.c
+--- linux-3.18.8/arch/arm/mach-bcm2709/dmaer.c 1970-01-01 01:00:00.000000000 +0100
++++ linux-rpi/arch/arm/mach-bcm2709/dmaer.c 2015-03-05 14:40:11.153715839 +0100
@@ -0,0 +1,886 @@
+#include <linux/init.h>
+#include <linux/sched.h>
@@ -15556,9 +15407,9 @@ diff -Nur linux-3.18.6/arch/arm/mach-bcm2709/dmaer.c linux-rpi/arch/arm/mach-bcm
+MODULE_AUTHOR("Simon Hall");
+module_init(dmaer_init);
+module_exit(dmaer_exit);
-diff -Nur linux-3.18.6/arch/arm/mach-bcm2709/include/mach/arm_control.h linux-rpi/arch/arm/mach-bcm2709/include/mach/arm_control.h
---- linux-3.18.6/arch/arm/mach-bcm2709/include/mach/arm_control.h 1970-01-01 01:00:00.000000000 +0100
-+++ linux-rpi/arch/arm/mach-bcm2709/include/mach/arm_control.h 2015-02-09 04:39:42.000000000 +0100
+diff -Nur linux-3.18.8/arch/arm/mach-bcm2709/include/mach/arm_control.h linux-rpi/arch/arm/mach-bcm2709/include/mach/arm_control.h
+--- linux-3.18.8/arch/arm/mach-bcm2709/include/mach/arm_control.h 1970-01-01 01:00:00.000000000 +0100
++++ linux-rpi/arch/arm/mach-bcm2709/include/mach/arm_control.h 2015-03-05 14:40:11.153715839 +0100
@@ -0,0 +1,493 @@
+/*
+ * linux/arch/arm/mach-bcm2708/arm_control.h
@@ -16053,9 +15904,9 @@ diff -Nur linux-3.18.6/arch/arm/mach-bcm2709/include/mach/arm_control.h linux-rp
+#define ARM_LOCAL_MAILBOX3_CLR3 HW_REGISTER_RW(ARM_LOCAL_BASE+0x0FC)
+
+#endif
-diff -Nur linux-3.18.6/arch/arm/mach-bcm2709/include/mach/arm_power.h linux-rpi/arch/arm/mach-bcm2709/include/mach/arm_power.h
---- linux-3.18.6/arch/arm/mach-bcm2709/include/mach/arm_power.h 1970-01-01 01:00:00.000000000 +0100
-+++ linux-rpi/arch/arm/mach-bcm2709/include/mach/arm_power.h 2015-02-09 04:39:42.000000000 +0100
+diff -Nur linux-3.18.8/arch/arm/mach-bcm2709/include/mach/arm_power.h linux-rpi/arch/arm/mach-bcm2709/include/mach/arm_power.h
+--- linux-3.18.8/arch/arm/mach-bcm2709/include/mach/arm_power.h 1970-01-01 01:00:00.000000000 +0100
++++ linux-rpi/arch/arm/mach-bcm2709/include/mach/arm_power.h 2015-03-05 14:40:11.153715839 +0100
@@ -0,0 +1,62 @@
+/*
+ * linux/arch/arm/mach-bcm2708/include/mach/arm_power.h
@@ -16119,16 +15970,16 @@ diff -Nur linux-3.18.6/arch/arm/mach-bcm2709/include/mach/arm_power.h linux-rpi/
+};
+
+#endif
-diff -Nur linux-3.18.6/arch/arm/mach-bcm2709/include/mach/barriers.h linux-rpi/arch/arm/mach-bcm2709/include/mach/barriers.h
---- linux-3.18.6/arch/arm/mach-bcm2709/include/mach/barriers.h 1970-01-01 01:00:00.000000000 +0100
-+++ linux-rpi/arch/arm/mach-bcm2709/include/mach/barriers.h 2015-02-09 04:39:42.000000000 +0100
+diff -Nur linux-3.18.8/arch/arm/mach-bcm2709/include/mach/barriers.h linux-rpi/arch/arm/mach-bcm2709/include/mach/barriers.h
+--- linux-3.18.8/arch/arm/mach-bcm2709/include/mach/barriers.h 1970-01-01 01:00:00.000000000 +0100
++++ linux-rpi/arch/arm/mach-bcm2709/include/mach/barriers.h 2015-03-05 14:40:11.153715839 +0100
@@ -0,0 +1,3 @@
+#define mb() dsb()
+#define rmb() dsb()
+#define wmb() mb()
-diff -Nur linux-3.18.6/arch/arm/mach-bcm2709/include/mach/clkdev.h linux-rpi/arch/arm/mach-bcm2709/include/mach/clkdev.h
---- linux-3.18.6/arch/arm/mach-bcm2709/include/mach/clkdev.h 1970-01-01 01:00:00.000000000 +0100
-+++ linux-rpi/arch/arm/mach-bcm2709/include/mach/clkdev.h 2015-02-09 04:39:42.000000000 +0100
+diff -Nur linux-3.18.8/arch/arm/mach-bcm2709/include/mach/clkdev.h linux-rpi/arch/arm/mach-bcm2709/include/mach/clkdev.h
+--- linux-3.18.8/arch/arm/mach-bcm2709/include/mach/clkdev.h 1970-01-01 01:00:00.000000000 +0100
++++ linux-rpi/arch/arm/mach-bcm2709/include/mach/clkdev.h 2015-03-05 14:40:11.153715839 +0100
@@ -0,0 +1,7 @@
+#ifndef __ASM_MACH_CLKDEV_H
+#define __ASM_MACH_CLKDEV_H
@@ -16137,9 +15988,9 @@ diff -Nur linux-3.18.6/arch/arm/mach-bcm2709/include/mach/clkdev.h linux-rpi/arc
+#define __clk_put(clk) do { } while (0)
+
+#endif
-diff -Nur linux-3.18.6/arch/arm/mach-bcm2709/include/mach/debug-macro.S linux-rpi/arch/arm/mach-bcm2709/include/mach/debug-macro.S
---- linux-3.18.6/arch/arm/mach-bcm2709/include/mach/debug-macro.S 1970-01-01 01:00:00.000000000 +0100
-+++ linux-rpi/arch/arm/mach-bcm2709/include/mach/debug-macro.S 2015-02-09 04:39:42.000000000 +0100
+diff -Nur linux-3.18.8/arch/arm/mach-bcm2709/include/mach/debug-macro.S linux-rpi/arch/arm/mach-bcm2709/include/mach/debug-macro.S
+--- linux-3.18.8/arch/arm/mach-bcm2709/include/mach/debug-macro.S 1970-01-01 01:00:00.000000000 +0100
++++ linux-rpi/arch/arm/mach-bcm2709/include/mach/debug-macro.S 2015-03-05 14:40:11.153715839 +0100
@@ -0,0 +1,22 @@
+/* arch/arm/mach-bcm2708/include/mach/debug-macro.S
+ *
@@ -16163,9 +16014,9 @@ diff -Nur linux-3.18.6/arch/arm/mach-bcm2709/include/mach/debug-macro.S linux-rp
+ .endm
+
+#include <debug/pl01x.S>
-diff -Nur linux-3.18.6/arch/arm/mach-bcm2709/include/mach/dma.h linux-rpi/arch/arm/mach-bcm2709/include/mach/dma.h
---- linux-3.18.6/arch/arm/mach-bcm2709/include/mach/dma.h 1970-01-01 01:00:00.000000000 +0100
-+++ linux-rpi/arch/arm/mach-bcm2709/include/mach/dma.h 2015-02-09 04:39:42.000000000 +0100
+diff -Nur linux-3.18.8/arch/arm/mach-bcm2709/include/mach/dma.h linux-rpi/arch/arm/mach-bcm2709/include/mach/dma.h
+--- linux-3.18.8/arch/arm/mach-bcm2709/include/mach/dma.h 1970-01-01 01:00:00.000000000 +0100
++++ linux-rpi/arch/arm/mach-bcm2709/include/mach/dma.h 2015-03-05 14:40:11.153715839 +0100
@@ -0,0 +1,94 @@
+/*
+ * linux/arch/arm/mach-bcm2708/include/mach/dma.h
@@ -16261,9 +16112,9 @@ diff -Nur linux-3.18.6/arch/arm/mach-bcm2709/include/mach/dma.h linux-rpi/arch/a
+
+
+#endif /* _MACH_BCM2708_DMA_H */
-diff -Nur linux-3.18.6/arch/arm/mach-bcm2709/include/mach/entry-macro.S linux-rpi/arch/arm/mach-bcm2709/include/mach/entry-macro.S
---- linux-3.18.6/arch/arm/mach-bcm2709/include/mach/entry-macro.S 1970-01-01 01:00:00.000000000 +0100
-+++ linux-rpi/arch/arm/mach-bcm2709/include/mach/entry-macro.S 2015-02-09 04:39:42.000000000 +0100
+diff -Nur linux-3.18.8/arch/arm/mach-bcm2709/include/mach/entry-macro.S linux-rpi/arch/arm/mach-bcm2709/include/mach/entry-macro.S
+--- linux-3.18.8/arch/arm/mach-bcm2709/include/mach/entry-macro.S 1970-01-01 01:00:00.000000000 +0100
++++ linux-rpi/arch/arm/mach-bcm2709/include/mach/entry-macro.S 2015-03-05 14:40:11.153715839 +0100
@@ -0,0 +1,120 @@
+/*
+ * arch/arm/mach-bcm2708/include/mach/entry-macro.S
@@ -16385,9 +16236,9 @@ diff -Nur linux-3.18.6/arch/arm/mach-bcm2709/include/mach/entry-macro.S linux-rp
+ .macro arch_irq_handler_default
+1: get_irqnr_and_base r0, r2, r6, lr
+ .endm
-diff -Nur linux-3.18.6/arch/arm/mach-bcm2709/include/mach/frc.h linux-rpi/arch/arm/mach-bcm2709/include/mach/frc.h
---- linux-3.18.6/arch/arm/mach-bcm2709/include/mach/frc.h 1970-01-01 01:00:00.000000000 +0100
-+++ linux-rpi/arch/arm/mach-bcm2709/include/mach/frc.h 2015-02-09 04:39:42.000000000 +0100
+diff -Nur linux-3.18.8/arch/arm/mach-bcm2709/include/mach/frc.h linux-rpi/arch/arm/mach-bcm2709/include/mach/frc.h
+--- linux-3.18.8/arch/arm/mach-bcm2709/include/mach/frc.h 1970-01-01 01:00:00.000000000 +0100
++++ linux-rpi/arch/arm/mach-bcm2709/include/mach/frc.h 2015-03-05 14:40:11.153715839 +0100
@@ -0,0 +1,38 @@
+/*
+ * arch/arm/mach-bcm2708/include/mach/timex.h
@@ -16427,9 +16278,9 @@ diff -Nur linux-3.18.6/arch/arm/mach-bcm2709/include/mach/frc.h linux-rpi/arch/a
+extern unsigned long long frc_clock_ticks63(void);
+
+#endif
-diff -Nur linux-3.18.6/arch/arm/mach-bcm2709/include/mach/gpio.h linux-rpi/arch/arm/mach-bcm2709/include/mach/gpio.h
---- linux-3.18.6/arch/arm/mach-bcm2709/include/mach/gpio.h 1970-01-01 01:00:00.000000000 +0100
-+++ linux-rpi/arch/arm/mach-bcm2709/include/mach/gpio.h 2015-02-09 04:39:42.000000000 +0100
+diff -Nur linux-3.18.8/arch/arm/mach-bcm2709/include/mach/gpio.h linux-rpi/arch/arm/mach-bcm2709/include/mach/gpio.h
+--- linux-3.18.8/arch/arm/mach-bcm2709/include/mach/gpio.h 1970-01-01 01:00:00.000000000 +0100
++++ linux-rpi/arch/arm/mach-bcm2709/include/mach/gpio.h 2015-03-05 14:40:11.153715839 +0100
@@ -0,0 +1,17 @@
+/*
+ * arch/arm/mach-bcm2708/include/mach/gpio.h
@@ -16448,9 +16299,9 @@ diff -Nur linux-3.18.6/arch/arm/mach-bcm2709/include/mach/gpio.h linux-rpi/arch/
+#define irq_to_gpio(x) ((x) - GPIO_IRQ_START)
+
+#endif
-diff -Nur linux-3.18.6/arch/arm/mach-bcm2709/include/mach/hardware.h linux-rpi/arch/arm/mach-bcm2709/include/mach/hardware.h
---- linux-3.18.6/arch/arm/mach-bcm2709/include/mach/hardware.h 1970-01-01 01:00:00.000000000 +0100
-+++ linux-rpi/arch/arm/mach-bcm2709/include/mach/hardware.h 2015-02-09 04:39:42.000000000 +0100
+diff -Nur linux-3.18.8/arch/arm/mach-bcm2709/include/mach/hardware.h linux-rpi/arch/arm/mach-bcm2709/include/mach/hardware.h
+--- linux-3.18.8/arch/arm/mach-bcm2709/include/mach/hardware.h 1970-01-01 01:00:00.000000000 +0100
++++ linux-rpi/arch/arm/mach-bcm2709/include/mach/hardware.h 2015-03-05 14:40:11.153715839 +0100
@@ -0,0 +1,28 @@
+/*
+ * arch/arm/mach-bcm2708/include/mach/hardware.h
@@ -16480,9 +16331,9 @@ diff -Nur linux-3.18.6/arch/arm/mach-bcm2709/include/mach/hardware.h linux-rpi/a
+#include <mach/platform.h>
+
+#endif
-diff -Nur linux-3.18.6/arch/arm/mach-bcm2709/include/mach/io.h linux-rpi/arch/arm/mach-bcm2709/include/mach/io.h
---- linux-3.18.6/arch/arm/mach-bcm2709/include/mach/io.h 1970-01-01 01:00:00.000000000 +0100
-+++ linux-rpi/arch/arm/mach-bcm2709/include/mach/io.h 2015-02-09 04:39:42.000000000 +0100
+diff -Nur linux-3.18.8/arch/arm/mach-bcm2709/include/mach/io.h linux-rpi/arch/arm/mach-bcm2709/include/mach/io.h
+--- linux-3.18.8/arch/arm/mach-bcm2709/include/mach/io.h 1970-01-01 01:00:00.000000000 +0100
++++ linux-rpi/arch/arm/mach-bcm2709/include/mach/io.h 2015-03-05 14:40:11.153715839 +0100
@@ -0,0 +1,27 @@
+/*
+ * arch/arm/mach-bcm2708/include/mach/io.h
@@ -16511,9 +16362,9 @@ diff -Nur linux-3.18.6/arch/arm/mach-bcm2709/include/mach/io.h linux-rpi/arch/ar
+#define __io(a) __typesafe_io(a)
+
+#endif
-diff -Nur linux-3.18.6/arch/arm/mach-bcm2709/include/mach/irqs.h linux-rpi/arch/arm/mach-bcm2709/include/mach/irqs.h
---- linux-3.18.6/arch/arm/mach-bcm2709/include/mach/irqs.h 1970-01-01 01:00:00.000000000 +0100
-+++ linux-rpi/arch/arm/mach-bcm2709/include/mach/irqs.h 2015-02-09 04:39:42.000000000 +0100
+diff -Nur linux-3.18.8/arch/arm/mach-bcm2709/include/mach/irqs.h linux-rpi/arch/arm/mach-bcm2709/include/mach/irqs.h
+--- linux-3.18.8/arch/arm/mach-bcm2709/include/mach/irqs.h 1970-01-01 01:00:00.000000000 +0100
++++ linux-rpi/arch/arm/mach-bcm2709/include/mach/irqs.h 2015-03-05 14:40:11.157715839 +0100
@@ -0,0 +1,225 @@
+/*
+ * arch/arm/mach-bcm2708/include/mach/irqs.h
@@ -16740,9 +16591,9 @@ diff -Nur linux-3.18.6/arch/arm/mach-bcm2709/include/mach/irqs.h linux-rpi/arch/
+#define NR_IRQS (BCM2708_ALLOC_IRQS+FREE_IRQS)
+
+#endif /* _BCM2708_IRQS_H_ */
-diff -Nur linux-3.18.6/arch/arm/mach-bcm2709/include/mach/memory.h linux-rpi/arch/arm/mach-bcm2709/include/mach/memory.h
---- linux-3.18.6/arch/arm/mach-bcm2709/include/mach/memory.h 1970-01-01 01:00:00.000000000 +0100
-+++ linux-rpi/arch/arm/mach-bcm2709/include/mach/memory.h 2015-02-09 04:39:42.000000000 +0100
+diff -Nur linux-3.18.8/arch/arm/mach-bcm2709/include/mach/memory.h linux-rpi/arch/arm/mach-bcm2709/include/mach/memory.h
+--- linux-3.18.8/arch/arm/mach-bcm2709/include/mach/memory.h 1970-01-01 01:00:00.000000000 +0100
++++ linux-rpi/arch/arm/mach-bcm2709/include/mach/memory.h 2015-03-05 14:40:11.157715839 +0100
@@ -0,0 +1,57 @@
+/*
+ * arch/arm/mach-bcm2708/include/mach/memory.h
@@ -16801,9 +16652,9 @@ diff -Nur linux-3.18.6/arch/arm/mach-bcm2709/include/mach/memory.h linux-rpi/arc
+#define __bus_to_pfn(x) __phys_to_pfn((x) - (BUS_OFFSET - BCM_PLAT_PHYS_OFFSET))
+
+#endif
-diff -Nur linux-3.18.6/arch/arm/mach-bcm2709/include/mach/platform.h linux-rpi/arch/arm/mach-bcm2709/include/mach/platform.h
---- linux-3.18.6/arch/arm/mach-bcm2709/include/mach/platform.h 1970-01-01 01:00:00.000000000 +0100
-+++ linux-rpi/arch/arm/mach-bcm2709/include/mach/platform.h 2015-02-09 04:39:42.000000000 +0100
+diff -Nur linux-3.18.8/arch/arm/mach-bcm2709/include/mach/platform.h linux-rpi/arch/arm/mach-bcm2709/include/mach/platform.h
+--- linux-3.18.8/arch/arm/mach-bcm2709/include/mach/platform.h 1970-01-01 01:00:00.000000000 +0100
++++ linux-rpi/arch/arm/mach-bcm2709/include/mach/platform.h 2015-03-05 14:40:11.157715839 +0100
@@ -0,0 +1,225 @@
+/*
+ * arch/arm/mach-bcm2708/include/mach/platform.h
@@ -17030,9 +16881,9 @@ diff -Nur linux-3.18.6/arch/arm/mach-bcm2709/include/mach/platform.h linux-rpi/a
+#endif
+
+/* END */
-diff -Nur linux-3.18.6/arch/arm/mach-bcm2709/include/mach/power.h linux-rpi/arch/arm/mach-bcm2709/include/mach/power.h
---- linux-3.18.6/arch/arm/mach-bcm2709/include/mach/power.h 1970-01-01 01:00:00.000000000 +0100
-+++ linux-rpi/arch/arm/mach-bcm2709/include/mach/power.h 2015-02-09 04:39:42.000000000 +0100
+diff -Nur linux-3.18.8/arch/arm/mach-bcm2709/include/mach/power.h linux-rpi/arch/arm/mach-bcm2709/include/mach/power.h
+--- linux-3.18.8/arch/arm/mach-bcm2709/include/mach/power.h 1970-01-01 01:00:00.000000000 +0100
++++ linux-rpi/arch/arm/mach-bcm2709/include/mach/power.h 2015-03-05 14:40:11.157715839 +0100
@@ -0,0 +1,26 @@
+/*
+ * linux/arch/arm/mach-bcm2708/power.h
@@ -17060,9 +16911,9 @@ diff -Nur linux-3.18.6/arch/arm/mach-bcm2709/include/mach/power.h linux-rpi/arch
+extern int bcm_power_close(BCM_POWER_HANDLE_T handle);
+
+#endif
-diff -Nur linux-3.18.6/arch/arm/mach-bcm2709/include/mach/system.h linux-rpi/arch/arm/mach-bcm2709/include/mach/system.h
---- linux-3.18.6/arch/arm/mach-bcm2709/include/mach/system.h 1970-01-01 01:00:00.000000000 +0100
-+++ linux-rpi/arch/arm/mach-bcm2709/include/mach/system.h 2015-02-09 04:39:42.000000000 +0100
+diff -Nur linux-3.18.8/arch/arm/mach-bcm2709/include/mach/system.h linux-rpi/arch/arm/mach-bcm2709/include/mach/system.h
+--- linux-3.18.8/arch/arm/mach-bcm2709/include/mach/system.h 1970-01-01 01:00:00.000000000 +0100
++++ linux-rpi/arch/arm/mach-bcm2709/include/mach/system.h 2015-03-05 14:40:11.157715839 +0100
@@ -0,0 +1,38 @@
+/*
+ * arch/arm/mach-bcm2708/include/mach/system.h
@@ -17102,9 +16953,9 @@ diff -Nur linux-3.18.6/arch/arm/mach-bcm2709/include/mach/system.h linux-rpi/arc
+}
+
+#endif
-diff -Nur linux-3.18.6/arch/arm/mach-bcm2709/include/mach/timex.h linux-rpi/arch/arm/mach-bcm2709/include/mach/timex.h
---- linux-3.18.6/arch/arm/mach-bcm2709/include/mach/timex.h 1970-01-01 01:00:00.000000000 +0100
-+++ linux-rpi/arch/arm/mach-bcm2709/include/mach/timex.h 2015-02-09 04:39:42.000000000 +0100
+diff -Nur linux-3.18.8/arch/arm/mach-bcm2709/include/mach/timex.h linux-rpi/arch/arm/mach-bcm2709/include/mach/timex.h
+--- linux-3.18.8/arch/arm/mach-bcm2709/include/mach/timex.h 1970-01-01 01:00:00.000000000 +0100
++++ linux-rpi/arch/arm/mach-bcm2709/include/mach/timex.h 2015-03-05 14:40:11.157715839 +0100
@@ -0,0 +1,23 @@
+/*
+ * arch/arm/mach-bcm2708/include/mach/timex.h
@@ -17129,9 +16980,9 @@ diff -Nur linux-3.18.6/arch/arm/mach-bcm2709/include/mach/timex.h linux-rpi/arch
+ */
+
+#define CLOCK_TICK_RATE (1000000)
-diff -Nur linux-3.18.6/arch/arm/mach-bcm2709/include/mach/uncompress.h linux-rpi/arch/arm/mach-bcm2709/include/mach/uncompress.h
---- linux-3.18.6/arch/arm/mach-bcm2709/include/mach/uncompress.h 1970-01-01 01:00:00.000000000 +0100
-+++ linux-rpi/arch/arm/mach-bcm2709/include/mach/uncompress.h 2015-02-09 04:39:42.000000000 +0100
+diff -Nur linux-3.18.8/arch/arm/mach-bcm2709/include/mach/uncompress.h linux-rpi/arch/arm/mach-bcm2709/include/mach/uncompress.h
+--- linux-3.18.8/arch/arm/mach-bcm2709/include/mach/uncompress.h 1970-01-01 01:00:00.000000000 +0100
++++ linux-rpi/arch/arm/mach-bcm2709/include/mach/uncompress.h 2015-03-05 14:40:11.157715839 +0100
@@ -0,0 +1,84 @@
+/*
+ * arch/arm/mach-bcn2708/include/mach/uncompress.h
@@ -17217,9 +17068,9 @@ diff -Nur linux-3.18.6/arch/arm/mach-bcm2709/include/mach/uncompress.h linux-rpi
+ * nothing to do
+ */
+#define arch_decomp_wdog()
-diff -Nur linux-3.18.6/arch/arm/mach-bcm2709/include/mach/vcio.h linux-rpi/arch/arm/mach-bcm2709/include/mach/vcio.h
---- linux-3.18.6/arch/arm/mach-bcm2709/include/mach/vcio.h 1970-01-01 01:00:00.000000000 +0100
-+++ linux-rpi/arch/arm/mach-bcm2709/include/mach/vcio.h 2015-02-09 04:39:42.000000000 +0100
+diff -Nur linux-3.18.8/arch/arm/mach-bcm2709/include/mach/vcio.h linux-rpi/arch/arm/mach-bcm2709/include/mach/vcio.h
+--- linux-3.18.8/arch/arm/mach-bcm2709/include/mach/vcio.h 1970-01-01 01:00:00.000000000 +0100
++++ linux-rpi/arch/arm/mach-bcm2709/include/mach/vcio.h 2015-03-05 14:40:11.157715839 +0100
@@ -0,0 +1,165 @@
+/*
+ * arch/arm/mach-bcm2708/include/mach/vcio.h
@@ -17386,9 +17237,9 @@ diff -Nur linux-3.18.6/arch/arm/mach-bcm2709/include/mach/vcio.h linux-rpi/arch/
+#define DEVICE_FILE_NAME "vcio"
+
+#endif
-diff -Nur linux-3.18.6/arch/arm/mach-bcm2709/include/mach/vc_mem.h linux-rpi/arch/arm/mach-bcm2709/include/mach/vc_mem.h
---- linux-3.18.6/arch/arm/mach-bcm2709/include/mach/vc_mem.h 1970-01-01 01:00:00.000000000 +0100
-+++ linux-rpi/arch/arm/mach-bcm2709/include/mach/vc_mem.h 2015-02-09 04:39:42.000000000 +0100
+diff -Nur linux-3.18.8/arch/arm/mach-bcm2709/include/mach/vc_mem.h linux-rpi/arch/arm/mach-bcm2709/include/mach/vc_mem.h
+--- linux-3.18.8/arch/arm/mach-bcm2709/include/mach/vc_mem.h 1970-01-01 01:00:00.000000000 +0100
++++ linux-rpi/arch/arm/mach-bcm2709/include/mach/vc_mem.h 2015-03-05 14:40:11.157715839 +0100
@@ -0,0 +1,35 @@
+/*****************************************************************************
+* Copyright 2010 - 2011 Broadcom Corporation. All rights reserved.
@@ -17425,9 +17276,9 @@ diff -Nur linux-3.18.6/arch/arm/mach-bcm2709/include/mach/vc_mem.h linux-rpi/arc
+#endif
+
+#endif /* VC_MEM_H */
-diff -Nur linux-3.18.6/arch/arm/mach-bcm2709/include/mach/vc_support.h linux-rpi/arch/arm/mach-bcm2709/include/mach/vc_support.h
---- linux-3.18.6/arch/arm/mach-bcm2709/include/mach/vc_support.h 1970-01-01 01:00:00.000000000 +0100
-+++ linux-rpi/arch/arm/mach-bcm2709/include/mach/vc_support.h 2015-02-09 04:39:42.000000000 +0100
+diff -Nur linux-3.18.8/arch/arm/mach-bcm2709/include/mach/vc_support.h linux-rpi/arch/arm/mach-bcm2709/include/mach/vc_support.h
+--- linux-3.18.8/arch/arm/mach-bcm2709/include/mach/vc_support.h 1970-01-01 01:00:00.000000000 +0100
++++ linux-rpi/arch/arm/mach-bcm2709/include/mach/vc_support.h 2015-03-05 14:40:11.157715839 +0100
@@ -0,0 +1,69 @@
+#ifndef _VC_SUPPORT_H_
+#define _VC_SUPPORT_H_
@@ -17498,9 +17349,9 @@ diff -Nur linux-3.18.6/arch/arm/mach-bcm2709/include/mach/vc_support.h linux-rpi
+ unsigned int r0, unsigned int r1, unsigned int r2, unsigned int r3, unsigned int r4, unsigned int r5);
+
+#endif
-diff -Nur linux-3.18.6/arch/arm/mach-bcm2709/include/mach/vmalloc.h linux-rpi/arch/arm/mach-bcm2709/include/mach/vmalloc.h
---- linux-3.18.6/arch/arm/mach-bcm2709/include/mach/vmalloc.h 1970-01-01 01:00:00.000000000 +0100
-+++ linux-rpi/arch/arm/mach-bcm2709/include/mach/vmalloc.h 2015-02-09 04:39:42.000000000 +0100
+diff -Nur linux-3.18.8/arch/arm/mach-bcm2709/include/mach/vmalloc.h linux-rpi/arch/arm/mach-bcm2709/include/mach/vmalloc.h
+--- linux-3.18.8/arch/arm/mach-bcm2709/include/mach/vmalloc.h 1970-01-01 01:00:00.000000000 +0100
++++ linux-rpi/arch/arm/mach-bcm2709/include/mach/vmalloc.h 2015-03-05 14:40:11.157715839 +0100
@@ -0,0 +1,20 @@
+/*
+ * arch/arm/mach-bcm2708/include/mach/vmalloc.h
@@ -17522,9 +17373,9 @@ diff -Nur linux-3.18.6/arch/arm/mach-bcm2709/include/mach/vmalloc.h linux-rpi/ar
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ */
+#define VMALLOC_END (0xff000000)
-diff -Nur linux-3.18.6/arch/arm/mach-bcm2709/Kconfig linux-rpi/arch/arm/mach-bcm2709/Kconfig
---- linux-3.18.6/arch/arm/mach-bcm2709/Kconfig 1970-01-01 01:00:00.000000000 +0100
-+++ linux-rpi/arch/arm/mach-bcm2709/Kconfig 2015-02-09 04:39:42.000000000 +0100
+diff -Nur linux-3.18.8/arch/arm/mach-bcm2709/Kconfig linux-rpi/arch/arm/mach-bcm2709/Kconfig
+--- linux-3.18.8/arch/arm/mach-bcm2709/Kconfig 1970-01-01 01:00:00.000000000 +0100
++++ linux-rpi/arch/arm/mach-bcm2709/Kconfig 2015-03-05 14:40:11.153715839 +0100
@@ -0,0 +1,49 @@
+menu "Broadcom BCM2709 Implementations"
+ depends on ARCH_BCM2709
@@ -17575,9 +17426,9 @@ diff -Nur linux-3.18.6/arch/arm/mach-bcm2709/Kconfig linux-rpi/arch/arm/mach-bcm
+ help
+ Binds spidev driver to the SPI0 master
+endmenu
-diff -Nur linux-3.18.6/arch/arm/mach-bcm2709/Makefile linux-rpi/arch/arm/mach-bcm2709/Makefile
---- linux-3.18.6/arch/arm/mach-bcm2709/Makefile 1970-01-01 01:00:00.000000000 +0100
-+++ linux-rpi/arch/arm/mach-bcm2709/Makefile 2015-02-09 04:39:42.000000000 +0100
+diff -Nur linux-3.18.8/arch/arm/mach-bcm2709/Makefile linux-rpi/arch/arm/mach-bcm2709/Makefile
+--- linux-3.18.8/arch/arm/mach-bcm2709/Makefile 1970-01-01 01:00:00.000000000 +0100
++++ linux-rpi/arch/arm/mach-bcm2709/Makefile 2015-03-05 14:40:11.153715839 +0100
@@ -0,0 +1,7 @@
+#
+# Makefile for the linux kernel.
@@ -17586,16 +17437,16 @@ diff -Nur linux-3.18.6/arch/arm/mach-bcm2709/Makefile linux-rpi/arch/arm/mach-bc
+obj-$(CONFIG_MACH_BCM2709) += bcm2709.o armctrl.o vcio.o power.o dma.o
+obj-$(CONFIG_BCM2708_GPIO) += bcm2708_gpio.o
+obj-$(CONFIG_BCM2708_VCMEM) += vc_mem.o
-diff -Nur linux-3.18.6/arch/arm/mach-bcm2709/Makefile.boot linux-rpi/arch/arm/mach-bcm2709/Makefile.boot
---- linux-3.18.6/arch/arm/mach-bcm2709/Makefile.boot 1970-01-01 01:00:00.000000000 +0100
-+++ linux-rpi/arch/arm/mach-bcm2709/Makefile.boot 2015-02-09 04:39:42.000000000 +0100
+diff -Nur linux-3.18.8/arch/arm/mach-bcm2709/Makefile.boot linux-rpi/arch/arm/mach-bcm2709/Makefile.boot
+--- linux-3.18.8/arch/arm/mach-bcm2709/Makefile.boot 1970-01-01 01:00:00.000000000 +0100
++++ linux-rpi/arch/arm/mach-bcm2709/Makefile.boot 2015-03-05 14:40:11.153715839 +0100
@@ -0,0 +1,3 @@
+ zreladdr-y := 0x00008000
+params_phys-y := 0x00000100
+initrd_phys-y := 0x00800000
-diff -Nur linux-3.18.6/arch/arm/mach-bcm2709/power.c linux-rpi/arch/arm/mach-bcm2709/power.c
---- linux-3.18.6/arch/arm/mach-bcm2709/power.c 1970-01-01 01:00:00.000000000 +0100
-+++ linux-rpi/arch/arm/mach-bcm2709/power.c 2015-02-09 04:39:42.000000000 +0100
+diff -Nur linux-3.18.8/arch/arm/mach-bcm2709/power.c linux-rpi/arch/arm/mach-bcm2709/power.c
+--- linux-3.18.8/arch/arm/mach-bcm2709/power.c 1970-01-01 01:00:00.000000000 +0100
++++ linux-rpi/arch/arm/mach-bcm2709/power.c 2015-03-05 14:40:11.157715839 +0100
@@ -0,0 +1,195 @@
+/*
+ * linux/arch/arm/mach-bcm2708/power.c
@@ -17792,9 +17643,9 @@ diff -Nur linux-3.18.6/arch/arm/mach-bcm2709/power.c linux-rpi/arch/arm/mach-bcm
+MODULE_AUTHOR("Phil Elwell");
+MODULE_DESCRIPTION("Interface to BCM2708 power management");
+MODULE_LICENSE("GPL");
-diff -Nur linux-3.18.6/arch/arm/mach-bcm2709/vcio.c linux-rpi/arch/arm/mach-bcm2709/vcio.c
---- linux-3.18.6/arch/arm/mach-bcm2709/vcio.c 1970-01-01 01:00:00.000000000 +0100
-+++ linux-rpi/arch/arm/mach-bcm2709/vcio.c 2015-02-09 04:39:42.000000000 +0100
+diff -Nur linux-3.18.8/arch/arm/mach-bcm2709/vcio.c linux-rpi/arch/arm/mach-bcm2709/vcio.c
+--- linux-3.18.8/arch/arm/mach-bcm2709/vcio.c 1970-01-01 01:00:00.000000000 +0100
++++ linux-rpi/arch/arm/mach-bcm2709/vcio.c 2015-03-05 14:40:11.157715839 +0100
@@ -0,0 +1,484 @@
+/*
+ * linux/arch/arm/mach-bcm2708/vcio.c
@@ -18280,9 +18131,9 @@ diff -Nur linux-3.18.6/arch/arm/mach-bcm2709/vcio.c linux-rpi/arch/arm/mach-bcm2
+MODULE_DESCRIPTION("ARM I/O to VideoCore processor");
+MODULE_LICENSE("GPL");
+MODULE_ALIAS("platform:bcm-mbox");
-diff -Nur linux-3.18.6/arch/arm/mach-bcm2709/vc_mem.c linux-rpi/arch/arm/mach-bcm2709/vc_mem.c
---- linux-3.18.6/arch/arm/mach-bcm2709/vc_mem.c 1970-01-01 01:00:00.000000000 +0100
-+++ linux-rpi/arch/arm/mach-bcm2709/vc_mem.c 2015-02-09 04:39:42.000000000 +0100
+diff -Nur linux-3.18.8/arch/arm/mach-bcm2709/vc_mem.c linux-rpi/arch/arm/mach-bcm2709/vc_mem.c
+--- linux-3.18.8/arch/arm/mach-bcm2709/vc_mem.c 1970-01-01 01:00:00.000000000 +0100
++++ linux-rpi/arch/arm/mach-bcm2709/vc_mem.c 2015-03-05 14:40:11.157715839 +0100
@@ -0,0 +1,431 @@
+/*****************************************************************************
+* Copyright 2010 - 2011 Broadcom Corporation. All rights reserved.
@@ -18715,9 +18566,9 @@ diff -Nur linux-3.18.6/arch/arm/mach-bcm2709/vc_mem.c linux-rpi/arch/arm/mach-bc
+module_param(phys_addr, uint, 0644);
+module_param(mem_size, uint, 0644);
+module_param(mem_base, uint, 0644);
-diff -Nur linux-3.18.6/arch/arm/mach-bcm2709/vc_support.c linux-rpi/arch/arm/mach-bcm2709/vc_support.c
---- linux-3.18.6/arch/arm/mach-bcm2709/vc_support.c 1970-01-01 01:00:00.000000000 +0100
-+++ linux-rpi/arch/arm/mach-bcm2709/vc_support.c 2015-02-09 04:39:42.000000000 +0100
+diff -Nur linux-3.18.8/arch/arm/mach-bcm2709/vc_support.c linux-rpi/arch/arm/mach-bcm2709/vc_support.c
+--- linux-3.18.8/arch/arm/mach-bcm2709/vc_support.c 1970-01-01 01:00:00.000000000 +0100
++++ linux-rpi/arch/arm/mach-bcm2709/vc_support.c 2015-03-05 14:40:11.157715839 +0100
@@ -0,0 +1,318 @@
+/*
+ * vc_support.c
@@ -19037,9 +18888,9 @@ diff -Nur linux-3.18.6/arch/arm/mach-bcm2709/vc_support.c linux-rpi/arch/arm/mac
+ return 1;
+ }
+}
-diff -Nur linux-3.18.6/arch/arm/Makefile linux-rpi/arch/arm/Makefile
---- linux-3.18.6/arch/arm/Makefile 2015-02-06 15:53:48.000000000 +0100
-+++ linux-rpi/arch/arm/Makefile 2015-02-09 04:39:42.000000000 +0100
+diff -Nur linux-3.18.8/arch/arm/Makefile linux-rpi/arch/arm/Makefile
+--- linux-3.18.8/arch/arm/Makefile 2015-02-27 02:49:36.000000000 +0100
++++ linux-rpi/arch/arm/Makefile 2015-03-05 14:40:11.017715840 +0100
@@ -146,6 +146,8 @@
machine-$(CONFIG_ARCH_AT91) += at91
machine-$(CONFIG_ARCH_AXXIA) += axxia
@@ -19049,9 +18900,9 @@ diff -Nur linux-3.18.6/arch/arm/Makefile linux-rpi/arch/arm/Makefile
machine-$(CONFIG_ARCH_BERLIN) += berlin
machine-$(CONFIG_ARCH_CLPS711X) += clps711x
machine-$(CONFIG_ARCH_CNS3XXX) += cns3xxx
-diff -Nur linux-3.18.6/arch/arm/mm/Kconfig linux-rpi/arch/arm/mm/Kconfig
---- linux-3.18.6/arch/arm/mm/Kconfig 2015-02-06 15:53:48.000000000 +0100
-+++ linux-rpi/arch/arm/mm/Kconfig 2015-02-09 04:39:43.000000000 +0100
+diff -Nur linux-3.18.8/arch/arm/mm/Kconfig linux-rpi/arch/arm/mm/Kconfig
+--- linux-3.18.8/arch/arm/mm/Kconfig 2015-02-27 02:49:36.000000000 +0100
++++ linux-rpi/arch/arm/mm/Kconfig 2015-03-05 14:40:11.261715839 +0100
@@ -358,7 +358,7 @@
# ARMv6
@@ -19061,9 +18912,9 @@ diff -Nur linux-3.18.6/arch/arm/mm/Kconfig linux-rpi/arch/arm/mm/Kconfig
select CPU_32v6
select CPU_ABRT_EV6
select CPU_CACHE_V6
-diff -Nur linux-3.18.6/arch/arm/mm/proc-v6.S linux-rpi/arch/arm/mm/proc-v6.S
---- linux-3.18.6/arch/arm/mm/proc-v6.S 2015-02-06 15:53:48.000000000 +0100
-+++ linux-rpi/arch/arm/mm/proc-v6.S 2015-02-09 04:39:43.000000000 +0100
+diff -Nur linux-3.18.8/arch/arm/mm/proc-v6.S linux-rpi/arch/arm/mm/proc-v6.S
+--- linux-3.18.8/arch/arm/mm/proc-v6.S 2015-02-27 02:49:36.000000000 +0100
++++ linux-rpi/arch/arm/mm/proc-v6.S 2015-03-05 14:40:11.277715838 +0100
@@ -73,10 +73,19 @@
*
* IRQs are already disabled.
@@ -19087,9 +18938,9 @@ diff -Nur linux-3.18.6/arch/arm/mm/proc-v6.S linux-rpi/arch/arm/mm/proc-v6.S
ret lr
ENTRY(cpu_v6_dcache_clean_area)
-diff -Nur linux-3.18.6/arch/arm/mm/proc-v7.S linux-rpi/arch/arm/mm/proc-v7.S
---- linux-3.18.6/arch/arm/mm/proc-v7.S 2015-02-06 15:53:48.000000000 +0100
-+++ linux-rpi/arch/arm/mm/proc-v7.S 2015-02-09 04:39:43.000000000 +0100
+diff -Nur linux-3.18.8/arch/arm/mm/proc-v7.S linux-rpi/arch/arm/mm/proc-v7.S
+--- linux-3.18.8/arch/arm/mm/proc-v7.S 2015-02-27 02:49:36.000000000 +0100
++++ linux-rpi/arch/arm/mm/proc-v7.S 2015-03-05 14:40:11.277715838 +0100
@@ -441,6 +441,7 @@
orr r0, r0, r6 @ set them
THUMB( orr r0, r0, #1 << 30 ) @ Thumb exceptions
@@ -19098,9 +18949,9 @@ diff -Nur linux-3.18.6/arch/arm/mm/proc-v7.S linux-rpi/arch/arm/mm/proc-v7.S
ENDPROC(__v7_setup)
.align 2
-diff -Nur linux-3.18.6/arch/arm/tools/mach-types linux-rpi/arch/arm/tools/mach-types
---- linux-3.18.6/arch/arm/tools/mach-types 2015-02-06 15:53:48.000000000 +0100
-+++ linux-rpi/arch/arm/tools/mach-types 2015-02-09 04:39:43.000000000 +0100
+diff -Nur linux-3.18.8/arch/arm/tools/mach-types linux-rpi/arch/arm/tools/mach-types
+--- linux-3.18.8/arch/arm/tools/mach-types 2015-02-27 02:49:36.000000000 +0100
++++ linux-rpi/arch/arm/tools/mach-types 2015-03-05 14:40:11.297715838 +0100
@@ -522,6 +522,8 @@
prima2_evb MACH_PRIMA2_EVB PRIMA2_EVB 3103
paz00 MACH_PAZ00 PAZ00 3128
@@ -19110,9 +18961,9 @@ diff -Nur linux-3.18.6/arch/arm/tools/mach-types linux-rpi/arch/arm/tools/mach-t
ag5evm MACH_AG5EVM AG5EVM 3189
ics_if_voip MACH_ICS_IF_VOIP ICS_IF_VOIP 3206
wlf_cragg_6410 MACH_WLF_CRAGG_6410 WLF_CRAGG_6410 3207
-diff -Nur linux-3.18.6/Documentation/video4linux/bcm2835-v4l2.txt linux-rpi/Documentation/video4linux/bcm2835-v4l2.txt
---- linux-3.18.6/Documentation/video4linux/bcm2835-v4l2.txt 1970-01-01 01:00:00.000000000 +0100
-+++ linux-rpi/Documentation/video4linux/bcm2835-v4l2.txt 2015-02-09 04:39:42.000000000 +0100
+diff -Nur linux-3.18.8/Documentation/video4linux/bcm2835-v4l2.txt linux-rpi/Documentation/video4linux/bcm2835-v4l2.txt
+--- linux-3.18.8/Documentation/video4linux/bcm2835-v4l2.txt 1970-01-01 01:00:00.000000000 +0100
++++ linux-rpi/Documentation/video4linux/bcm2835-v4l2.txt 2015-03-05 14:40:10.925715841 +0100
@@ -0,0 +1,60 @@
+
+BCM2835 (aka Raspberry Pi) V4L2 driver
@@ -19174,9 +19025,9 @@ diff -Nur linux-3.18.6/Documentation/video4linux/bcm2835-v4l2.txt linux-rpi/Docu
+List of available formats:
+
+$ v4l2-ctl --list-formats
-diff -Nur linux-3.18.6/drivers/char/broadcom/Kconfig linux-rpi/drivers/char/broadcom/Kconfig
---- linux-3.18.6/drivers/char/broadcom/Kconfig 1970-01-01 01:00:00.000000000 +0100
-+++ linux-rpi/drivers/char/broadcom/Kconfig 2015-02-09 04:39:53.000000000 +0100
+diff -Nur linux-3.18.8/drivers/char/broadcom/Kconfig linux-rpi/drivers/char/broadcom/Kconfig
+--- linux-3.18.8/drivers/char/broadcom/Kconfig 1970-01-01 01:00:00.000000000 +0100
++++ linux-rpi/drivers/char/broadcom/Kconfig 2015-03-05 14:40:12.661715830 +0100
@@ -0,0 +1,22 @@
+#
+# Broadcom char driver config
@@ -19200,15 +19051,15 @@ diff -Nur linux-3.18.6/drivers/char/broadcom/Kconfig linux-rpi/drivers/char/broa
+ help
+ Support for the VC shared memory on the Broadcom reference
+ design. Uses the VCHIQ stack.
-diff -Nur linux-3.18.6/drivers/char/broadcom/Makefile linux-rpi/drivers/char/broadcom/Makefile
---- linux-3.18.6/drivers/char/broadcom/Makefile 1970-01-01 01:00:00.000000000 +0100
-+++ linux-rpi/drivers/char/broadcom/Makefile 2015-02-09 04:39:53.000000000 +0100
+diff -Nur linux-3.18.8/drivers/char/broadcom/Makefile linux-rpi/drivers/char/broadcom/Makefile
+--- linux-3.18.8/drivers/char/broadcom/Makefile 1970-01-01 01:00:00.000000000 +0100
++++ linux-rpi/drivers/char/broadcom/Makefile 2015-03-05 14:40:12.661715830 +0100
@@ -0,0 +1,2 @@
+obj-$(CONFIG_BCM_VC_CMA) += vc_cma/
+obj-$(CONFIG_BCM_VC_SM) += vc_sm/
-diff -Nur linux-3.18.6/drivers/char/broadcom/vc_cma/Makefile linux-rpi/drivers/char/broadcom/vc_cma/Makefile
---- linux-3.18.6/drivers/char/broadcom/vc_cma/Makefile 1970-01-01 01:00:00.000000000 +0100
-+++ linux-rpi/drivers/char/broadcom/vc_cma/Makefile 2015-02-09 04:39:53.000000000 +0100
+diff -Nur linux-3.18.8/drivers/char/broadcom/vc_cma/Makefile linux-rpi/drivers/char/broadcom/vc_cma/Makefile
+--- linux-3.18.8/drivers/char/broadcom/vc_cma/Makefile 1970-01-01 01:00:00.000000000 +0100
++++ linux-rpi/drivers/char/broadcom/vc_cma/Makefile 2015-03-05 14:40:12.661715830 +0100
@@ -0,0 +1,14 @@
+ccflags-y += -Wall -Wstrict-prototypes -Wno-trigraphs
+ccflags-y += -Werror
@@ -19224,10 +19075,10 @@ diff -Nur linux-3.18.6/drivers/char/broadcom/vc_cma/Makefile linux-rpi/drivers/c
+obj-$(CONFIG_BCM_VC_CMA) += vc-cma.o
+
+vc-cma-objs := vc_cma.o
-diff -Nur linux-3.18.6/drivers/char/broadcom/vc_cma/vc_cma.c linux-rpi/drivers/char/broadcom/vc_cma/vc_cma.c
---- linux-3.18.6/drivers/char/broadcom/vc_cma/vc_cma.c 1970-01-01 01:00:00.000000000 +0100
-+++ linux-rpi/drivers/char/broadcom/vc_cma/vc_cma.c 2015-02-09 04:39:53.000000000 +0100
-@@ -0,0 +1,1143 @@
+diff -Nur linux-3.18.8/drivers/char/broadcom/vc_cma/vc_cma.c linux-rpi/drivers/char/broadcom/vc_cma/vc_cma.c
+--- linux-3.18.8/drivers/char/broadcom/vc_cma/vc_cma.c 1970-01-01 01:00:00.000000000 +0100
++++ linux-rpi/drivers/char/broadcom/vc_cma/vc_cma.c 2015-03-05 14:40:12.661715830 +0100
+@@ -0,0 +1,1193 @@
+/**
+ * Copyright (c) 2010-2012 Broadcom. All rights reserved.
+ *
@@ -19288,6 +19139,8 @@ diff -Nur linux-3.18.6/drivers/char/broadcom/vc_cma/vc_cma.c linux-rpi/drivers/c
+#define LOG_DBG(fmt, ...) \
+ if (vc_cma_debug) \
+ printk(KERN_INFO fmt "\n", ##__VA_ARGS__)
++#define LOG_INFO(fmt, ...) \
++ printk(KERN_INFO fmt "\n", ##__VA_ARGS__)
+#define LOG_ERR(fmt, ...) \
+ printk(KERN_ERR fmt "\n", ##__VA_ARGS__)
+
@@ -19350,6 +19203,10 @@ diff -Nur linux-3.18.6/drivers/char/broadcom/vc_cma/vc_cma.c linux-rpi/drivers/c
+unsigned int vc_cma_chunks_used;
+unsigned int vc_cma_chunks_reserved;
+
++
++void *vc_cma_dma_alloc;
++unsigned int vc_cma_dma_size;
++
+static int in_loud_error;
+
+unsigned int vc_cma_reserve_total;
@@ -19428,8 +19285,17 @@ diff -Nur linux-3.18.6/drivers/char/broadcom/vc_cma/vc_cma.c linux-rpi/drivers/c
+ * size from the end of memory
+ */
+ if (vc_cma_size) {
-+ if (dma_declare_contiguous(NULL /*&vc_cma_device.dev*/, vc_cma_size,
++ if (dma_declare_contiguous(&vc_cma_device.dev, vc_cma_size,
+ vc_cma_base, 0) == 0) {
++ if (!dev_get_cma_area(NULL)) {
++ /* There is no default CMA area - make this
++ the default */
++ struct cma *vc_cma_area = dev_get_cma_area(
++ &vc_cma_device.dev);
++ dma_contiguous_set_default(vc_cma_area);
++ LOG_INFO("vc_cma_reserve - using vc_cma as "
++ "the default contiguous DMA area");
++ }
+ } else {
+ LOG_ERR("vc_cma: dma_declare_contiguous(%x,%x) failed",
+ vc_cma_size, (unsigned int)vc_cma_base);
@@ -19539,6 +19405,9 @@ diff -Nur linux-3.18.6/drivers/char/broadcom/vc_cma/vc_cma.c linux-rpi/drivers/c
+ seq_printf(m, " PID %5d: %d bytes\n", user->pid,
+ user->reserve);
+ }
++ seq_printf(m, " dma_alloc : %p (%d pages)\n",
++ vc_cma_dma_alloc ? page_address(vc_cma_dma_alloc) : 0,
++ vc_cma_dma_size);
+
+ seq_printf(m, "\n");
+
@@ -19578,31 +19447,33 @@ diff -Nur linux-3.18.6/drivers/char/broadcom/vc_cma/vc_cma.c linux-rpi/drivers/c
+#define FREE_STR "free"
+#define DEBUG_STR "debug"
+#define RESERVE_STR "reserve"
++#define DMA_ALLOC_STR "dma_alloc"
++#define DMA_FREE_STR "dma_free"
+ if (strncmp(input_str, ALLOC_STR, strlen(ALLOC_STR)) == 0) {
-+ int size;
++ int alloc_size;
+ char *p = input_str + strlen(ALLOC_STR);
+
+ while (*p == ' ')
+ p++;
-+ size = memparse(p, NULL);
-+ LOG_ERR("/proc/vc-cma: alloc %d", size);
-+ if (size)
++ alloc_size = memparse(p, NULL);
++ LOG_INFO("/proc/vc-cma: alloc %d", alloc_size);
++ if (alloc_size)
+ send_vc_msg(VC_CMA_MSG_REQUEST_FREE,
-+ size / VC_CMA_CHUNK_SIZE, 0);
++ alloc_size / VC_CMA_CHUNK_SIZE, 0);
+ else
+ LOG_ERR("invalid size '%s'", p);
+ rc = size;
+ } else if (strncmp(input_str, FREE_STR, strlen(FREE_STR)) == 0) {
-+ int size;
++ int alloc_size;
+ char *p = input_str + strlen(FREE_STR);
+
+ while (*p == ' ')
+ p++;
-+ size = memparse(p, NULL);
-+ LOG_ERR("/proc/vc-cma: free %d", size);
-+ if (size)
++ alloc_size = memparse(p, NULL);
++ LOG_INFO("/proc/vc-cma: free %d", alloc_size);
++ if (alloc_size)
+ send_vc_msg(VC_CMA_MSG_REQUEST_ALLOC,
-+ size / VC_CMA_CHUNK_SIZE, 0);
++ alloc_size / VC_CMA_CHUNK_SIZE, 0);
+ else
+ LOG_ERR("invalid size '%s'", p);
+ rc = size;
@@ -19614,18 +19485,46 @@ diff -Nur linux-3.18.6/drivers/char/broadcom/vc_cma/vc_cma.c linux-rpi/drivers/c
+ vc_cma_debug = 1;
+ else if ((strcmp(p, "off") == 0) || (strcmp(p, "0") == 0))
+ vc_cma_debug = 0;
-+ LOG_ERR("/proc/vc-cma: debug %s", vc_cma_debug ? "on" : "off");
++ LOG_INFO("/proc/vc-cma: debug %s", vc_cma_debug ? "on" : "off");
+ rc = size;
+ } else if (strncmp(input_str, RESERVE_STR, strlen(RESERVE_STR)) == 0) {
-+ int size;
++ int alloc_size;
+ int reserved;
+ char *p = input_str + strlen(RESERVE_STR);
+ while (*p == ' ')
+ p++;
-+ size = memparse(p, NULL);
++ alloc_size = memparse(p, NULL);
+
-+ reserved = vc_cma_set_reserve(size, current->tgid);
++ reserved = vc_cma_set_reserve(alloc_size, current->tgid);
+ rc = (reserved >= 0) ? size : reserved;
++ } else if (strncmp(input_str, DMA_ALLOC_STR, strlen(DMA_ALLOC_STR)) == 0) {
++ int alloc_size;
++ char *p = input_str + strlen(DMA_ALLOC_STR);
++ while (*p == ' ')
++ p++;
++ alloc_size = memparse(p, NULL);
++
++ if (vc_cma_dma_alloc) {
++ dma_release_from_contiguous(NULL, vc_cma_dma_alloc,
++ vc_cma_dma_size);
++ vc_cma_dma_alloc = NULL;
++ vc_cma_dma_size = 0;
++ }
++ vc_cma_dma_alloc = dma_alloc_from_contiguous(NULL, alloc_size, 0);
++ vc_cma_dma_size = (vc_cma_dma_alloc ? alloc_size : 0);
++ if (vc_cma_dma_alloc)
++ LOG_INFO("dma_alloc(%d pages) -> %p", alloc_size, page_address(vc_cma_dma_alloc));
++ else
++ LOG_ERR("dma_alloc(%d pages) failed", alloc_size);
++ rc = size;
++ } else if (strncmp(input_str, DMA_FREE_STR, strlen(DMA_FREE_STR)) == 0) {
++ if (vc_cma_dma_alloc) {
++ dma_release_from_contiguous(NULL, vc_cma_dma_alloc,
++ vc_cma_dma_size);
++ vc_cma_dma_alloc = NULL;
++ vc_cma_dma_size = 0;
++ }
++ rc = size;
+ }
+
+out:
@@ -19756,7 +19655,7 @@ diff -Nur linux-3.18.6/drivers/char/broadcom/vc_cma/vc_cma.c linux-rpi/drivers/c
+ uint8_t *chunk_addr;
+ size_t chunk_size = PAGES_PER_CHUNK << PAGE_SHIFT;
+
-+ chunk = dma_alloc_from_contiguous(NULL /*&vc_cma_device.dev*/,
++ chunk = dma_alloc_from_contiguous(&vc_cma_device.dev,
+ PAGES_PER_CHUNK,
+ VC_CMA_CHUNK_ORDER);
+ if (!chunk)
@@ -19772,13 +19671,14 @@ diff -Nur linux-3.18.6/drivers/char/broadcom/vc_cma/vc_cma.c linux-rpi/drivers/c
+ BUG_ON(((page_to_phys(chunk) - vc_cma_base) %
+ VC_CMA_CHUNK_SIZE) != 0);
+ if (chunk_num >= vc_cma_chunks) {
++ phys_addr_t _pa = vc_cma_base + vc_cma_size - 1;
+ LOG_ERR("%s: ===============================",
+ __func__);
-+ LOG_ERR("%s: chunk phys %x, vc_cma %x-%x - "
++ LOG_ERR("%s: chunk phys %x, vc_cma %pa-%pa - "
+ "bad SPARSEMEM configuration?",
+ __func__, (unsigned int)page_to_phys(chunk),
-+ vc_cma_base, vc_cma_base + vc_cma_size - 1);
-+ LOG_ERR("%s: dev->cma_area = %p\n", __func__,
++ &vc_cma_base, &_pa);
++ LOG_ERR("%s: dev->cma_area = %p", __func__,
+ (void*)0/*vc_cma_device.dev.cma_area*/);
+ LOG_ERR("%s: ===============================",
+ __func__);
@@ -19902,13 +19802,14 @@ diff -Nur linux-3.18.6/drivers/char/broadcom/vc_cma/vc_cma.c linux-rpi/drivers/c
+ }
+
+ if (!dma_release_from_contiguous
-+ (NULL /*&vc_cma_device.dev*/, page,
++ (&vc_cma_device.dev, page,
+ PAGES_PER_CHUNK)) {
++ phys_addr_t _pa = page_to_phys(page);
+ LOG_ERR
+ ("CMA_MSG_FREE - failed to "
-+ "release chunk %d (phys %x, "
++ "release chunk %d (phys %pa, "
+ "page %x)", chunk_num,
-+ page_to_phys(page),
++ &_pa,
+ (unsigned int)page);
+ }
+ vc_cma_chunks_used--;
@@ -20253,12 +20154,12 @@ diff -Nur linux-3.18.6/drivers/char/broadcom/vc_cma/vc_cma.c linux-rpi/drivers/c
+ if (!check_cma_config())
+ goto out_release;
+
-+ printk(KERN_INFO "vc-cma: Videocore CMA driver\n");
-+ printk(KERN_INFO "vc-cma: vc_cma_base = 0x%08x\n", vc_cma_base);
-+ printk(KERN_INFO "vc-cma: vc_cma_size = 0x%08x (%u MiB)\n",
-+ vc_cma_size, vc_cma_size / (1024 * 1024));
-+ printk(KERN_INFO "vc-cma: vc_cma_initial = 0x%08x (%u MiB)\n",
-+ vc_cma_initial, vc_cma_initial / (1024 * 1024));
++ LOG_INFO("vc-cma: Videocore CMA driver");
++ LOG_INFO("vc-cma: vc_cma_base = %pa", &vc_cma_base);
++ LOG_INFO("vc-cma: vc_cma_size = 0x%08x (%u MiB)",
++ vc_cma_size, vc_cma_size / (1024 * 1024));
++ LOG_INFO("vc-cma: vc_cma_initial = 0x%08x (%u MiB)",
++ vc_cma_initial, vc_cma_initial / (1024 * 1024));
+
+ vc_cma_base_page = phys_to_page(vc_cma_base);
+
@@ -20268,7 +20169,7 @@ diff -Nur linux-3.18.6/drivers/char/broadcom/vc_cma/vc_cma.c linux-rpi/drivers/c
+ for (vc_cma_chunks_used = 0;
+ vc_cma_chunks_used < chunks_needed; vc_cma_chunks_used++) {
+ struct page *chunk;
-+ chunk = dma_alloc_from_contiguous(NULL /*&vc_cma_device.dev*/,
++ chunk = dma_alloc_from_contiguous(&vc_cma_device.dev,
+ PAGES_PER_CHUNK,
+ VC_CMA_CHUNK_ORDER);
+ if (!chunk)
@@ -20371,9 +20272,9 @@ diff -Nur linux-3.18.6/drivers/char/broadcom/vc_cma/vc_cma.c linux-rpi/drivers/c
+module_exit(vc_cma_exit);
+MODULE_LICENSE("GPL");
+MODULE_AUTHOR("Broadcom Corporation");
-diff -Nur linux-3.18.6/drivers/char/broadcom/vc_sm/Makefile linux-rpi/drivers/char/broadcom/vc_sm/Makefile
---- linux-3.18.6/drivers/char/broadcom/vc_sm/Makefile 1970-01-01 01:00:00.000000000 +0100
-+++ linux-rpi/drivers/char/broadcom/vc_sm/Makefile 2015-02-09 04:39:53.000000000 +0100
+diff -Nur linux-3.18.8/drivers/char/broadcom/vc_sm/Makefile linux-rpi/drivers/char/broadcom/vc_sm/Makefile
+--- linux-3.18.8/drivers/char/broadcom/vc_sm/Makefile 1970-01-01 01:00:00.000000000 +0100
++++ linux-rpi/drivers/char/broadcom/vc_sm/Makefile 2015-03-05 14:40:12.661715830 +0100
@@ -0,0 +1,21 @@
+EXTRA_CFLAGS += -Wall -Wstrict-prototypes -Wno-trigraphs -O2
+
@@ -20396,9 +20297,9 @@ diff -Nur linux-3.18.6/drivers/char/broadcom/vc_sm/Makefile linux-rpi/drivers/ch
+vc-sm-objs := \
+ vmcs_sm.o \
+ vc_vchi_sm.o
-diff -Nur linux-3.18.6/drivers/char/broadcom/vc_sm/vc_vchi_sm.c linux-rpi/drivers/char/broadcom/vc_sm/vc_vchi_sm.c
---- linux-3.18.6/drivers/char/broadcom/vc_sm/vc_vchi_sm.c 1970-01-01 01:00:00.000000000 +0100
-+++ linux-rpi/drivers/char/broadcom/vc_sm/vc_vchi_sm.c 2015-02-09 04:39:53.000000000 +0100
+diff -Nur linux-3.18.8/drivers/char/broadcom/vc_sm/vc_vchi_sm.c linux-rpi/drivers/char/broadcom/vc_sm/vc_vchi_sm.c
+--- linux-3.18.8/drivers/char/broadcom/vc_sm/vc_vchi_sm.c 1970-01-01 01:00:00.000000000 +0100
++++ linux-rpi/drivers/char/broadcom/vc_sm/vc_vchi_sm.c 2015-03-05 14:40:12.661715830 +0100
@@ -0,0 +1,492 @@
+/*****************************************************************************
+* Copyright 2011-2012 Broadcom Corporation. All rights reserved.
@@ -20892,9 +20793,9 @@ diff -Nur linux-3.18.6/drivers/char/broadcom/vc_sm/vc_vchi_sm.c linux-rpi/driver
+ return vc_vchi_sm_send_msg(handle, VC_SM_MSG_TYPE_ACTION_CLEAN,
+ msg, sizeof(*msg), 0, 0, 0, 0);
+}
-diff -Nur linux-3.18.6/drivers/char/broadcom/vc_sm/vmcs_sm.c linux-rpi/drivers/char/broadcom/vc_sm/vmcs_sm.c
---- linux-3.18.6/drivers/char/broadcom/vc_sm/vmcs_sm.c 1970-01-01 01:00:00.000000000 +0100
-+++ linux-rpi/drivers/char/broadcom/vc_sm/vmcs_sm.c 2015-02-09 04:39:53.000000000 +0100
+diff -Nur linux-3.18.8/drivers/char/broadcom/vc_sm/vmcs_sm.c linux-rpi/drivers/char/broadcom/vc_sm/vmcs_sm.c
+--- linux-3.18.8/drivers/char/broadcom/vc_sm/vmcs_sm.c 1970-01-01 01:00:00.000000000 +0100
++++ linux-rpi/drivers/char/broadcom/vc_sm/vmcs_sm.c 2015-03-05 14:40:12.661715830 +0100
@@ -0,0 +1,3163 @@
+/*****************************************************************************
+* Copyright 2011-2012 Broadcom Corporation. All rights reserved.
@@ -24059,9 +23960,9 @@ diff -Nur linux-3.18.6/drivers/char/broadcom/vc_sm/vmcs_sm.c linux-rpi/drivers/c
+MODULE_AUTHOR("Broadcom");
+MODULE_DESCRIPTION("VideoCore SharedMemory Driver");
+MODULE_LICENSE("GPL v2");
-diff -Nur linux-3.18.6/drivers/char/hw_random/bcm2708-rng.c linux-rpi/drivers/char/hw_random/bcm2708-rng.c
---- linux-3.18.6/drivers/char/hw_random/bcm2708-rng.c 1970-01-01 01:00:00.000000000 +0100
-+++ linux-rpi/drivers/char/hw_random/bcm2708-rng.c 2015-02-09 04:39:53.000000000 +0100
+diff -Nur linux-3.18.8/drivers/char/hw_random/bcm2708-rng.c linux-rpi/drivers/char/hw_random/bcm2708-rng.c
+--- linux-3.18.8/drivers/char/hw_random/bcm2708-rng.c 1970-01-01 01:00:00.000000000 +0100
++++ linux-rpi/drivers/char/hw_random/bcm2708-rng.c 2015-03-05 14:40:12.661715830 +0100
@@ -0,0 +1,118 @@
+/**
+ * Copyright (c) 2010-2012 Broadcom. All rights reserved.
@@ -24181,9 +24082,9 @@ diff -Nur linux-3.18.6/drivers/char/hw_random/bcm2708-rng.c linux-rpi/drivers/ch
+
+MODULE_DESCRIPTION("BCM2708 H/W Random Number Generator (RNG) driver");
+MODULE_LICENSE("GPL and additional rights");
-diff -Nur linux-3.18.6/drivers/char/hw_random/Kconfig linux-rpi/drivers/char/hw_random/Kconfig
---- linux-3.18.6/drivers/char/hw_random/Kconfig 2015-02-06 15:53:48.000000000 +0100
-+++ linux-rpi/drivers/char/hw_random/Kconfig 2015-02-09 04:39:53.000000000 +0100
+diff -Nur linux-3.18.8/drivers/char/hw_random/Kconfig linux-rpi/drivers/char/hw_random/Kconfig
+--- linux-3.18.8/drivers/char/hw_random/Kconfig 2015-02-27 02:49:36.000000000 +0100
++++ linux-rpi/drivers/char/hw_random/Kconfig 2015-03-05 14:40:12.661715830 +0100
@@ -320,6 +320,17 @@
If unsure, say Y.
@@ -24202,9 +24103,9 @@ diff -Nur linux-3.18.6/drivers/char/hw_random/Kconfig linux-rpi/drivers/char/hw_
config HW_RANDOM_MSM
tristate "Qualcomm SoCs Random Number Generator support"
depends on HW_RANDOM && ARCH_QCOM
-diff -Nur linux-3.18.6/drivers/char/hw_random/Makefile linux-rpi/drivers/char/hw_random/Makefile
---- linux-3.18.6/drivers/char/hw_random/Makefile 2015-02-06 15:53:48.000000000 +0100
-+++ linux-rpi/drivers/char/hw_random/Makefile 2015-02-09 04:39:53.000000000 +0100
+diff -Nur linux-3.18.8/drivers/char/hw_random/Makefile linux-rpi/drivers/char/hw_random/Makefile
+--- linux-3.18.8/drivers/char/hw_random/Makefile 2015-02-27 02:49:36.000000000 +0100
++++ linux-rpi/drivers/char/hw_random/Makefile 2015-03-05 14:40:12.661715830 +0100
@@ -28,5 +28,6 @@
obj-$(CONFIG_HW_RANDOM_EXYNOS) += exynos-rng.o
obj-$(CONFIG_HW_RANDOM_TPM) += tpm-rng.o
@@ -24212,9 +24113,9 @@ diff -Nur linux-3.18.6/drivers/char/hw_random/Makefile linux-rpi/drivers/char/hw
+obj-$(CONFIG_HW_RANDOM_BCM2708) += bcm2708-rng.o
obj-$(CONFIG_HW_RANDOM_MSM) += msm-rng.o
obj-$(CONFIG_HW_RANDOM_XGENE) += xgene-rng.o
-diff -Nur linux-3.18.6/drivers/char/Kconfig linux-rpi/drivers/char/Kconfig
---- linux-3.18.6/drivers/char/Kconfig 2015-02-06 15:53:48.000000000 +0100
-+++ linux-rpi/drivers/char/Kconfig 2015-02-09 04:39:53.000000000 +0100
+diff -Nur linux-3.18.8/drivers/char/Kconfig linux-rpi/drivers/char/Kconfig
+--- linux-3.18.8/drivers/char/Kconfig 2015-02-27 02:49:36.000000000 +0100
++++ linux-rpi/drivers/char/Kconfig 2015-03-05 14:40:12.657715830 +0100
@@ -581,6 +581,8 @@
source "drivers/s390/char/Kconfig"
@@ -24224,17 +24125,17 @@ diff -Nur linux-3.18.6/drivers/char/Kconfig linux-rpi/drivers/char/Kconfig
config MSM_SMD_PKT
bool "Enable device interface for some SMD packet ports"
default n
-diff -Nur linux-3.18.6/drivers/char/Makefile linux-rpi/drivers/char/Makefile
---- linux-3.18.6/drivers/char/Makefile 2015-02-06 15:53:48.000000000 +0100
-+++ linux-rpi/drivers/char/Makefile 2015-02-09 04:39:53.000000000 +0100
+diff -Nur linux-3.18.8/drivers/char/Makefile linux-rpi/drivers/char/Makefile
+--- linux-3.18.8/drivers/char/Makefile 2015-02-27 02:49:36.000000000 +0100
++++ linux-rpi/drivers/char/Makefile 2015-03-05 14:40:12.657715830 +0100
@@ -62,3 +62,4 @@
obj-$(CONFIG_TILE_SROM) += tile-srom.o
obj-$(CONFIG_XILLYBUS) += xillybus/
+obj-$(CONFIG_BRCM_CHAR_DRIVERS) += broadcom/
-diff -Nur linux-3.18.6/drivers/clocksource/arm_arch_timer.c linux-rpi/drivers/clocksource/arm_arch_timer.c
---- linux-3.18.6/drivers/clocksource/arm_arch_timer.c 2015-02-06 15:53:48.000000000 +0100
-+++ linux-rpi/drivers/clocksource/arm_arch_timer.c 2015-02-09 04:39:53.000000000 +0100
+diff -Nur linux-3.18.8/drivers/clocksource/arm_arch_timer.c linux-rpi/drivers/clocksource/arm_arch_timer.c
+--- linux-3.18.8/drivers/clocksource/arm_arch_timer.c 2015-02-27 02:49:36.000000000 +0100
++++ linux-rpi/drivers/clocksource/arm_arch_timer.c 2015-03-05 14:40:12.693715830 +0100
@@ -795,3 +795,39 @@
}
CLOCKSOURCE_OF_DECLARE(armv7_arch_timer_mem, "arm,armv7-timer-mem",
@@ -24275,9 +24176,9 @@ diff -Nur linux-3.18.6/drivers/clocksource/arm_arch_timer.c linux-rpi/drivers/cl
+ arch_timer_common_init();
+ return 0;
+}
-diff -Nur linux-3.18.6/drivers/cpufreq/bcm2835-cpufreq.c linux-rpi/drivers/cpufreq/bcm2835-cpufreq.c
---- linux-3.18.6/drivers/cpufreq/bcm2835-cpufreq.c 1970-01-01 01:00:00.000000000 +0100
-+++ linux-rpi/drivers/cpufreq/bcm2835-cpufreq.c 2015-02-09 04:39:53.000000000 +0100
+diff -Nur linux-3.18.8/drivers/cpufreq/bcm2835-cpufreq.c linux-rpi/drivers/cpufreq/bcm2835-cpufreq.c
+--- linux-3.18.8/drivers/cpufreq/bcm2835-cpufreq.c 1970-01-01 01:00:00.000000000 +0100
++++ linux-rpi/drivers/cpufreq/bcm2835-cpufreq.c 2015-03-05 14:40:12.697715830 +0100
@@ -0,0 +1,224 @@
+/*****************************************************************************
+* Copyright 2011 Broadcom Corporation. All rights reserved.
@@ -24503,9 +24404,9 @@ diff -Nur linux-3.18.6/drivers/cpufreq/bcm2835-cpufreq.c linux-rpi/drivers/cpufr
+
+module_init(bcm2835_cpufreq_module_init);
+module_exit(bcm2835_cpufreq_module_exit);
-diff -Nur linux-3.18.6/drivers/cpufreq/Kconfig.arm linux-rpi/drivers/cpufreq/Kconfig.arm
---- linux-3.18.6/drivers/cpufreq/Kconfig.arm 2015-02-06 15:53:48.000000000 +0100
-+++ linux-rpi/drivers/cpufreq/Kconfig.arm 2015-02-09 04:39:53.000000000 +0100
+diff -Nur linux-3.18.8/drivers/cpufreq/Kconfig.arm linux-rpi/drivers/cpufreq/Kconfig.arm
+--- linux-3.18.8/drivers/cpufreq/Kconfig.arm 2015-02-27 02:49:36.000000000 +0100
++++ linux-rpi/drivers/cpufreq/Kconfig.arm 2015-03-05 14:40:12.697715830 +0100
@@ -241,6 +241,14 @@
help
This adds the CPUFreq driver support for SPEAr SOCs.
@@ -24521,9 +24422,9 @@ diff -Nur linux-3.18.6/drivers/cpufreq/Kconfig.arm linux-rpi/drivers/cpufreq/Kco
config ARM_TEGRA_CPUFREQ
bool "TEGRA CPUFreq support"
depends on ARCH_TEGRA
-diff -Nur linux-3.18.6/drivers/cpufreq/Makefile linux-rpi/drivers/cpufreq/Makefile
---- linux-3.18.6/drivers/cpufreq/Makefile 2015-02-06 15:53:48.000000000 +0100
-+++ linux-rpi/drivers/cpufreq/Makefile 2015-02-09 04:39:53.000000000 +0100
+diff -Nur linux-3.18.8/drivers/cpufreq/Makefile linux-rpi/drivers/cpufreq/Makefile
+--- linux-3.18.8/drivers/cpufreq/Makefile 2015-02-27 02:49:36.000000000 +0100
++++ linux-rpi/drivers/cpufreq/Makefile 2015-03-05 14:40:12.697715830 +0100
@@ -75,6 +75,7 @@
obj-$(CONFIG_ARM_SA1100_CPUFREQ) += sa1100-cpufreq.o
obj-$(CONFIG_ARM_SA1110_CPUFREQ) += sa1110-cpufreq.o
@@ -24532,9 +24433,9 @@ diff -Nur linux-3.18.6/drivers/cpufreq/Makefile linux-rpi/drivers/cpufreq/Makefi
obj-$(CONFIG_ARM_TEGRA_CPUFREQ) += tegra-cpufreq.o
obj-$(CONFIG_ARM_VEXPRESS_SPC_CPUFREQ) += vexpress-spc-cpufreq.o
-diff -Nur linux-3.18.6/drivers/dma/bcm2708-dmaengine.c linux-rpi/drivers/dma/bcm2708-dmaengine.c
---- linux-3.18.6/drivers/dma/bcm2708-dmaengine.c 1970-01-01 01:00:00.000000000 +0100
-+++ linux-rpi/drivers/dma/bcm2708-dmaengine.c 2015-02-09 04:39:53.000000000 +0100
+diff -Nur linux-3.18.8/drivers/dma/bcm2708-dmaengine.c linux-rpi/drivers/dma/bcm2708-dmaengine.c
+--- linux-3.18.8/drivers/dma/bcm2708-dmaengine.c 1970-01-01 01:00:00.000000000 +0100
++++ linux-rpi/drivers/dma/bcm2708-dmaengine.c 2015-03-05 14:40:12.717715830 +0100
@@ -0,0 +1,1052 @@
+/*
+ * BCM2835 DMA engine support
@@ -25588,9 +25489,9 @@ diff -Nur linux-3.18.6/drivers/dma/bcm2708-dmaengine.c linux-rpi/drivers/dma/bcm
+MODULE_AUTHOR("Florian Meier <florian.meier@koalo.de>");
+MODULE_AUTHOR("Gellert Weisz <gellert@raspberrypi.org>");
+MODULE_LICENSE("GPL v2");
-diff -Nur linux-3.18.6/drivers/dma/Kconfig linux-rpi/drivers/dma/Kconfig
---- linux-3.18.6/drivers/dma/Kconfig 2015-02-06 15:53:48.000000000 +0100
-+++ linux-rpi/drivers/dma/Kconfig 2015-02-09 04:39:53.000000000 +0100
+diff -Nur linux-3.18.8/drivers/dma/Kconfig linux-rpi/drivers/dma/Kconfig
+--- linux-3.18.8/drivers/dma/Kconfig 2015-02-27 02:49:36.000000000 +0100
++++ linux-rpi/drivers/dma/Kconfig 2015-03-05 14:40:12.717715830 +0100
@@ -330,6 +330,12 @@
select DMA_ENGINE
select DMA_VIRTUAL_CHANNELS
@@ -25604,9 +25505,9 @@ diff -Nur linux-3.18.6/drivers/dma/Kconfig linux-rpi/drivers/dma/Kconfig
config TI_CPPI41
tristate "AM33xx CPPI41 DMA support"
depends on ARCH_OMAP
-diff -Nur linux-3.18.6/drivers/dma/Makefile linux-rpi/drivers/dma/Makefile
---- linux-3.18.6/drivers/dma/Makefile 2015-02-06 15:53:48.000000000 +0100
-+++ linux-rpi/drivers/dma/Makefile 2015-02-09 04:39:53.000000000 +0100
+diff -Nur linux-3.18.8/drivers/dma/Makefile linux-rpi/drivers/dma/Makefile
+--- linux-3.18.8/drivers/dma/Makefile 2015-02-27 02:49:36.000000000 +0100
++++ linux-rpi/drivers/dma/Makefile 2015-03-05 14:40:12.717715830 +0100
@@ -38,6 +38,7 @@
obj-$(CONFIG_MMP_TDMA) += mmp_tdma.o
obj-$(CONFIG_DMA_OMAP) += omap-dma.o
@@ -25615,9 +25516,9 @@ diff -Nur linux-3.18.6/drivers/dma/Makefile linux-rpi/drivers/dma/Makefile
obj-$(CONFIG_MMP_PDMA) += mmp_pdma.o
obj-$(CONFIG_DMA_JZ4740) += dma-jz4740.o
obj-$(CONFIG_TI_CPPI41) += cppi41.o
-diff -Nur linux-3.18.6/drivers/hid/usbhid/hid-core.c linux-rpi/drivers/hid/usbhid/hid-core.c
---- linux-3.18.6/drivers/hid/usbhid/hid-core.c 2015-02-06 15:53:48.000000000 +0100
-+++ linux-rpi/drivers/hid/usbhid/hid-core.c 2015-02-09 04:39:54.000000000 +0100
+diff -Nur linux-3.18.8/drivers/hid/usbhid/hid-core.c linux-rpi/drivers/hid/usbhid/hid-core.c
+--- linux-3.18.8/drivers/hid/usbhid/hid-core.c 2015-02-27 02:49:36.000000000 +0100
++++ linux-rpi/drivers/hid/usbhid/hid-core.c 2015-03-05 14:40:13.017715828 +0100
@@ -49,7 +49,7 @@
* Module parameters.
*/
@@ -25642,9 +25543,9 @@ diff -Nur linux-3.18.6/drivers/hid/usbhid/hid-core.c linux-rpi/drivers/hid/usbhi
ret = -ENOMEM;
if (usb_endpoint_dir_in(endpoint)) {
-diff -Nur linux-3.18.6/drivers/hwmon/bcm2835-hwmon.c linux-rpi/drivers/hwmon/bcm2835-hwmon.c
---- linux-3.18.6/drivers/hwmon/bcm2835-hwmon.c 1970-01-01 01:00:00.000000000 +0100
-+++ linux-rpi/drivers/hwmon/bcm2835-hwmon.c 2015-02-09 04:39:54.000000000 +0100
+diff -Nur linux-3.18.8/drivers/hwmon/bcm2835-hwmon.c linux-rpi/drivers/hwmon/bcm2835-hwmon.c
+--- linux-3.18.8/drivers/hwmon/bcm2835-hwmon.c 1970-01-01 01:00:00.000000000 +0100
++++ linux-rpi/drivers/hwmon/bcm2835-hwmon.c 2015-03-05 14:40:13.029715828 +0100
@@ -0,0 +1,219 @@
+/*****************************************************************************
+* Copyright 2011 Broadcom Corporation. All rights reserved.
@@ -25865,9 +25766,9 @@ diff -Nur linux-3.18.6/drivers/hwmon/bcm2835-hwmon.c linux-rpi/drivers/hwmon/bcm
+MODULE_DESCRIPTION("HW Monitor driver for bcm2835 chip");
+
+module_platform_driver(bcm2835_hwmon_driver);
-diff -Nur linux-3.18.6/drivers/hwmon/Kconfig linux-rpi/drivers/hwmon/Kconfig
---- linux-3.18.6/drivers/hwmon/Kconfig 2015-02-06 15:53:48.000000000 +0100
-+++ linux-rpi/drivers/hwmon/Kconfig 2015-02-09 04:39:54.000000000 +0100
+diff -Nur linux-3.18.8/drivers/hwmon/Kconfig linux-rpi/drivers/hwmon/Kconfig
+--- linux-3.18.8/drivers/hwmon/Kconfig 2015-02-27 02:49:36.000000000 +0100
++++ linux-rpi/drivers/hwmon/Kconfig 2015-03-05 14:40:13.025715828 +0100
@@ -1680,6 +1680,16 @@
This driver provides support for the Ultra45 workstation environmental
sensors.
@@ -25885,9 +25786,9 @@ diff -Nur linux-3.18.6/drivers/hwmon/Kconfig linux-rpi/drivers/hwmon/Kconfig
if ACPI
comment "ACPI drivers"
-diff -Nur linux-3.18.6/drivers/hwmon/Makefile linux-rpi/drivers/hwmon/Makefile
---- linux-3.18.6/drivers/hwmon/Makefile 2015-02-06 15:53:48.000000000 +0100
-+++ linux-rpi/drivers/hwmon/Makefile 2015-02-09 04:39:54.000000000 +0100
+diff -Nur linux-3.18.8/drivers/hwmon/Makefile linux-rpi/drivers/hwmon/Makefile
+--- linux-3.18.8/drivers/hwmon/Makefile 2015-02-27 02:49:36.000000000 +0100
++++ linux-rpi/drivers/hwmon/Makefile 2015-03-05 14:40:13.025715828 +0100
@@ -153,6 +153,7 @@
obj-$(CONFIG_SENSORS_W83L786NG) += w83l786ng.o
obj-$(CONFIG_SENSORS_WM831X) += wm831x-hwmon.o
@@ -25896,9 +25797,9 @@ diff -Nur linux-3.18.6/drivers/hwmon/Makefile linux-rpi/drivers/hwmon/Makefile
obj-$(CONFIG_PMBUS) += pmbus/
-diff -Nur linux-3.18.6/drivers/i2c/busses/i2c-bcm2708.c linux-rpi/drivers/i2c/busses/i2c-bcm2708.c
---- linux-3.18.6/drivers/i2c/busses/i2c-bcm2708.c 1970-01-01 01:00:00.000000000 +0100
-+++ linux-rpi/drivers/i2c/busses/i2c-bcm2708.c 2015-02-09 04:39:54.000000000 +0100
+diff -Nur linux-3.18.8/drivers/i2c/busses/i2c-bcm2708.c linux-rpi/drivers/i2c/busses/i2c-bcm2708.c
+--- linux-3.18.8/drivers/i2c/busses/i2c-bcm2708.c 1970-01-01 01:00:00.000000000 +0100
++++ linux-rpi/drivers/i2c/busses/i2c-bcm2708.c 2015-03-05 14:40:13.045715828 +0100
@@ -0,0 +1,521 @@
+/*
+ * Driver for Broadcom BCM2708 BSC Controllers
@@ -26421,9 +26322,9 @@ diff -Nur linux-3.18.6/drivers/i2c/busses/i2c-bcm2708.c linux-rpi/drivers/i2c/bu
+MODULE_AUTHOR("Chris Boot <bootc@bootc.net>");
+MODULE_LICENSE("GPL v2");
+MODULE_ALIAS("platform:" DRV_NAME);
-diff -Nur linux-3.18.6/drivers/i2c/busses/Kconfig linux-rpi/drivers/i2c/busses/Kconfig
---- linux-3.18.6/drivers/i2c/busses/Kconfig 2015-02-06 15:53:48.000000000 +0100
-+++ linux-rpi/drivers/i2c/busses/Kconfig 2015-02-09 04:39:54.000000000 +0100
+diff -Nur linux-3.18.8/drivers/i2c/busses/Kconfig linux-rpi/drivers/i2c/busses/Kconfig
+--- linux-3.18.8/drivers/i2c/busses/Kconfig 2015-02-27 02:49:36.000000000 +0100
++++ linux-rpi/drivers/i2c/busses/Kconfig 2015-03-05 14:40:13.045715828 +0100
@@ -361,7 +361,7 @@
config I2C_BCM2835
@@ -26459,9 +26360,9 @@ diff -Nur linux-3.18.6/drivers/i2c/busses/Kconfig linux-rpi/drivers/i2c/busses/K
config I2C_BCM_KONA
tristate "BCM Kona I2C adapter"
depends on ARCH_BCM_MOBILE
-diff -Nur linux-3.18.6/drivers/i2c/busses/Makefile linux-rpi/drivers/i2c/busses/Makefile
---- linux-3.18.6/drivers/i2c/busses/Makefile 2015-02-06 15:53:48.000000000 +0100
-+++ linux-rpi/drivers/i2c/busses/Makefile 2015-02-09 04:39:54.000000000 +0100
+diff -Nur linux-3.18.8/drivers/i2c/busses/Makefile linux-rpi/drivers/i2c/busses/Makefile
+--- linux-3.18.8/drivers/i2c/busses/Makefile 2015-02-27 02:49:36.000000000 +0100
++++ linux-rpi/drivers/i2c/busses/Makefile 2015-03-05 14:40:13.045715828 +0100
@@ -33,6 +33,7 @@
obj-$(CONFIG_I2C_AU1550) += i2c-au1550.o
obj-$(CONFIG_I2C_AXXIA) += i2c-axxia.o
@@ -26470,9 +26371,9 @@ diff -Nur linux-3.18.6/drivers/i2c/busses/Makefile linux-rpi/drivers/i2c/busses/
obj-$(CONFIG_I2C_BLACKFIN_TWI) += i2c-bfin-twi.o
obj-$(CONFIG_I2C_CADENCE) += i2c-cadence.o
obj-$(CONFIG_I2C_CBUS_GPIO) += i2c-cbus-gpio.o
-diff -Nur linux-3.18.6/drivers/leds/trigger/Kconfig linux-rpi/drivers/leds/trigger/Kconfig
---- linux-3.18.6/drivers/leds/trigger/Kconfig 2015-02-06 15:53:48.000000000 +0100
-+++ linux-rpi/drivers/leds/trigger/Kconfig 2015-02-09 04:40:01.000000000 +0100
+diff -Nur linux-3.18.8/drivers/leds/trigger/Kconfig linux-rpi/drivers/leds/trigger/Kconfig
+--- linux-3.18.8/drivers/leds/trigger/Kconfig 2015-02-27 02:49:36.000000000 +0100
++++ linux-rpi/drivers/leds/trigger/Kconfig 2015-03-05 14:40:13.401715826 +0100
@@ -108,4 +108,11 @@
This enables direct flash/torch on/off by the driver, kernel space.
If unsure, say Y.
@@ -26485,9 +26386,9 @@ diff -Nur linux-3.18.6/drivers/leds/trigger/Kconfig linux-rpi/drivers/leds/trigg
+ If unsure, say Y.
+
endif # LEDS_TRIGGERS
-diff -Nur linux-3.18.6/drivers/leds/trigger/ledtrig-input.c linux-rpi/drivers/leds/trigger/ledtrig-input.c
---- linux-3.18.6/drivers/leds/trigger/ledtrig-input.c 1970-01-01 01:00:00.000000000 +0100
-+++ linux-rpi/drivers/leds/trigger/ledtrig-input.c 2015-02-09 04:40:01.000000000 +0100
+diff -Nur linux-3.18.8/drivers/leds/trigger/ledtrig-input.c linux-rpi/drivers/leds/trigger/ledtrig-input.c
+--- linux-3.18.8/drivers/leds/trigger/ledtrig-input.c 1970-01-01 01:00:00.000000000 +0100
++++ linux-rpi/drivers/leds/trigger/ledtrig-input.c 2015-03-05 14:40:13.401715826 +0100
@@ -0,0 +1,65 @@
+/*
+ * Set LED GPIO to Input "Trigger"
@@ -26554,18 +26455,18 @@ diff -Nur linux-3.18.6/drivers/leds/trigger/ledtrig-input.c linux-rpi/drivers/le
+MODULE_AUTHOR("Phil Elwell <phil@raspberrypi.org>");
+MODULE_DESCRIPTION("Set LED GPIO to Input \"trigger\"");
+MODULE_LICENSE("GPL");
-diff -Nur linux-3.18.6/drivers/leds/trigger/Makefile linux-rpi/drivers/leds/trigger/Makefile
---- linux-3.18.6/drivers/leds/trigger/Makefile 2015-02-06 15:53:48.000000000 +0100
-+++ linux-rpi/drivers/leds/trigger/Makefile 2015-02-09 04:40:01.000000000 +0100
+diff -Nur linux-3.18.8/drivers/leds/trigger/Makefile linux-rpi/drivers/leds/trigger/Makefile
+--- linux-3.18.8/drivers/leds/trigger/Makefile 2015-02-27 02:49:36.000000000 +0100
++++ linux-rpi/drivers/leds/trigger/Makefile 2015-03-05 14:40:13.401715826 +0100
@@ -8,3 +8,4 @@
obj-$(CONFIG_LEDS_TRIGGER_DEFAULT_ON) += ledtrig-default-on.o
obj-$(CONFIG_LEDS_TRIGGER_TRANSIENT) += ledtrig-transient.o
obj-$(CONFIG_LEDS_TRIGGER_CAMERA) += ledtrig-camera.o
+obj-$(CONFIG_LEDS_TRIGGER_INPUT) += ledtrig-input.o
-diff -Nur linux-3.18.6/drivers/media/platform/bcm2835/bcm2835-camera.c linux-rpi/drivers/media/platform/bcm2835/bcm2835-camera.c
---- linux-3.18.6/drivers/media/platform/bcm2835/bcm2835-camera.c 1970-01-01 01:00:00.000000000 +0100
-+++ linux-rpi/drivers/media/platform/bcm2835/bcm2835-camera.c 2015-02-09 04:40:03.000000000 +0100
-@@ -0,0 +1,1824 @@
+diff -Nur linux-3.18.8/drivers/media/platform/bcm2835/bcm2835-camera.c linux-rpi/drivers/media/platform/bcm2835/bcm2835-camera.c
+--- linux-3.18.8/drivers/media/platform/bcm2835/bcm2835-camera.c 1970-01-01 01:00:00.000000000 +0100
++++ linux-rpi/drivers/media/platform/bcm2835/bcm2835-camera.c 2015-03-05 14:40:13.981715822 +0100
+@@ -0,0 +1,1828 @@
+/*
+ * Broadcom BM2835 V4L2 driver
+ *
@@ -27342,7 +27243,7 @@ diff -Nur linux-3.18.6/drivers/media/platform/bcm2835/bcm2835-camera.c linux-rpi
+ a->fmt.bytesperline = (preview_port->es.video.width * 3)>>1;
+ a->fmt.sizeimage = (preview_port->es.video.width *
+ preview_port->es.video.height * 3)>>1;
-+ a->fmt.colorspace = V4L2_COLORSPACE_JPEG;
++ a->fmt.colorspace = V4L2_COLORSPACE_SMPTE170M;
+
+ return 0;
+}
@@ -27428,8 +27329,10 @@ diff -Nur linux-3.18.6/drivers/media/platform/bcm2835/bcm2835-camera.c linux-rpi
+
+ if (dev->capture.fmt->fourcc == V4L2_PIX_FMT_RGB24)
+ f->fmt.pix.colorspace = V4L2_COLORSPACE_SRGB;
-+ else
++ else if (dev->capture.fmt->fourcc == V4L2_PIX_FMT_JPEG)
+ f->fmt.pix.colorspace = V4L2_COLORSPACE_JPEG;
++ else
++ f->fmt.pix.colorspace = V4L2_COLORSPACE_SMPTE170M;
+ f->fmt.pix.priv = 0;
+
+ v4l2_dump_pix_format(1, bcm2835_v4l2_debug, &dev->v4l2_dev, &f->fmt.pix,
@@ -27472,10 +27375,12 @@ diff -Nur linux-3.18.6/drivers/media/platform/bcm2835/bcm2835-camera.c linux-rpi
+ f->fmt.pix.sizeimage < MIN_BUFFER_SIZE)
+ f->fmt.pix.sizeimage = MIN_BUFFER_SIZE;
+
-+ if (dev->capture.fmt->fourcc == V4L2_PIX_FMT_RGB24)
++ if (f->fmt.pix.pixelformat == V4L2_PIX_FMT_RGB24)
+ f->fmt.pix.colorspace = V4L2_COLORSPACE_SRGB;
-+ else
++ else if (f->fmt.pix.pixelformat == V4L2_PIX_FMT_JPEG)
+ f->fmt.pix.colorspace = V4L2_COLORSPACE_JPEG;
++ else
++ f->fmt.pix.colorspace = V4L2_COLORSPACE_SMPTE170M;
+ f->fmt.pix.priv = 0;
+
+ v4l2_dbg(1, bcm2835_v4l2_debug, &dev->v4l2_dev,
@@ -28390,9 +28295,9 @@ diff -Nur linux-3.18.6/drivers/media/platform/bcm2835/bcm2835-camera.c linux-rpi
+
+module_init(bm2835_mmal_init);
+module_exit(bm2835_mmal_exit);
-diff -Nur linux-3.18.6/drivers/media/platform/bcm2835/bcm2835-camera.h linux-rpi/drivers/media/platform/bcm2835/bcm2835-camera.h
---- linux-3.18.6/drivers/media/platform/bcm2835/bcm2835-camera.h 1970-01-01 01:00:00.000000000 +0100
-+++ linux-rpi/drivers/media/platform/bcm2835/bcm2835-camera.h 2015-02-09 04:40:03.000000000 +0100
+diff -Nur linux-3.18.8/drivers/media/platform/bcm2835/bcm2835-camera.h linux-rpi/drivers/media/platform/bcm2835/bcm2835-camera.h
+--- linux-3.18.8/drivers/media/platform/bcm2835/bcm2835-camera.h 1970-01-01 01:00:00.000000000 +0100
++++ linux-rpi/drivers/media/platform/bcm2835/bcm2835-camera.h 2015-03-05 14:40:13.981715822 +0100
@@ -0,0 +1,126 @@
+/*
+ * Broadcom BM2835 V4L2 driver
@@ -28520,9 +28425,9 @@ diff -Nur linux-3.18.6/drivers/media/platform/bcm2835/bcm2835-camera.h linux-rpi
+ (pix_fmt)->pixelformat, (pix_fmt)->bytesperline, \
+ (pix_fmt)->sizeimage, (pix_fmt)->colorspace, (pix_fmt)->priv); \
+}
-diff -Nur linux-3.18.6/drivers/media/platform/bcm2835/controls.c linux-rpi/drivers/media/platform/bcm2835/controls.c
---- linux-3.18.6/drivers/media/platform/bcm2835/controls.c 1970-01-01 01:00:00.000000000 +0100
-+++ linux-rpi/drivers/media/platform/bcm2835/controls.c 2015-02-09 04:40:03.000000000 +0100
+diff -Nur linux-3.18.8/drivers/media/platform/bcm2835/controls.c linux-rpi/drivers/media/platform/bcm2835/controls.c
+--- linux-3.18.8/drivers/media/platform/bcm2835/controls.c 1970-01-01 01:00:00.000000000 +0100
++++ linux-rpi/drivers/media/platform/bcm2835/controls.c 2015-03-05 14:40:13.981715822 +0100
@@ -0,0 +1,1322 @@
+/*
+ * Broadcom BM2835 V4L2 driver
@@ -29846,9 +29751,9 @@ diff -Nur linux-3.18.6/drivers/media/platform/bcm2835/controls.c linux-rpi/drive
+
+ return 0;
+}
-diff -Nur linux-3.18.6/drivers/media/platform/bcm2835/Kconfig linux-rpi/drivers/media/platform/bcm2835/Kconfig
---- linux-3.18.6/drivers/media/platform/bcm2835/Kconfig 1970-01-01 01:00:00.000000000 +0100
-+++ linux-rpi/drivers/media/platform/bcm2835/Kconfig 2015-02-09 04:40:03.000000000 +0100
+diff -Nur linux-3.18.8/drivers/media/platform/bcm2835/Kconfig linux-rpi/drivers/media/platform/bcm2835/Kconfig
+--- linux-3.18.8/drivers/media/platform/bcm2835/Kconfig 1970-01-01 01:00:00.000000000 +0100
++++ linux-rpi/drivers/media/platform/bcm2835/Kconfig 2015-03-05 14:40:13.981715822 +0100
@@ -0,0 +1,25 @@
+# Broadcom VideoCore IV v4l2 camera support
+
@@ -29875,18 +29780,18 @@ diff -Nur linux-3.18.6/drivers/media/platform/bcm2835/Kconfig linux-rpi/drivers/
+
+
+endif # VIDEO_BM2835
-diff -Nur linux-3.18.6/drivers/media/platform/bcm2835/Makefile linux-rpi/drivers/media/platform/bcm2835/Makefile
---- linux-3.18.6/drivers/media/platform/bcm2835/Makefile 1970-01-01 01:00:00.000000000 +0100
-+++ linux-rpi/drivers/media/platform/bcm2835/Makefile 2015-02-09 04:40:03.000000000 +0100
+diff -Nur linux-3.18.8/drivers/media/platform/bcm2835/Makefile linux-rpi/drivers/media/platform/bcm2835/Makefile
+--- linux-3.18.8/drivers/media/platform/bcm2835/Makefile 1970-01-01 01:00:00.000000000 +0100
++++ linux-rpi/drivers/media/platform/bcm2835/Makefile 2015-03-05 14:40:13.981715822 +0100
@@ -0,0 +1,5 @@
+bcm2835-v4l2-objs := bcm2835-camera.o controls.o mmal-vchiq.o
+
+obj-$(CONFIG_VIDEO_BCM2835_MMAL) += bcm2835-v4l2.o
+
+ccflags-$(CONFIG_VIDEO_BCM2835) += -Idrivers/misc/vc04_services -Idrivers/misc/vc04_services/interface/vcos/linuxkernel -D__VCCOREVER__=0x04000000
-diff -Nur linux-3.18.6/drivers/media/platform/bcm2835/mmal-common.h linux-rpi/drivers/media/platform/bcm2835/mmal-common.h
---- linux-3.18.6/drivers/media/platform/bcm2835/mmal-common.h 1970-01-01 01:00:00.000000000 +0100
-+++ linux-rpi/drivers/media/platform/bcm2835/mmal-common.h 2015-02-09 04:40:03.000000000 +0100
+diff -Nur linux-3.18.8/drivers/media/platform/bcm2835/mmal-common.h linux-rpi/drivers/media/platform/bcm2835/mmal-common.h
+--- linux-3.18.8/drivers/media/platform/bcm2835/mmal-common.h 1970-01-01 01:00:00.000000000 +0100
++++ linux-rpi/drivers/media/platform/bcm2835/mmal-common.h 2015-03-05 14:40:13.981715822 +0100
@@ -0,0 +1,53 @@
+/*
+ * Broadcom BM2835 V4L2 driver
@@ -29941,9 +29846,9 @@ diff -Nur linux-3.18.6/drivers/media/platform/bcm2835/mmal-common.h linux-rpi/dr
+ u32 v;
+};
+
-diff -Nur linux-3.18.6/drivers/media/platform/bcm2835/mmal-encodings.h linux-rpi/drivers/media/platform/bcm2835/mmal-encodings.h
---- linux-3.18.6/drivers/media/platform/bcm2835/mmal-encodings.h 1970-01-01 01:00:00.000000000 +0100
-+++ linux-rpi/drivers/media/platform/bcm2835/mmal-encodings.h 2015-02-09 04:40:03.000000000 +0100
+diff -Nur linux-3.18.8/drivers/media/platform/bcm2835/mmal-encodings.h linux-rpi/drivers/media/platform/bcm2835/mmal-encodings.h
+--- linux-3.18.8/drivers/media/platform/bcm2835/mmal-encodings.h 1970-01-01 01:00:00.000000000 +0100
++++ linux-rpi/drivers/media/platform/bcm2835/mmal-encodings.h 2015-03-05 14:40:13.981715822 +0100
@@ -0,0 +1,127 @@
+/*
+ * Broadcom BM2835 V4L2 driver
@@ -30072,9 +29977,9 @@ diff -Nur linux-3.18.6/drivers/media/platform/bcm2835/mmal-encodings.h linux-rpi
+/* @} MmalColorSpace List */
+
+#endif /* MMAL_ENCODINGS_H */
-diff -Nur linux-3.18.6/drivers/media/platform/bcm2835/mmal-msg-common.h linux-rpi/drivers/media/platform/bcm2835/mmal-msg-common.h
---- linux-3.18.6/drivers/media/platform/bcm2835/mmal-msg-common.h 1970-01-01 01:00:00.000000000 +0100
-+++ linux-rpi/drivers/media/platform/bcm2835/mmal-msg-common.h 2015-02-09 04:40:03.000000000 +0100
+diff -Nur linux-3.18.8/drivers/media/platform/bcm2835/mmal-msg-common.h linux-rpi/drivers/media/platform/bcm2835/mmal-msg-common.h
+--- linux-3.18.8/drivers/media/platform/bcm2835/mmal-msg-common.h 1970-01-01 01:00:00.000000000 +0100
++++ linux-rpi/drivers/media/platform/bcm2835/mmal-msg-common.h 2015-03-05 14:40:13.981715822 +0100
@@ -0,0 +1,50 @@
+/*
+ * Broadcom BM2835 V4L2 driver
@@ -30126,9 +30031,9 @@ diff -Nur linux-3.18.6/drivers/media/platform/bcm2835/mmal-msg-common.h linux-rp
+};
+
+#endif /* MMAL_MSG_COMMON_H */
-diff -Nur linux-3.18.6/drivers/media/platform/bcm2835/mmal-msg-format.h linux-rpi/drivers/media/platform/bcm2835/mmal-msg-format.h
---- linux-3.18.6/drivers/media/platform/bcm2835/mmal-msg-format.h 1970-01-01 01:00:00.000000000 +0100
-+++ linux-rpi/drivers/media/platform/bcm2835/mmal-msg-format.h 2015-02-09 04:40:03.000000000 +0100
+diff -Nur linux-3.18.8/drivers/media/platform/bcm2835/mmal-msg-format.h linux-rpi/drivers/media/platform/bcm2835/mmal-msg-format.h
+--- linux-3.18.8/drivers/media/platform/bcm2835/mmal-msg-format.h 1970-01-01 01:00:00.000000000 +0100
++++ linux-rpi/drivers/media/platform/bcm2835/mmal-msg-format.h 2015-03-05 14:40:13.981715822 +0100
@@ -0,0 +1,81 @@
+/*
+ * Broadcom BM2835 V4L2 driver
@@ -30211,9 +30116,9 @@ diff -Nur linux-3.18.6/drivers/media/platform/bcm2835/mmal-msg-format.h linux-rp
+};
+
+#endif /* MMAL_MSG_FORMAT_H */
-diff -Nur linux-3.18.6/drivers/media/platform/bcm2835/mmal-msg.h linux-rpi/drivers/media/platform/bcm2835/mmal-msg.h
---- linux-3.18.6/drivers/media/platform/bcm2835/mmal-msg.h 1970-01-01 01:00:00.000000000 +0100
-+++ linux-rpi/drivers/media/platform/bcm2835/mmal-msg.h 2015-02-09 04:40:03.000000000 +0100
+diff -Nur linux-3.18.8/drivers/media/platform/bcm2835/mmal-msg.h linux-rpi/drivers/media/platform/bcm2835/mmal-msg.h
+--- linux-3.18.8/drivers/media/platform/bcm2835/mmal-msg.h 1970-01-01 01:00:00.000000000 +0100
++++ linux-rpi/drivers/media/platform/bcm2835/mmal-msg.h 2015-03-05 14:40:13.981715822 +0100
@@ -0,0 +1,404 @@
+/*
+ * Broadcom BM2835 V4L2 driver
@@ -30619,9 +30524,9 @@ diff -Nur linux-3.18.6/drivers/media/platform/bcm2835/mmal-msg.h linux-rpi/drive
+ u8 payload[MMAL_MSG_MAX_PAYLOAD];
+ } u;
+};
-diff -Nur linux-3.18.6/drivers/media/platform/bcm2835/mmal-msg-port.h linux-rpi/drivers/media/platform/bcm2835/mmal-msg-port.h
---- linux-3.18.6/drivers/media/platform/bcm2835/mmal-msg-port.h 1970-01-01 01:00:00.000000000 +0100
-+++ linux-rpi/drivers/media/platform/bcm2835/mmal-msg-port.h 2015-02-09 04:40:03.000000000 +0100
+diff -Nur linux-3.18.8/drivers/media/platform/bcm2835/mmal-msg-port.h linux-rpi/drivers/media/platform/bcm2835/mmal-msg-port.h
+--- linux-3.18.8/drivers/media/platform/bcm2835/mmal-msg-port.h 1970-01-01 01:00:00.000000000 +0100
++++ linux-rpi/drivers/media/platform/bcm2835/mmal-msg-port.h 2015-03-05 14:40:13.981715822 +0100
@@ -0,0 +1,107 @@
+/*
+ * Broadcom BM2835 V4L2 driver
@@ -30730,9 +30635,9 @@ diff -Nur linux-3.18.6/drivers/media/platform/bcm2835/mmal-msg-port.h linux-rpi/
+ */
+
+};
-diff -Nur linux-3.18.6/drivers/media/platform/bcm2835/mmal-parameters.h linux-rpi/drivers/media/platform/bcm2835/mmal-parameters.h
---- linux-3.18.6/drivers/media/platform/bcm2835/mmal-parameters.h 1970-01-01 01:00:00.000000000 +0100
-+++ linux-rpi/drivers/media/platform/bcm2835/mmal-parameters.h 2015-02-09 04:40:03.000000000 +0100
+diff -Nur linux-3.18.8/drivers/media/platform/bcm2835/mmal-parameters.h linux-rpi/drivers/media/platform/bcm2835/mmal-parameters.h
+--- linux-3.18.8/drivers/media/platform/bcm2835/mmal-parameters.h 1970-01-01 01:00:00.000000000 +0100
++++ linux-rpi/drivers/media/platform/bcm2835/mmal-parameters.h 2015-03-05 14:40:13.981715822 +0100
@@ -0,0 +1,656 @@
+/*
+ * Broadcom BM2835 V4L2 driver
@@ -31390,9 +31295,9 @@ diff -Nur linux-3.18.6/drivers/media/platform/bcm2835/mmal-parameters.h linux-rp
+ u32 num_effect_params;
+ u32 effect_parameter[MMAL_MAX_IMAGEFX_PARAMETERS];
+};
-diff -Nur linux-3.18.6/drivers/media/platform/bcm2835/mmal-vchiq.c linux-rpi/drivers/media/platform/bcm2835/mmal-vchiq.c
---- linux-3.18.6/drivers/media/platform/bcm2835/mmal-vchiq.c 1970-01-01 01:00:00.000000000 +0100
-+++ linux-rpi/drivers/media/platform/bcm2835/mmal-vchiq.c 2015-02-09 04:40:03.000000000 +0100
+diff -Nur linux-3.18.8/drivers/media/platform/bcm2835/mmal-vchiq.c linux-rpi/drivers/media/platform/bcm2835/mmal-vchiq.c
+--- linux-3.18.8/drivers/media/platform/bcm2835/mmal-vchiq.c 1970-01-01 01:00:00.000000000 +0100
++++ linux-rpi/drivers/media/platform/bcm2835/mmal-vchiq.c 2015-03-05 14:40:13.981715822 +0100
@@ -0,0 +1,1916 @@
+/*
+ * Broadcom BM2835 V4L2 driver
@@ -33310,9 +33215,9 @@ diff -Nur linux-3.18.6/drivers/media/platform/bcm2835/mmal-vchiq.c linux-rpi/dri
+ kfree(instance);
+ return -ENODEV;
+}
-diff -Nur linux-3.18.6/drivers/media/platform/bcm2835/mmal-vchiq.h linux-rpi/drivers/media/platform/bcm2835/mmal-vchiq.h
---- linux-3.18.6/drivers/media/platform/bcm2835/mmal-vchiq.h 1970-01-01 01:00:00.000000000 +0100
-+++ linux-rpi/drivers/media/platform/bcm2835/mmal-vchiq.h 2015-02-09 04:40:03.000000000 +0100
+diff -Nur linux-3.18.8/drivers/media/platform/bcm2835/mmal-vchiq.h linux-rpi/drivers/media/platform/bcm2835/mmal-vchiq.h
+--- linux-3.18.8/drivers/media/platform/bcm2835/mmal-vchiq.h 1970-01-01 01:00:00.000000000 +0100
++++ linux-rpi/drivers/media/platform/bcm2835/mmal-vchiq.h 2015-03-05 14:40:13.981715822 +0100
@@ -0,0 +1,178 @@
+/*
+ * Broadcom BM2835 V4L2 driver
@@ -33492,9 +33397,9 @@ diff -Nur linux-3.18.6/drivers/media/platform/bcm2835/mmal-vchiq.h linux-rpi/dri
+ struct mmal_buffer *buf);
+
+#endif /* MMAL_VCHIQ_H */
-diff -Nur linux-3.18.6/drivers/media/platform/Kconfig linux-rpi/drivers/media/platform/Kconfig
---- linux-3.18.6/drivers/media/platform/Kconfig 2015-02-06 15:53:48.000000000 +0100
-+++ linux-rpi/drivers/media/platform/Kconfig 2015-02-09 04:40:03.000000000 +0100
+diff -Nur linux-3.18.8/drivers/media/platform/Kconfig linux-rpi/drivers/media/platform/Kconfig
+--- linux-3.18.8/drivers/media/platform/Kconfig 2015-02-27 02:49:36.000000000 +0100
++++ linux-rpi/drivers/media/platform/Kconfig 2015-03-05 14:40:13.981715822 +0100
@@ -126,6 +126,7 @@
source "drivers/media/platform/soc_camera/Kconfig"
source "drivers/media/platform/exynos4-is/Kconfig"
@@ -33503,9 +33408,9 @@ diff -Nur linux-3.18.6/drivers/media/platform/Kconfig linux-rpi/drivers/media/pl
endif # V4L_PLATFORM_DRIVERS
-diff -Nur linux-3.18.6/drivers/media/platform/Makefile linux-rpi/drivers/media/platform/Makefile
---- linux-3.18.6/drivers/media/platform/Makefile 2015-02-06 15:53:48.000000000 +0100
-+++ linux-rpi/drivers/media/platform/Makefile 2015-02-09 04:40:03.000000000 +0100
+diff -Nur linux-3.18.8/drivers/media/platform/Makefile linux-rpi/drivers/media/platform/Makefile
+--- linux-3.18.8/drivers/media/platform/Makefile 2015-02-27 02:49:36.000000000 +0100
++++ linux-rpi/drivers/media/platform/Makefile 2015-03-05 14:40:13.981715822 +0100
@@ -49,4 +49,6 @@
obj-y += omap/
@@ -33513,9 +33418,9 @@ diff -Nur linux-3.18.6/drivers/media/platform/Makefile linux-rpi/drivers/media/p
+obj-$(CONFIG_VIDEO_BCM2835) += bcm2835/
+
ccflags-y += -I$(srctree)/drivers/media/i2c
-diff -Nur linux-3.18.6/drivers/media/usb/dvb-usb-v2/rtl28xxu.c linux-rpi/drivers/media/usb/dvb-usb-v2/rtl28xxu.c
---- linux-3.18.6/drivers/media/usb/dvb-usb-v2/rtl28xxu.c 2015-02-06 15:53:48.000000000 +0100
-+++ linux-rpi/drivers/media/usb/dvb-usb-v2/rtl28xxu.c 2015-02-09 04:40:03.000000000 +0100
+diff -Nur linux-3.18.8/drivers/media/usb/dvb-usb-v2/rtl28xxu.c linux-rpi/drivers/media/usb/dvb-usb-v2/rtl28xxu.c
+--- linux-3.18.8/drivers/media/usb/dvb-usb-v2/rtl28xxu.c 2015-02-27 02:49:36.000000000 +0100
++++ linux-rpi/drivers/media/usb/dvb-usb-v2/rtl28xxu.c 2015-03-05 14:40:14.161715821 +0100
@@ -1531,6 +1531,10 @@
&rtl2832u_props, "Compro VideoMate U620F", NULL) },
{ DVB_USB_DEVICE(USB_VID_KWORLD_2, 0xd394,
@@ -33527,9 +33432,9 @@ diff -Nur linux-3.18.6/drivers/media/usb/dvb-usb-v2/rtl28xxu.c linux-rpi/drivers
{ DVB_USB_DEVICE(USB_VID_LEADTEK, 0x6a03,
&rtl2832u_props, "Leadtek WinFast DTV Dongle mini", NULL) },
{ DVB_USB_DEVICE(USB_VID_GTEK, USB_PID_CPYTO_REDI_PC50A,
-diff -Nur linux-3.18.6/drivers/misc/Kconfig linux-rpi/drivers/misc/Kconfig
---- linux-3.18.6/drivers/misc/Kconfig 2015-02-06 15:53:48.000000000 +0100
-+++ linux-rpi/drivers/misc/Kconfig 2015-02-09 04:40:04.000000000 +0100
+diff -Nur linux-3.18.8/drivers/misc/Kconfig linux-rpi/drivers/misc/Kconfig
+--- linux-3.18.8/drivers/misc/Kconfig 2015-02-27 02:49:36.000000000 +0100
++++ linux-rpi/drivers/misc/Kconfig 2015-03-05 14:40:14.221715820 +0100
@@ -524,6 +524,7 @@
source "drivers/misc/altera-stapl/Kconfig"
source "drivers/misc/mei/Kconfig"
@@ -33538,9 +33443,9 @@ diff -Nur linux-3.18.6/drivers/misc/Kconfig linux-rpi/drivers/misc/Kconfig
source "drivers/misc/mic/Kconfig"
source "drivers/misc/genwqe/Kconfig"
source "drivers/misc/echo/Kconfig"
-diff -Nur linux-3.18.6/drivers/misc/Makefile linux-rpi/drivers/misc/Makefile
---- linux-3.18.6/drivers/misc/Makefile 2015-02-06 15:53:48.000000000 +0100
-+++ linux-rpi/drivers/misc/Makefile 2015-02-09 04:40:04.000000000 +0100
+diff -Nur linux-3.18.8/drivers/misc/Makefile linux-rpi/drivers/misc/Makefile
+--- linux-3.18.8/drivers/misc/Makefile 2015-02-27 02:49:36.000000000 +0100
++++ linux-rpi/drivers/misc/Makefile 2015-03-05 14:40:14.221715820 +0100
@@ -51,6 +51,7 @@
obj-$(CONFIG_VMWARE_VMCI) += vmw_vmci/
obj-$(CONFIG_LATTICE_ECP3_CONFIG) += lattice-ecp3-config.o
@@ -33549,9 +33454,9 @@ diff -Nur linux-3.18.6/drivers/misc/Makefile linux-rpi/drivers/misc/Makefile
obj-y += mic/
obj-$(CONFIG_GENWQE) += genwqe/
obj-$(CONFIG_ECHO) += echo/
-diff -Nur linux-3.18.6/drivers/misc/vc04_services/interface/vchi/connections/connection.h linux-rpi/drivers/misc/vc04_services/interface/vchi/connections/connection.h
---- linux-3.18.6/drivers/misc/vc04_services/interface/vchi/connections/connection.h 1970-01-01 01:00:00.000000000 +0100
-+++ linux-rpi/drivers/misc/vc04_services/interface/vchi/connections/connection.h 2015-02-09 04:40:07.000000000 +0100
+diff -Nur linux-3.18.8/drivers/misc/vc04_services/interface/vchi/connections/connection.h linux-rpi/drivers/misc/vc04_services/interface/vchi/connections/connection.h
+--- linux-3.18.8/drivers/misc/vc04_services/interface/vchi/connections/connection.h 1970-01-01 01:00:00.000000000 +0100
++++ linux-rpi/drivers/misc/vc04_services/interface/vchi/connections/connection.h 2015-03-05 14:40:14.401715819 +0100
@@ -0,0 +1,328 @@
+/**
+ * Copyright (c) 2010-2012 Broadcom. All rights reserved.
@@ -33881,9 +33786,9 @@ diff -Nur linux-3.18.6/drivers/misc/vc04_services/interface/vchi/connections/con
+#endif /* CONNECTION_H_ */
+
+/****************************** End of file **********************************/
-diff -Nur linux-3.18.6/drivers/misc/vc04_services/interface/vchi/message_drivers/message.h linux-rpi/drivers/misc/vc04_services/interface/vchi/message_drivers/message.h
---- linux-3.18.6/drivers/misc/vc04_services/interface/vchi/message_drivers/message.h 1970-01-01 01:00:00.000000000 +0100
-+++ linux-rpi/drivers/misc/vc04_services/interface/vchi/message_drivers/message.h 2015-02-09 04:40:07.000000000 +0100
+diff -Nur linux-3.18.8/drivers/misc/vc04_services/interface/vchi/message_drivers/message.h linux-rpi/drivers/misc/vc04_services/interface/vchi/message_drivers/message.h
+--- linux-3.18.8/drivers/misc/vc04_services/interface/vchi/message_drivers/message.h 1970-01-01 01:00:00.000000000 +0100
++++ linux-rpi/drivers/misc/vc04_services/interface/vchi/message_drivers/message.h 2015-03-05 14:40:14.401715819 +0100
@@ -0,0 +1,204 @@
+/**
+ * Copyright (c) 2010-2012 Broadcom. All rights reserved.
@@ -34089,9 +33994,9 @@ diff -Nur linux-3.18.6/drivers/misc/vc04_services/interface/vchi/message_drivers
+#endif // _VCHI_MESSAGE_H_
+
+/****************************** End of file ***********************************/
-diff -Nur linux-3.18.6/drivers/misc/vc04_services/interface/vchi/vchi_cfg.h linux-rpi/drivers/misc/vc04_services/interface/vchi/vchi_cfg.h
---- linux-3.18.6/drivers/misc/vc04_services/interface/vchi/vchi_cfg.h 1970-01-01 01:00:00.000000000 +0100
-+++ linux-rpi/drivers/misc/vc04_services/interface/vchi/vchi_cfg.h 2015-02-09 04:40:07.000000000 +0100
+diff -Nur linux-3.18.8/drivers/misc/vc04_services/interface/vchi/vchi_cfg.h linux-rpi/drivers/misc/vc04_services/interface/vchi/vchi_cfg.h
+--- linux-3.18.8/drivers/misc/vc04_services/interface/vchi/vchi_cfg.h 1970-01-01 01:00:00.000000000 +0100
++++ linux-rpi/drivers/misc/vc04_services/interface/vchi/vchi_cfg.h 2015-03-05 14:40:14.401715819 +0100
@@ -0,0 +1,224 @@
+/**
+ * Copyright (c) 2010-2012 Broadcom. All rights reserved.
@@ -34317,9 +34222,9 @@ diff -Nur linux-3.18.6/drivers/misc/vc04_services/interface/vchi/vchi_cfg.h linu
+#endif /* VCHI_CFG_H_ */
+
+/****************************** End of file **********************************/
-diff -Nur linux-3.18.6/drivers/misc/vc04_services/interface/vchi/vchi_cfg_internal.h linux-rpi/drivers/misc/vc04_services/interface/vchi/vchi_cfg_internal.h
---- linux-3.18.6/drivers/misc/vc04_services/interface/vchi/vchi_cfg_internal.h 1970-01-01 01:00:00.000000000 +0100
-+++ linux-rpi/drivers/misc/vc04_services/interface/vchi/vchi_cfg_internal.h 2015-02-09 04:40:07.000000000 +0100
+diff -Nur linux-3.18.8/drivers/misc/vc04_services/interface/vchi/vchi_cfg_internal.h linux-rpi/drivers/misc/vc04_services/interface/vchi/vchi_cfg_internal.h
+--- linux-3.18.8/drivers/misc/vc04_services/interface/vchi/vchi_cfg_internal.h 1970-01-01 01:00:00.000000000 +0100
++++ linux-rpi/drivers/misc/vc04_services/interface/vchi/vchi_cfg_internal.h 2015-03-05 14:40:14.401715819 +0100
@@ -0,0 +1,71 @@
+/**
+ * Copyright (c) 2010-2012 Broadcom. All rights reserved.
@@ -34392,10 +34297,10 @@ diff -Nur linux-3.18.6/drivers/misc/vc04_services/interface/vchi/vchi_cfg_intern
+//#define VCHI_RX_NANOLOCKS
+
+#endif /*VCHI_CFG_INTERNAL_H_*/
-diff -Nur linux-3.18.6/drivers/misc/vc04_services/interface/vchi/vchi_common.h linux-rpi/drivers/misc/vc04_services/interface/vchi/vchi_common.h
---- linux-3.18.6/drivers/misc/vc04_services/interface/vchi/vchi_common.h 1970-01-01 01:00:00.000000000 +0100
-+++ linux-rpi/drivers/misc/vc04_services/interface/vchi/vchi_common.h 2015-02-09 04:40:07.000000000 +0100
-@@ -0,0 +1,174 @@
+diff -Nur linux-3.18.8/drivers/misc/vc04_services/interface/vchi/vchi_common.h linux-rpi/drivers/misc/vc04_services/interface/vchi/vchi_common.h
+--- linux-3.18.8/drivers/misc/vc04_services/interface/vchi/vchi_common.h 1970-01-01 01:00:00.000000000 +0100
++++ linux-rpi/drivers/misc/vc04_services/interface/vchi/vchi_common.h 2015-03-05 14:40:14.401715819 +0100
+@@ -0,0 +1,175 @@
+/**
+ * Copyright (c) 2010-2012 Broadcom. All rights reserved.
+ *
@@ -34514,6 +34419,7 @@ diff -Nur linux-3.18.6/drivers/misc/vc04_services/interface/vchi/vchi_common.h l
+ VCHI_SERVICE_OPTION_MIN,
+
+ VCHI_SERVICE_OPTION_TRACE,
++ VCHI_SERVICE_OPTION_SYNCHRONOUS,
+
+ VCHI_SERVICE_OPTION_MAX
+} VCHI_SERVICE_OPTION_T;
@@ -34570,9 +34476,9 @@ diff -Nur linux-3.18.6/drivers/misc/vc04_services/interface/vchi/vchi_common.h l
+
+
+#endif // VCHI_COMMON_H_
-diff -Nur linux-3.18.6/drivers/misc/vc04_services/interface/vchi/vchi.h linux-rpi/drivers/misc/vc04_services/interface/vchi/vchi.h
---- linux-3.18.6/drivers/misc/vc04_services/interface/vchi/vchi.h 1970-01-01 01:00:00.000000000 +0100
-+++ linux-rpi/drivers/misc/vc04_services/interface/vchi/vchi.h 2015-02-09 04:40:07.000000000 +0100
+diff -Nur linux-3.18.8/drivers/misc/vc04_services/interface/vchi/vchi.h linux-rpi/drivers/misc/vc04_services/interface/vchi/vchi.h
+--- linux-3.18.8/drivers/misc/vc04_services/interface/vchi/vchi.h 1970-01-01 01:00:00.000000000 +0100
++++ linux-rpi/drivers/misc/vc04_services/interface/vchi/vchi.h 2015-03-05 14:40:14.401715819 +0100
@@ -0,0 +1,378 @@
+/**
+ * Copyright (c) 2010-2012 Broadcom. All rights reserved.
@@ -34952,9 +34858,9 @@ diff -Nur linux-3.18.6/drivers/misc/vc04_services/interface/vchi/vchi.h linux-rp
+#endif /* VCHI_H_ */
+
+/****************************** End of file **********************************/
-diff -Nur linux-3.18.6/drivers/misc/vc04_services/interface/vchi/vchi_mh.h linux-rpi/drivers/misc/vc04_services/interface/vchi/vchi_mh.h
---- linux-3.18.6/drivers/misc/vc04_services/interface/vchi/vchi_mh.h 1970-01-01 01:00:00.000000000 +0100
-+++ linux-rpi/drivers/misc/vc04_services/interface/vchi/vchi_mh.h 2015-02-09 04:40:07.000000000 +0100
+diff -Nur linux-3.18.8/drivers/misc/vc04_services/interface/vchi/vchi_mh.h linux-rpi/drivers/misc/vc04_services/interface/vchi/vchi_mh.h
+--- linux-3.18.8/drivers/misc/vc04_services/interface/vchi/vchi_mh.h 1970-01-01 01:00:00.000000000 +0100
++++ linux-rpi/drivers/misc/vc04_services/interface/vchi/vchi_mh.h 2015-03-05 14:40:14.401715819 +0100
@@ -0,0 +1,42 @@
+/**
+ * Copyright (c) 2010-2012 Broadcom. All rights reserved.
@@ -34998,9 +34904,9 @@ diff -Nur linux-3.18.6/drivers/misc/vc04_services/interface/vchi/vchi_mh.h linux
+#define VCHI_MEM_HANDLE_INVALID 0
+
+#endif
-diff -Nur linux-3.18.6/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_2835_arm.c linux-rpi/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_2835_arm.c
---- linux-3.18.6/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_2835_arm.c 1970-01-01 01:00:00.000000000 +0100
-+++ linux-rpi/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_2835_arm.c 2015-02-09 04:40:07.000000000 +0100
+diff -Nur linux-3.18.8/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_2835_arm.c linux-rpi/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_2835_arm.c
+--- linux-3.18.8/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_2835_arm.c 1970-01-01 01:00:00.000000000 +0100
++++ linux-rpi/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_2835_arm.c 2015-03-05 14:40:14.401715819 +0100
@@ -0,0 +1,562 @@
+/**
+ * Copyright (c) 2010-2012 Broadcom. All rights reserved.
@@ -35564,9 +35470,9 @@ diff -Nur linux-3.18.6/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_2835
+
+ kfree(pagelist);
+}
-diff -Nur linux-3.18.6/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_2835.h linux-rpi/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_2835.h
---- linux-3.18.6/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_2835.h 1970-01-01 01:00:00.000000000 +0100
-+++ linux-rpi/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_2835.h 2015-02-09 04:40:07.000000000 +0100
+diff -Nur linux-3.18.8/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_2835.h linux-rpi/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_2835.h
+--- linux-3.18.8/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_2835.h 1970-01-01 01:00:00.000000000 +0100
++++ linux-rpi/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_2835.h 2015-03-05 14:40:14.401715819 +0100
@@ -0,0 +1,42 @@
+/**
+ * Copyright (c) 2010-2012 Broadcom. All rights reserved.
@@ -35610,9 +35516,9 @@ diff -Nur linux-3.18.6/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_2835
+#define VCHIQ_PLATFORM_FRAGMENTS_COUNT_IDX 1
+
+#endif /* VCHIQ_2835_H */
-diff -Nur linux-3.18.6/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_arm.c linux-rpi/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_arm.c
---- linux-3.18.6/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_arm.c 1970-01-01 01:00:00.000000000 +0100
-+++ linux-rpi/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_arm.c 2015-02-09 04:40:08.000000000 +0100
+diff -Nur linux-3.18.8/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_arm.c linux-rpi/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_arm.c
+--- linux-3.18.8/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_arm.c 1970-01-01 01:00:00.000000000 +0100
++++ linux-rpi/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_arm.c 2015-03-05 14:40:14.401715819 +0100
@@ -0,0 +1,2884 @@
+/**
+ * Copyright (c) 2014 Raspberry Pi (Trading) Ltd. All rights reserved.
@@ -38498,9 +38404,9 @@ diff -Nur linux-3.18.6/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_arm.
+module_exit(vchiq_exit);
+MODULE_LICENSE("GPL");
+MODULE_AUTHOR("Broadcom Corporation");
-diff -Nur linux-3.18.6/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_arm.h linux-rpi/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_arm.h
---- linux-3.18.6/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_arm.h 1970-01-01 01:00:00.000000000 +0100
-+++ linux-rpi/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_arm.h 2015-02-09 04:40:08.000000000 +0100
+diff -Nur linux-3.18.8/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_arm.h linux-rpi/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_arm.h
+--- linux-3.18.8/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_arm.h 1970-01-01 01:00:00.000000000 +0100
++++ linux-rpi/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_arm.h 2015-03-05 14:40:14.401715819 +0100
@@ -0,0 +1,223 @@
+/**
+ * Copyright (c) 2014 Raspberry Pi (Trading) Ltd. All rights reserved.
@@ -38725,9 +38631,9 @@ diff -Nur linux-3.18.6/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_arm.
+
+
+#endif /* VCHIQ_ARM_H */
-diff -Nur linux-3.18.6/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_build_info.h linux-rpi/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_build_info.h
---- linux-3.18.6/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_build_info.h 1970-01-01 01:00:00.000000000 +0100
-+++ linux-rpi/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_build_info.h 2015-02-09 04:40:08.000000000 +0100
+diff -Nur linux-3.18.8/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_build_info.h linux-rpi/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_build_info.h
+--- linux-3.18.8/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_build_info.h 1970-01-01 01:00:00.000000000 +0100
++++ linux-rpi/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_build_info.h 2015-03-05 14:40:14.401715819 +0100
@@ -0,0 +1,37 @@
+/**
+ * Copyright (c) 2010-2012 Broadcom. All rights reserved.
@@ -38766,10 +38672,10 @@ diff -Nur linux-3.18.6/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_buil
+const char *vchiq_get_build_version(void);
+const char *vchiq_get_build_time(void);
+const char *vchiq_get_build_date(void);
-diff -Nur linux-3.18.6/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_cfg.h linux-rpi/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_cfg.h
---- linux-3.18.6/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_cfg.h 1970-01-01 01:00:00.000000000 +0100
-+++ linux-rpi/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_cfg.h 2015-02-09 04:40:08.000000000 +0100
-@@ -0,0 +1,66 @@
+diff -Nur linux-3.18.8/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_cfg.h linux-rpi/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_cfg.h
+--- linux-3.18.8/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_cfg.h 1970-01-01 01:00:00.000000000 +0100
++++ linux-rpi/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_cfg.h 2015-03-05 14:40:14.401715819 +0100
+@@ -0,0 +1,69 @@
+/**
+ * Copyright (c) 2010-2014 Broadcom. All rights reserved.
+ *
@@ -38808,7 +38714,7 @@ diff -Nur linux-3.18.6/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_cfg.
+
+#define VCHIQ_MAGIC VCHIQ_MAKE_FOURCC('V', 'C', 'H', 'I')
+/* The version of VCHIQ - change with any non-trivial change */
-+#define VCHIQ_VERSION 7
++#define VCHIQ_VERSION 8
+/* The minimum compatible version - update to match VCHIQ_VERSION with any
+** incompatible change */
+#define VCHIQ_VERSION_MIN 3
@@ -38819,6 +38725,9 @@ diff -Nur linux-3.18.6/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_cfg.
+/* The version that introduced the VCHIQ_IOC_CLOSE_DELIVERED ioctl */
+#define VCHIQ_VERSION_CLOSE_DELIVERED 7
+
++/* The version that made it safe to use SYNCHRONOUS mode */
++#define VCHIQ_VERSION_SYNCHRONOUS_MODE 8
++
+#define VCHIQ_MAX_STATES 1
+#define VCHIQ_MAX_SERVICES 4096
+#define VCHIQ_MAX_SLOTS 128
@@ -38836,9 +38745,9 @@ diff -Nur linux-3.18.6/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_cfg.
+#endif
+
+#endif /* VCHIQ_CFG_H */
-diff -Nur linux-3.18.6/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_connected.c linux-rpi/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_connected.c
---- linux-3.18.6/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_connected.c 1970-01-01 01:00:00.000000000 +0100
-+++ linux-rpi/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_connected.c 2015-02-09 04:40:08.000000000 +0100
+diff -Nur linux-3.18.8/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_connected.c linux-rpi/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_connected.c
+--- linux-3.18.8/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_connected.c 1970-01-01 01:00:00.000000000 +0100
++++ linux-rpi/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_connected.c 2015-03-05 14:40:14.401715819 +0100
@@ -0,0 +1,120 @@
+/**
+ * Copyright (c) 2010-2012 Broadcom. All rights reserved.
@@ -38960,9 +38869,9 @@ diff -Nur linux-3.18.6/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_conn
+ mutex_unlock(&g_connected_mutex);
+}
+EXPORT_SYMBOL(vchiq_add_connected_callback);
-diff -Nur linux-3.18.6/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_connected.h linux-rpi/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_connected.h
---- linux-3.18.6/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_connected.h 1970-01-01 01:00:00.000000000 +0100
-+++ linux-rpi/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_connected.h 2015-02-09 04:40:08.000000000 +0100
+diff -Nur linux-3.18.8/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_connected.h linux-rpi/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_connected.h
+--- linux-3.18.8/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_connected.h 1970-01-01 01:00:00.000000000 +0100
++++ linux-rpi/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_connected.h 2015-03-05 14:40:14.401715819 +0100
@@ -0,0 +1,50 @@
+/**
+ * Copyright (c) 2010-2012 Broadcom. All rights reserved.
@@ -39014,10 +38923,10 @@ diff -Nur linux-3.18.6/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_conn
+void vchiq_call_connected_callbacks(void);
+
+#endif /* VCHIQ_CONNECTED_H */
-diff -Nur linux-3.18.6/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_core.c linux-rpi/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_core.c
---- linux-3.18.6/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_core.c 1970-01-01 01:00:00.000000000 +0100
-+++ linux-rpi/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_core.c 2015-02-09 04:40:08.000000000 +0100
-@@ -0,0 +1,3862 @@
+diff -Nur linux-3.18.8/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_core.c linux-rpi/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_core.c
+--- linux-3.18.8/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_core.c 1970-01-01 01:00:00.000000000 +0100
++++ linux-rpi/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_core.c 2015-03-05 14:40:14.401715819 +0100
+@@ -0,0 +1,3934 @@
+/**
+ * Copyright (c) 2010-2012 Broadcom. All rights reserved.
+ *
@@ -39086,6 +38995,13 @@ diff -Nur linux-3.18.6/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_core
+ short version;
+};
+
++enum
++{
++ QMFLAGS_IS_BLOCKING = (1 << 0),
++ QMFLAGS_NO_MUTEX_LOCK = (1 << 1),
++ QMFLAGS_NO_MUTEX_UNLOCK = (1 << 2)
++};
++
+/* we require this for consistency between endpoints */
+vchiq_static_assert(sizeof(VCHIQ_HEADER_T) == 8);
+vchiq_static_assert(IS_POW2(sizeof(VCHIQ_HEADER_T)));
@@ -39763,7 +39679,7 @@ diff -Nur linux-3.18.6/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_core
+static VCHIQ_STATUS_T
+queue_message(VCHIQ_STATE_T *state, VCHIQ_SERVICE_T *service,
+ int msgid, const VCHIQ_ELEMENT_T *elements,
-+ int count, int size, int is_blocking)
++ int count, int size, int flags)
+{
+ VCHIQ_SHARED_STATE_T *local;
+ VCHIQ_SERVICE_QUOTA_T *service_quota = NULL;
@@ -39778,7 +39694,7 @@ diff -Nur linux-3.18.6/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_core
+
+ WARN_ON(!(stride <= VCHIQ_SLOT_SIZE));
+
-+ if ((type != VCHIQ_MSG_RESUME) &&
++ if (!(flags & QMFLAGS_NO_MUTEX_LOCK) &&
+ (mutex_lock_interruptible(&state->slot_mutex) != 0))
+ return VCHIQ_RETRY;
+
@@ -39786,6 +39702,8 @@ diff -Nur linux-3.18.6/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_core
+ int tx_end_index;
+
+ BUG_ON(!service);
++ BUG_ON((flags & (QMFLAGS_NO_MUTEX_LOCK |
++ QMFLAGS_NO_MUTEX_UNLOCK)) != 0);
+
+ if (service->closing) {
+ /* The service has been closed */
@@ -39861,12 +39779,15 @@ diff -Nur linux-3.18.6/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_core
+ spin_unlock(&quota_spinlock);
+ }
+
-+ header = reserve_space(state, stride, is_blocking);
++ header = reserve_space(state, stride, flags & QMFLAGS_IS_BLOCKING);
+
+ if (!header) {
+ if (service)
+ VCHIQ_SERVICE_STATS_INC(service, slot_stalls);
-+ mutex_unlock(&state->slot_mutex);
++ /* In the event of a failure, return the mutex to the
++ state it was in */
++ if (!(flags & QMFLAGS_NO_MUTEX_LOCK))
++ mutex_unlock(&state->slot_mutex);
+ return VCHIQ_RETRY;
+ }
+
@@ -39884,6 +39805,8 @@ diff -Nur linux-3.18.6/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_core
+ VCHIQ_MSG_DSTPORT(msgid));
+
+ BUG_ON(!service);
++ BUG_ON((flags & (QMFLAGS_NO_MUTEX_LOCK |
++ QMFLAGS_NO_MUTEX_UNLOCK)) != 0);
+
+ for (i = 0, pos = 0; i < (unsigned int)count;
+ pos += elements[i++].size)
@@ -39985,7 +39908,7 @@ diff -Nur linux-3.18.6/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_core
+ if (service && (type == VCHIQ_MSG_CLOSE))
+ vchiq_set_service_state(service, VCHIQ_SRVSTATE_CLOSESENT);
+
-+ if (VCHIQ_MSG_TYPE(msgid) != VCHIQ_MSG_PAUSE)
++ if (!(flags & QMFLAGS_NO_MUTEX_UNLOCK))
+ mutex_unlock(&state->slot_mutex);
+
+ remote_event_signal(&state->remote->trigger);
@@ -40555,8 +40478,14 @@ diff -Nur linux-3.18.6/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_core
+ sizeof(ack_payload)
+ };
+
++ if (state->version_common <
++ VCHIQ_VERSION_SYNCHRONOUS_MODE)
++ service->sync = 0;
++
+ /* Acknowledge the OPEN */
-+ if (service->sync) {
++ if (service->sync &&
++ (state->version_common >=
++ VCHIQ_VERSION_SYNCHRONOUS_MODE)) {
+ if (queue_message_sync(state, NULL,
+ VCHIQ_MAKE_MSG(
+ VCHIQ_MSG_OPENACK,
@@ -40810,6 +40739,8 @@ diff -Nur linux-3.18.6/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_core
+ vchiq_log_info(vchiq_core_log_level,
+ "%d: prs CONNECT@%x",
+ state->id, (unsigned int)header);
++ state->version_common = ((VCHIQ_SLOT_ZERO_T *)
++ state->slot_data)->version;
+ up(&state->connect);
+ break;
+ case VCHIQ_MSG_BULK_RX:
@@ -40963,7 +40894,8 @@ diff -Nur linux-3.18.6/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_core
+ /* Send a PAUSE in response */
+ if (queue_message(state, NULL,
+ VCHIQ_MAKE_MSG(VCHIQ_MSG_PAUSE, 0, 0),
-+ NULL, 0, 0, 0) == VCHIQ_RETRY)
++ NULL, 0, 0, QMFLAGS_NO_MUTEX_UNLOCK)
++ == VCHIQ_RETRY)
+ goto bail_not_ready;
+ if (state->is_master)
+ pause_bulks(state);
@@ -41061,7 +40993,9 @@ diff -Nur linux-3.18.6/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_core
+ pause_bulks(state);
+ if (queue_message(state, NULL,
+ VCHIQ_MAKE_MSG(VCHIQ_MSG_PAUSE, 0, 0),
-+ NULL, 0, 0, 0) != VCHIQ_RETRY) {
++ NULL, 0, 0,
++ QMFLAGS_NO_MUTEX_UNLOCK)
++ != VCHIQ_RETRY) {
+ vchiq_set_conn_state(state,
+ VCHIQ_CONNSTATE_PAUSE_SENT);
+ } else {
@@ -41079,7 +41013,8 @@ diff -Nur linux-3.18.6/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_core
+ case VCHIQ_CONNSTATE_RESUMING:
+ if (queue_message(state, NULL,
+ VCHIQ_MAKE_MSG(VCHIQ_MSG_RESUME, 0, 0),
-+ NULL, 0, 0, 0) != VCHIQ_RETRY) {
++ NULL, 0, 0, QMFLAGS_NO_MUTEX_LOCK)
++ != VCHIQ_RETRY) {
+ if (state->is_master)
+ resume_bulks(state);
+ vchiq_set_conn_state(state,
@@ -41200,6 +41135,7 @@ diff -Nur linux-3.18.6/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_core
+ service->remoteport = remoteport;
+ vchiq_set_service_state(service,
+ VCHIQ_SRVSTATE_OPENSYNC);
++ service->sync = 1;
+ up(&service->remove_event);
+ }
+ release_message_sync(state, header);
@@ -41378,6 +41314,9 @@ diff -Nur linux-3.18.6/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_core
+ return VCHIQ_ERROR;
+ }
+
++ if (VCHIQ_VERSION < slot_zero->version)
++ slot_zero->version = VCHIQ_VERSION;
++
+ if (is_master) {
+ local = &slot_zero->master;
+ remote = &slot_zero->slave;
@@ -41681,7 +41620,7 @@ diff -Nur linux-3.18.6/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_core
+ vchiq_use_service_internal(service);
+ status = queue_message(service->state, NULL,
+ VCHIQ_MAKE_MSG(VCHIQ_MSG_OPEN, service->localport, 0),
-+ &body, 1, sizeof(payload), 1);
++ &body, 1, sizeof(payload), QMFLAGS_IS_BLOCKING);
+ if (status == VCHIQ_SUCCESS) {
+ /* Wait for the ACK/NAK */
+ if (down_interruptible(&service->remove_event) != 0) {
@@ -41710,7 +41649,18 @@ diff -Nur linux-3.18.6/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_core
+ int slot_last = state->remote->slot_last;
+ int i;
+
-+ /* Release any claimed messages */
++ /* Release any claimed messages aimed at this service */
++
++ if (service->sync) {
++ VCHIQ_HEADER_T *header =
++ (VCHIQ_HEADER_T *)SLOT_DATA_FROM_INDEX(state,
++ state->remote->slot_sync);
++ if (VCHIQ_MSG_DSTPORT(header->msgid) == service->localport)
++ release_message_sync(state, header);
++
++ return;
++ }
++
+ for (i = state->remote->slot_first; i <= slot_last; i++) {
+ VCHIQ_SLOT_INFO_T *slot_info =
+ SLOT_INFO_FROM_INDEX(state, i);
@@ -41908,17 +41858,31 @@ diff -Nur linux-3.18.6/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_core
+ (VCHIQ_MSG_CLOSE,
+ service->localport,
+ VCHIQ_MSG_DSTPORT(service->remoteport)),
-+ NULL, 0, 0, 0);
++ NULL, 0, 0, QMFLAGS_NO_MUTEX_UNLOCK);
+
+ if (status == VCHIQ_SUCCESS) {
-+ if (!close_recvd)
++ if (!close_recvd) {
++ /* Change the state while the mutex is
++ still held */
++ vchiq_set_service_state(service,
++ VCHIQ_SRVSTATE_CLOSESENT);
++ mutex_unlock(&state->slot_mutex);
++ if (service->sync)
++ mutex_unlock(&state->sync_mutex);
+ break;
++ }
+ } else if (service->srvstate == VCHIQ_SRVSTATE_OPENSYNC) {
+ mutex_unlock(&state->sync_mutex);
+ break;
+ } else
+ break;
+
++ /* Change the state while the mutex is still held */
++ vchiq_set_service_state(service, VCHIQ_SRVSTATE_CLOSERECVD);
++ mutex_unlock(&state->slot_mutex);
++ if (service->sync)
++ mutex_unlock(&state->sync_mutex);
++
+ status = close_service_complete(service,
+ VCHIQ_SRVSTATE_CLOSERECVD);
+ break;
@@ -42025,7 +41989,7 @@ diff -Nur linux-3.18.6/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_core
+ if (state->conn_state == VCHIQ_CONNSTATE_DISCONNECTED) {
+ if (queue_message(state, NULL,
+ VCHIQ_MAKE_MSG(VCHIQ_MSG_CONNECT, 0, 0), NULL, 0,
-+ 0, 1) == VCHIQ_RETRY)
++ 0, QMFLAGS_IS_BLOCKING) == VCHIQ_RETRY)
+ return VCHIQ_RETRY;
+
+ vchiq_set_conn_state(state, VCHIQ_CONNSTATE_CONNECTING);
@@ -42311,6 +42275,16 @@ diff -Nur linux-3.18.6/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_core
+ service->localport, service->remoteport, dir_char,
+ size, (unsigned int)bulk->data, (unsigned int)userdata);
+
++ /* The slot mutex must be held when the service is being closed, so
++ claim it here to ensure that isn't happening */
++ if (mutex_lock_interruptible(&state->slot_mutex) != 0) {
++ status = VCHIQ_RETRY;
++ goto cancel_bulk_error_exit;
++ }
++
++ if (service->srvstate != VCHIQ_SRVSTATE_OPEN)
++ goto unlock_both_error_exit;
++
+ if (state->is_master) {
+ queue->local_insert++;
+ if (resolve_bulks(service, queue))
@@ -42324,14 +42298,17 @@ diff -Nur linux-3.18.6/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_core
+ status = queue_message(state, NULL,
+ VCHIQ_MAKE_MSG(dir_msgtype,
+ service->localport, service->remoteport),
-+ &element, 1, sizeof(payload), 1);
++ &element, 1, sizeof(payload),
++ QMFLAGS_IS_BLOCKING |
++ QMFLAGS_NO_MUTEX_LOCK |
++ QMFLAGS_NO_MUTEX_UNLOCK);
+ if (status != VCHIQ_SUCCESS) {
-+ vchiq_complete_bulk(bulk);
-+ goto unlock_error_exit;
++ goto unlock_both_error_exit;
+ }
+ queue->local_insert++;
+ }
+
++ mutex_unlock(&state->slot_mutex);
+ mutex_unlock(&service->bulk_mutex);
+
+ vchiq_log_trace(vchiq_core_log_level,
@@ -42355,6 +42332,10 @@ diff -Nur linux-3.18.6/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_core
+
+ return status;
+
++unlock_both_error_exit:
++ mutex_unlock(&state->slot_mutex);
++cancel_bulk_error_exit:
++ vchiq_complete_bulk(bulk);
+unlock_error_exit:
+ mutex_unlock(&service->bulk_mutex);
+
@@ -42880,10 +42861,10 @@ diff -Nur linux-3.18.6/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_core
+ numBytes = 0;
+ }
+}
-diff -Nur linux-3.18.6/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_core.h linux-rpi/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_core.h
---- linux-3.18.6/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_core.h 1970-01-01 01:00:00.000000000 +0100
-+++ linux-rpi/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_core.h 2015-02-09 04:40:08.000000000 +0100
-@@ -0,0 +1,711 @@
+diff -Nur linux-3.18.8/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_core.h linux-rpi/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_core.h
+--- linux-3.18.8/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_core.h 1970-01-01 01:00:00.000000000 +0100
++++ linux-rpi/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_core.h 2015-03-05 14:40:14.401715819 +0100
+@@ -0,0 +1,712 @@
+/**
+ * Copyright (c) 2010-2012 Broadcom. All rights reserved.
+ *
@@ -43288,6 +43269,7 @@ diff -Nur linux-3.18.6/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_core
+ int initialised;
+ VCHIQ_CONNSTATE_T conn_state;
+ int is_master;
++ short version_common;
+
+ VCHIQ_SHARED_STATE_T *local;
+ VCHIQ_SHARED_STATE_T *remote;
@@ -43595,9 +43577,9 @@ diff -Nur linux-3.18.6/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_core
+ size_t numBytes);
+
+#endif
-diff -Nur linux-3.18.6/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_debugfs.c linux-rpi/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_debugfs.c
---- linux-3.18.6/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_debugfs.c 1970-01-01 01:00:00.000000000 +0100
-+++ linux-rpi/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_debugfs.c 2015-02-09 04:40:08.000000000 +0100
+diff -Nur linux-3.18.8/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_debugfs.c linux-rpi/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_debugfs.c
+--- linux-3.18.8/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_debugfs.c 1970-01-01 01:00:00.000000000 +0100
++++ linux-rpi/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_debugfs.c 2015-03-05 14:40:14.401715819 +0100
@@ -0,0 +1,383 @@
+/**
+ * Copyright (c) 2014 Raspberry Pi (Trading) Ltd. All rights reserved.
@@ -43982,9 +43964,9 @@ diff -Nur linux-3.18.6/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_debu
+}
+
+#endif /* CONFIG_DEBUG_FS */
-diff -Nur linux-3.18.6/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_debugfs.h linux-rpi/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_debugfs.h
---- linux-3.18.6/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_debugfs.h 1970-01-01 01:00:00.000000000 +0100
-+++ linux-rpi/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_debugfs.h 2015-02-09 04:40:08.000000000 +0100
+diff -Nur linux-3.18.8/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_debugfs.h linux-rpi/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_debugfs.h
+--- linux-3.18.8/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_debugfs.h 1970-01-01 01:00:00.000000000 +0100
++++ linux-rpi/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_debugfs.h 2015-03-05 14:40:14.401715819 +0100
@@ -0,0 +1,52 @@
+/**
+ * Copyright (c) 2014 Raspberry Pi (Trading) Ltd. All rights reserved.
@@ -44038,9 +44020,9 @@ diff -Nur linux-3.18.6/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_debu
+void vchiq_debugfs_remove_instance(VCHIQ_INSTANCE_T instance);
+
+#endif /* VCHIQ_DEBUGFS_H */
-diff -Nur linux-3.18.6/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_genversion linux-rpi/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_genversion
---- linux-3.18.6/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_genversion 1970-01-01 01:00:00.000000000 +0100
-+++ linux-rpi/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_genversion 2015-02-09 04:40:08.000000000 +0100
+diff -Nur linux-3.18.8/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_genversion linux-rpi/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_genversion
+--- linux-3.18.8/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_genversion 1970-01-01 01:00:00.000000000 +0100
++++ linux-rpi/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_genversion 2015-03-05 14:40:14.401715819 +0100
@@ -0,0 +1,87 @@
+#!/usr/bin/perl -w
+
@@ -44129,9 +44111,9 @@ diff -Nur linux-3.18.6/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_genv
+ return vchiq_build_time;
+}
+EOF
-diff -Nur linux-3.18.6/drivers/misc/vc04_services/interface/vchiq_arm/vchiq.h linux-rpi/drivers/misc/vc04_services/interface/vchiq_arm/vchiq.h
---- linux-3.18.6/drivers/misc/vc04_services/interface/vchiq_arm/vchiq.h 1970-01-01 01:00:00.000000000 +0100
-+++ linux-rpi/drivers/misc/vc04_services/interface/vchiq_arm/vchiq.h 2015-02-09 04:40:07.000000000 +0100
+diff -Nur linux-3.18.8/drivers/misc/vc04_services/interface/vchiq_arm/vchiq.h linux-rpi/drivers/misc/vc04_services/interface/vchiq_arm/vchiq.h
+--- linux-3.18.8/drivers/misc/vc04_services/interface/vchiq_arm/vchiq.h 1970-01-01 01:00:00.000000000 +0100
++++ linux-rpi/drivers/misc/vc04_services/interface/vchiq_arm/vchiq.h 2015-03-05 14:40:14.401715819 +0100
@@ -0,0 +1,40 @@
+/**
+ * Copyright (c) 2010-2012 Broadcom. All rights reserved.
@@ -44173,9 +44155,9 @@ diff -Nur linux-3.18.6/drivers/misc/vc04_services/interface/vchiq_arm/vchiq.h li
+#include "vchiq_util.h"
+
+#endif
-diff -Nur linux-3.18.6/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_if.h linux-rpi/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_if.h
---- linux-3.18.6/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_if.h 1970-01-01 01:00:00.000000000 +0100
-+++ linux-rpi/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_if.h 2015-02-09 04:40:08.000000000 +0100
+diff -Nur linux-3.18.8/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_if.h linux-rpi/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_if.h
+--- linux-3.18.8/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_if.h 1970-01-01 01:00:00.000000000 +0100
++++ linux-rpi/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_if.h 2015-03-05 14:40:14.401715819 +0100
@@ -0,0 +1,189 @@
+/**
+ * Copyright (c) 2010-2012 Broadcom. All rights reserved.
@@ -44366,9 +44348,9 @@ diff -Nur linux-3.18.6/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_if.h
+ short *peer_version);
+
+#endif /* VCHIQ_IF_H */
-diff -Nur linux-3.18.6/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_ioctl.h linux-rpi/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_ioctl.h
---- linux-3.18.6/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_ioctl.h 1970-01-01 01:00:00.000000000 +0100
-+++ linux-rpi/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_ioctl.h 2015-02-09 04:40:08.000000000 +0100
+diff -Nur linux-3.18.8/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_ioctl.h linux-rpi/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_ioctl.h
+--- linux-3.18.8/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_ioctl.h 1970-01-01 01:00:00.000000000 +0100
++++ linux-rpi/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_ioctl.h 2015-03-05 14:40:14.405715819 +0100
@@ -0,0 +1,131 @@
+/**
+ * Copyright (c) 2010-2012 Broadcom. All rights reserved.
@@ -44501,9 +44483,9 @@ diff -Nur linux-3.18.6/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_ioct
+#define VCHIQ_IOC_MAX 17
+
+#endif
-diff -Nur linux-3.18.6/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_kern_lib.c linux-rpi/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_kern_lib.c
---- linux-3.18.6/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_kern_lib.c 1970-01-01 01:00:00.000000000 +0100
-+++ linux-rpi/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_kern_lib.c 2015-02-09 04:40:08.000000000 +0100
+diff -Nur linux-3.18.8/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_kern_lib.c linux-rpi/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_kern_lib.c
+--- linux-3.18.8/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_kern_lib.c 1970-01-01 01:00:00.000000000 +0100
++++ linux-rpi/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_kern_lib.c 2015-03-05 14:40:14.405715819 +0100
@@ -0,0 +1,458 @@
+/**
+ * Copyright (c) 2010-2012 Broadcom. All rights reserved.
@@ -44963,9 +44945,9 @@ diff -Nur linux-3.18.6/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_kern
+
+ return status;
+}
-diff -Nur linux-3.18.6/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_killable.h linux-rpi/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_killable.h
---- linux-3.18.6/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_killable.h 1970-01-01 01:00:00.000000000 +0100
-+++ linux-rpi/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_killable.h 2015-02-09 04:40:08.000000000 +0100
+diff -Nur linux-3.18.8/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_killable.h linux-rpi/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_killable.h
+--- linux-3.18.8/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_killable.h 1970-01-01 01:00:00.000000000 +0100
++++ linux-rpi/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_killable.h 2015-03-05 14:40:14.405715819 +0100
@@ -0,0 +1,69 @@
+/**
+ * Copyright (c) 2010-2012 Broadcom. All rights reserved.
@@ -45036,9 +45018,9 @@ diff -Nur linux-3.18.6/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_kill
+#define mutex_lock_interruptible mutex_lock_interruptible_killable
+
+#endif
-diff -Nur linux-3.18.6/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_memdrv.h linux-rpi/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_memdrv.h
---- linux-3.18.6/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_memdrv.h 1970-01-01 01:00:00.000000000 +0100
-+++ linux-rpi/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_memdrv.h 2015-02-09 04:40:08.000000000 +0100
+diff -Nur linux-3.18.8/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_memdrv.h linux-rpi/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_memdrv.h
+--- linux-3.18.8/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_memdrv.h 1970-01-01 01:00:00.000000000 +0100
++++ linux-rpi/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_memdrv.h 2015-03-05 14:40:14.405715819 +0100
@@ -0,0 +1,71 @@
+/**
+ * Copyright (c) 2010-2012 Broadcom. All rights reserved.
@@ -45111,9 +45093,9 @@ diff -Nur linux-3.18.6/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_memd
+ const VCHIQ_PLATFORM_DATA_T * platform_data);
+
+#endif
-diff -Nur linux-3.18.6/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_pagelist.h linux-rpi/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_pagelist.h
---- linux-3.18.6/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_pagelist.h 1970-01-01 01:00:00.000000000 +0100
-+++ linux-rpi/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_pagelist.h 2015-02-09 04:40:08.000000000 +0100
+diff -Nur linux-3.18.8/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_pagelist.h linux-rpi/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_pagelist.h
+--- linux-3.18.8/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_pagelist.h 1970-01-01 01:00:00.000000000 +0100
++++ linux-rpi/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_pagelist.h 2015-03-05 14:40:14.405715819 +0100
@@ -0,0 +1,58 @@
+/**
+ * Copyright (c) 2010-2012 Broadcom. All rights reserved.
@@ -45173,10 +45155,10 @@ diff -Nur linux-3.18.6/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_page
+} FRAGMENTS_T;
+
+#endif /* VCHIQ_PAGELIST_H */
-diff -Nur linux-3.18.6/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_shim.c linux-rpi/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_shim.c
---- linux-3.18.6/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_shim.c 1970-01-01 01:00:00.000000000 +0100
-+++ linux-rpi/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_shim.c 2015-02-09 04:40:08.000000000 +0100
-@@ -0,0 +1,857 @@
+diff -Nur linux-3.18.8/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_shim.c linux-rpi/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_shim.c
+--- linux-3.18.8/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_shim.c 1970-01-01 01:00:00.000000000 +0100
++++ linux-rpi/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_shim.c 2015-03-05 14:40:14.405715819 +0100
+@@ -0,0 +1,860 @@
+/**
+ * Copyright (c) 2010-2012 Broadcom. All rights reserved.
+ *
@@ -45917,6 +45899,9 @@ diff -Nur linux-3.18.6/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_shim
+ case VCHI_SERVICE_OPTION_TRACE:
+ vchiq_option = VCHIQ_SERVICE_OPTION_TRACE;
+ break;
++ case VCHI_SERVICE_OPTION_SYNCHRONOUS:
++ vchiq_option = VCHIQ_SERVICE_OPTION_SYNCHRONOUS;
++ break;
+ default:
+ service = NULL;
+ break;
@@ -46034,9 +46019,9 @@ diff -Nur linux-3.18.6/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_shim
+ return ret;
+}
+EXPORT_SYMBOL(vchi_service_release);
-diff -Nur linux-3.18.6/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_util.c linux-rpi/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_util.c
---- linux-3.18.6/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_util.c 1970-01-01 01:00:00.000000000 +0100
-+++ linux-rpi/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_util.c 2015-02-09 04:40:08.000000000 +0100
+diff -Nur linux-3.18.8/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_util.c linux-rpi/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_util.c
+--- linux-3.18.8/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_util.c 1970-01-01 01:00:00.000000000 +0100
++++ linux-rpi/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_util.c 2015-03-05 14:40:14.405715819 +0100
@@ -0,0 +1,152 @@
+/**
+ * Copyright (c) 2010-2012 Broadcom. All rights reserved.
@@ -46190,9 +46175,9 @@ diff -Nur linux-3.18.6/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_util
+
+ return header;
+}
-diff -Nur linux-3.18.6/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_util.h linux-rpi/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_util.h
---- linux-3.18.6/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_util.h 1970-01-01 01:00:00.000000000 +0100
-+++ linux-rpi/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_util.h 2015-02-09 04:40:08.000000000 +0100
+diff -Nur linux-3.18.8/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_util.h linux-rpi/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_util.h
+--- linux-3.18.8/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_util.h 1970-01-01 01:00:00.000000000 +0100
++++ linux-rpi/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_util.h 2015-03-05 14:40:14.405715819 +0100
@@ -0,0 +1,81 @@
+/**
+ * Copyright (c) 2010-2012 Broadcom. All rights reserved.
@@ -46275,9 +46260,9 @@ diff -Nur linux-3.18.6/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_util
+extern VCHIQ_HEADER_T *vchiu_queue_pop(VCHIU_QUEUE_T *queue);
+
+#endif
-diff -Nur linux-3.18.6/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_version.c linux-rpi/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_version.c
---- linux-3.18.6/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_version.c 1970-01-01 01:00:00.000000000 +0100
-+++ linux-rpi/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_version.c 2015-02-09 04:40:08.000000000 +0100
+diff -Nur linux-3.18.8/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_version.c linux-rpi/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_version.c
+--- linux-3.18.8/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_version.c 1970-01-01 01:00:00.000000000 +0100
++++ linux-rpi/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_version.c 2015-03-05 14:40:14.405715819 +0100
@@ -0,0 +1,59 @@
+/**
+ * Copyright (c) 2010-2012 Broadcom. All rights reserved.
@@ -46338,9 +46323,9 @@ diff -Nur linux-3.18.6/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_vers
+{
+ return vchiq_build_time;
+}
-diff -Nur linux-3.18.6/drivers/misc/vc04_services/Kconfig linux-rpi/drivers/misc/vc04_services/Kconfig
---- linux-3.18.6/drivers/misc/vc04_services/Kconfig 1970-01-01 01:00:00.000000000 +0100
-+++ linux-rpi/drivers/misc/vc04_services/Kconfig 2015-02-09 04:40:07.000000000 +0100
+diff -Nur linux-3.18.8/drivers/misc/vc04_services/Kconfig linux-rpi/drivers/misc/vc04_services/Kconfig
+--- linux-3.18.8/drivers/misc/vc04_services/Kconfig 1970-01-01 01:00:00.000000000 +0100
++++ linux-rpi/drivers/misc/vc04_services/Kconfig 2015-03-05 14:40:14.401715819 +0100
@@ -0,0 +1,9 @@
+config BCM2708_VCHIQ
+ tristate "Videocore VCHIQ"
@@ -46351,9 +46336,9 @@ diff -Nur linux-3.18.6/drivers/misc/vc04_services/Kconfig linux-rpi/drivers/misc
+ BCM2708 family of products.
+ Defaults to Y when the Broadcom Videocore services
+ are included in the build, N otherwise.
-diff -Nur linux-3.18.6/drivers/misc/vc04_services/Makefile linux-rpi/drivers/misc/vc04_services/Makefile
---- linux-3.18.6/drivers/misc/vc04_services/Makefile 1970-01-01 01:00:00.000000000 +0100
-+++ linux-rpi/drivers/misc/vc04_services/Makefile 2015-02-09 04:40:07.000000000 +0100
+diff -Nur linux-3.18.8/drivers/misc/vc04_services/Makefile linux-rpi/drivers/misc/vc04_services/Makefile
+--- linux-3.18.8/drivers/misc/vc04_services/Makefile 1970-01-01 01:00:00.000000000 +0100
++++ linux-rpi/drivers/misc/vc04_services/Makefile 2015-03-05 14:40:14.401715819 +0100
@@ -0,0 +1,14 @@
+obj-$(CONFIG_BCM2708_VCHIQ) += vchiq.o
+
@@ -46369,9 +46354,9 @@ diff -Nur linux-3.18.6/drivers/misc/vc04_services/Makefile linux-rpi/drivers/mis
+
+ccflags-y += -DVCOS_VERIFY_BKPTS=1 -Idrivers/misc/vc04_services -DUSE_VCHIQ_ARM -D__VCCOREVER__=0x04000000
+
-diff -Nur linux-3.18.6/drivers/mmc/core/quirks.c linux-rpi/drivers/mmc/core/quirks.c
---- linux-3.18.6/drivers/mmc/core/quirks.c 2015-02-06 15:53:48.000000000 +0100
-+++ linux-rpi/drivers/mmc/core/quirks.c 2015-02-09 04:40:08.000000000 +0100
+diff -Nur linux-3.18.8/drivers/mmc/core/quirks.c linux-rpi/drivers/mmc/core/quirks.c
+--- linux-3.18.8/drivers/mmc/core/quirks.c 2015-02-27 02:49:36.000000000 +0100
++++ linux-rpi/drivers/mmc/core/quirks.c 2015-03-05 14:40:14.409715819 +0100
@@ -95,5 +95,9 @@
f->vendor_fixup(card, f->data);
}
@@ -46382,9 +46367,9 @@ diff -Nur linux-3.18.6/drivers/mmc/core/quirks.c linux-rpi/drivers/mmc/core/quir
+ card->quirks |= MMC_QUIRK_BLK_NO_CMD23;
}
EXPORT_SYMBOL(mmc_fixup_device);
-diff -Nur linux-3.18.6/drivers/mmc/host/bcm2835-mmc.c linux-rpi/drivers/mmc/host/bcm2835-mmc.c
---- linux-3.18.6/drivers/mmc/host/bcm2835-mmc.c 1970-01-01 01:00:00.000000000 +0100
-+++ linux-rpi/drivers/mmc/host/bcm2835-mmc.c 2015-02-09 04:40:09.000000000 +0100
+diff -Nur linux-3.18.8/drivers/mmc/host/bcm2835-mmc.c linux-rpi/drivers/mmc/host/bcm2835-mmc.c
+--- linux-3.18.8/drivers/mmc/host/bcm2835-mmc.c 1970-01-01 01:00:00.000000000 +0100
++++ linux-rpi/drivers/mmc/host/bcm2835-mmc.c 2015-03-05 14:40:14.409715819 +0100
@@ -0,0 +1,1557 @@
+/*
+ * BCM2835 MMC host driver.
@@ -47943,9 +47928,9 @@ diff -Nur linux-3.18.6/drivers/mmc/host/bcm2835-mmc.c linux-rpi/drivers/mmc/host
+MODULE_DESCRIPTION("BCM2835 SDHCI driver");
+MODULE_LICENSE("GPL v2");
+MODULE_AUTHOR("Gellert Weisz");
-diff -Nur linux-3.18.6/drivers/mmc/host/Kconfig linux-rpi/drivers/mmc/host/Kconfig
---- linux-3.18.6/drivers/mmc/host/Kconfig 2015-02-06 15:53:48.000000000 +0100
-+++ linux-rpi/drivers/mmc/host/Kconfig 2015-02-09 04:40:08.000000000 +0100
+diff -Nur linux-3.18.8/drivers/mmc/host/Kconfig linux-rpi/drivers/mmc/host/Kconfig
+--- linux-3.18.8/drivers/mmc/host/Kconfig 2015-02-27 02:49:36.000000000 +0100
++++ linux-rpi/drivers/mmc/host/Kconfig 2015-03-05 14:40:14.409715819 +0100
@@ -281,17 +281,6 @@
If you have a controller with this interface, say Y or M here.
@@ -48000,9 +47985,9 @@ diff -Nur linux-3.18.6/drivers/mmc/host/Kconfig linux-rpi/drivers/mmc/host/Kconf
config MMC_OMAP
tristate "TI OMAP Multimedia Card Interface support"
depends on ARCH_OMAP
-diff -Nur linux-3.18.6/drivers/mmc/host/Makefile linux-rpi/drivers/mmc/host/Makefile
---- linux-3.18.6/drivers/mmc/host/Makefile 2015-02-06 15:53:48.000000000 +0100
-+++ linux-rpi/drivers/mmc/host/Makefile 2015-02-09 04:40:08.000000000 +0100
+diff -Nur linux-3.18.8/drivers/mmc/host/Makefile linux-rpi/drivers/mmc/host/Makefile
+--- linux-3.18.8/drivers/mmc/host/Makefile 2015-02-27 02:49:36.000000000 +0100
++++ linux-rpi/drivers/mmc/host/Makefile 2015-03-05 14:40:14.409715819 +0100
@@ -17,6 +17,7 @@
obj-$(CONFIG_MMC_SDHCI_S3C) += sdhci-s3c.o
obj-$(CONFIG_MMC_SDHCI_SIRF) += sdhci-sirf.o
@@ -48011,9 +47996,34 @@ diff -Nur linux-3.18.6/drivers/mmc/host/Makefile linux-rpi/drivers/mmc/host/Make
obj-$(CONFIG_MMC_WBSD) += wbsd.o
obj-$(CONFIG_MMC_AU1X) += au1xmmc.o
obj-$(CONFIG_MMC_OMAP) += omap.o
-diff -Nur linux-3.18.6/drivers/net/usb/smsc95xx.c linux-rpi/drivers/net/usb/smsc95xx.c
---- linux-3.18.6/drivers/net/usb/smsc95xx.c 2015-02-06 15:53:48.000000000 +0100
-+++ linux-rpi/drivers/net/usb/smsc95xx.c 2015-02-09 04:40:14.000000000 +0100
+diff -Nur linux-3.18.8/drivers/net/ethernet/microchip/enc28j60.c linux-rpi/drivers/net/ethernet/microchip/enc28j60.c
+--- linux-3.18.8/drivers/net/ethernet/microchip/enc28j60.c 2015-02-27 02:49:36.000000000 +0100
++++ linux-rpi/drivers/net/ethernet/microchip/enc28j60.c 2015-03-05 14:40:14.717715817 +0100
+@@ -1630,10 +1630,21 @@
+ return 0;
+ }
+
++#ifdef CONFIG_OF
++static const struct of_device_id enc28j60_of_match[] = {
++ { .compatible = "microchip,enc28j60", },
++ { /* sentinel */ }
++};
++MODULE_DEVICE_TABLE(of, enc28j60_of_match);
++#endif
++
+ static struct spi_driver enc28j60_driver = {
+ .driver = {
+ .name = DRV_NAME,
+ .owner = THIS_MODULE,
++#ifdef CONFIG_OF
++ .of_match_table = enc28j60_of_match,
++#endif
+ },
+ .probe = enc28j60_probe,
+ .remove = enc28j60_remove,
+diff -Nur linux-3.18.8/drivers/net/usb/smsc95xx.c linux-rpi/drivers/net/usb/smsc95xx.c
+--- linux-3.18.8/drivers/net/usb/smsc95xx.c 2015-02-27 02:49:36.000000000 +0100
++++ linux-rpi/drivers/net/usb/smsc95xx.c 2015-03-05 14:40:14.813715817 +0100
@@ -59,6 +59,7 @@
#define SUSPEND_SUSPEND3 (0x08)
#define SUSPEND_ALLMODES (SUSPEND_SUSPEND0 | SUSPEND_SUSPEND1 | \
@@ -48093,9 +48103,9 @@ diff -Nur linux-3.18.6/drivers/net/usb/smsc95xx.c linux-rpi/drivers/net/usb/smsc
/* try reading mac address from EEPROM */
if (smsc95xx_read_eeprom(dev, EEPROM_MAC_OFFSET, ETH_ALEN,
dev->net->dev_addr) == 0) {
-diff -Nur linux-3.18.6/drivers/of/fdt.c linux-rpi/drivers/of/fdt.c
---- linux-3.18.6/drivers/of/fdt.c 2015-02-06 15:53:48.000000000 +0100
-+++ linux-rpi/drivers/of/fdt.c 2015-02-09 04:40:15.000000000 +0100
+diff -Nur linux-3.18.8/drivers/of/fdt.c linux-rpi/drivers/of/fdt.c
+--- linux-3.18.8/drivers/of/fdt.c 2015-02-27 02:49:36.000000000 +0100
++++ linux-rpi/drivers/of/fdt.c 2015-03-05 14:40:15.653715812 +0100
@@ -901,19 +901,38 @@
/* Retrieve command line */
@@ -48154,10 +48164,43 @@ diff -Nur linux-3.18.6/drivers/of/fdt.c linux-rpi/drivers/of/fdt.c
if (!d)
return -ENOENT;
-diff -Nur linux-3.18.6/drivers/pinctrl/pinctrl-bcm2835.c linux-rpi/drivers/pinctrl/pinctrl-bcm2835.c
---- linux-3.18.6/drivers/pinctrl/pinctrl-bcm2835.c 2015-02-06 15:53:48.000000000 +0100
-+++ linux-rpi/drivers/pinctrl/pinctrl-bcm2835.c 2015-02-09 04:40:16.000000000 +0100
-@@ -355,7 +355,14 @@
+diff -Nur linux-3.18.8/drivers/pinctrl/pinctrl-bcm2835.c linux-rpi/drivers/pinctrl/pinctrl-bcm2835.c
+--- linux-3.18.8/drivers/pinctrl/pinctrl-bcm2835.c 2015-02-27 02:49:36.000000000 +0100
++++ linux-rpi/drivers/pinctrl/pinctrl-bcm2835.c 2015-03-05 14:40:15.737715811 +0100
+@@ -47,6 +47,7 @@
+ #define MODULE_NAME "pinctrl-bcm2835"
+ #define BCM2835_NUM_GPIOS 54
+ #define BCM2835_NUM_BANKS 2
++#define BCM2835_NUM_IRQS 3
+
+ #define BCM2835_PIN_BITMAP_SZ \
+ DIV_ROUND_UP(BCM2835_NUM_GPIOS, sizeof(unsigned long) * 8)
+@@ -88,13 +89,13 @@
+
+ struct bcm2835_gpio_irqdata {
+ struct bcm2835_pinctrl *pc;
+- int bank;
++ int irqgroup;
+ };
+
+ struct bcm2835_pinctrl {
+ struct device *dev;
+ void __iomem *base;
+- int irq[BCM2835_NUM_BANKS];
++ int irq[BCM2835_NUM_IRQS];
+
+ /* note: locking assumes each bank will have its own unsigned long */
+ unsigned long enabled_irq_map[BCM2835_NUM_BANKS];
+@@ -105,7 +106,7 @@
+ struct gpio_chip gpio_chip;
+ struct pinctrl_gpio_range gpio_range;
+
+- struct bcm2835_gpio_irqdata irq_data[BCM2835_NUM_BANKS];
++ struct bcm2835_gpio_irqdata irq_data[BCM2835_NUM_IRQS];
+ spinlock_t irq_lock[BCM2835_NUM_BANKS];
+ };
+
+@@ -355,7 +356,14 @@
static int bcm2835_gpio_direction_output(struct gpio_chip *chip,
unsigned offset, int value)
{
@@ -48173,7 +48216,7 @@ diff -Nur linux-3.18.6/drivers/pinctrl/pinctrl-bcm2835.c linux-rpi/drivers/pinct
}
static void bcm2835_gpio_set(struct gpio_chip *chip, unsigned offset, int value)
-@@ -382,7 +389,7 @@
+@@ -382,22 +390,21 @@
.get = bcm2835_gpio_get,
.set = bcm2835_gpio_set,
.to_irq = bcm2835_gpio_to_irq,
@@ -48182,9 +48225,88 @@ diff -Nur linux-3.18.6/drivers/pinctrl/pinctrl-bcm2835.c linux-rpi/drivers/pinct
.ngpio = BCM2835_NUM_GPIOS,
.can_sleep = false,
};
-diff -Nur linux-3.18.6/drivers/rtc/rtc-ds1307.c linux-rpi/drivers/rtc/rtc-ds1307.c
---- linux-3.18.6/drivers/rtc/rtc-ds1307.c 2015-02-06 15:53:48.000000000 +0100
-+++ linux-rpi/drivers/rtc/rtc-ds1307.c 2015-02-09 04:40:16.000000000 +0100
+
+-static irqreturn_t bcm2835_gpio_irq_handler(int irq, void *dev_id)
++static int bcm2835_gpio_irq_handle_bank(struct bcm2835_pinctrl *pc,
++ unsigned int bank, u32 mask)
+ {
+- struct bcm2835_gpio_irqdata *irqdata = dev_id;
+- struct bcm2835_pinctrl *pc = irqdata->pc;
+- int bank = irqdata->bank;
+ unsigned long events;
+ unsigned offset;
+ unsigned gpio;
+ unsigned int type;
+
+ events = bcm2835_gpio_rd(pc, GPEDS0 + bank * 4);
++ events &= mask;
+ events &= pc->enabled_irq_map[bank];
+ for_each_set_bit(offset, &events, 32) {
+ gpio = (32 * bank) + offset;
+@@ -413,7 +420,30 @@
+ if (type & IRQ_TYPE_LEVEL_MASK)
+ bcm2835_gpio_set_bit(pc, GPEDS0, gpio);
+ }
+- return events ? IRQ_HANDLED : IRQ_NONE;
++
++ return (events != 0);
++}
++
++static irqreturn_t bcm2835_gpio_irq_handler(int irq, void *dev_id)
++{
++ struct bcm2835_gpio_irqdata *irqdata = dev_id;
++ struct bcm2835_pinctrl *pc = irqdata->pc;
++ int handled = 0;
++
++ switch (irqdata->irqgroup) {
++ case 0: /* IRQ0 covers GPIOs 0-27 */
++ handled = bcm2835_gpio_irq_handle_bank(pc, 0, 0x0fffffff);
++ break;
++ case 1: /* IRQ1 covers GPIOs 28-45 */
++ handled = bcm2835_gpio_irq_handle_bank(pc, 0, 0xf0000000) |
++ bcm2835_gpio_irq_handle_bank(pc, 1, 0x00003fff);
++ break;
++ case 2: /* IRQ2 covers GPIOs 46-53 */
++ handled = bcm2835_gpio_irq_handle_bank(pc, 1, 0x003fc000);
++ break;
++ }
++
++ return handled ? IRQ_HANDLED : IRQ_NONE;
+ }
+
+ static inline void __bcm2835_gpio_irq_config(struct bcm2835_pinctrl *pc,
+@@ -985,8 +1015,6 @@
+ for (i = 0; i < BCM2835_NUM_BANKS; i++) {
+ unsigned long events;
+ unsigned offset;
+- int len;
+- char *name;
+
+ /* clear event detection flags */
+ bcm2835_gpio_wr(pc, GPREN0 + i * 4, 0);
+@@ -1001,10 +1029,17 @@
+ for_each_set_bit(offset, &events, 32)
+ bcm2835_gpio_wr(pc, GPEDS0 + i * 4, BIT(offset));
+
++ spin_lock_init(&pc->irq_lock[i]);
++ }
++
++ for (i = 0; i < BCM2835_NUM_IRQS; i++) {
++ int len;
++ char *name;
+ pc->irq[i] = irq_of_parse_and_map(np, i);
++ if (pc->irq[i] == 0)
++ break;
+ pc->irq_data[i].pc = pc;
+- pc->irq_data[i].bank = i;
+- spin_lock_init(&pc->irq_lock[i]);
++ pc->irq_data[i].irqgroup = i;
+
+ len = strlen(dev_name(pc->dev)) + 16;
+ name = devm_kzalloc(pc->dev, len, GFP_KERNEL);
+diff -Nur linux-3.18.8/drivers/rtc/rtc-ds1307.c linux-rpi/drivers/rtc/rtc-ds1307.c
+--- linux-3.18.8/drivers/rtc/rtc-ds1307.c 2015-02-27 02:49:36.000000000 +0100
++++ linux-rpi/drivers/rtc/rtc-ds1307.c 2015-03-05 14:40:15.957715810 +0100
@@ -1241,6 +1241,14 @@
return 0;
}
@@ -48200,9 +48322,9 @@ diff -Nur linux-3.18.6/drivers/rtc/rtc-ds1307.c linux-rpi/drivers/rtc/rtc-ds1307
static struct i2c_driver ds1307_driver = {
.driver = {
.name = "rtc-ds1307",
-diff -Nur linux-3.18.6/drivers/spi/Kconfig linux-rpi/drivers/spi/Kconfig
---- linux-3.18.6/drivers/spi/Kconfig 2015-02-06 15:53:48.000000000 +0100
-+++ linux-rpi/drivers/spi/Kconfig 2015-02-09 04:40:23.000000000 +0100
+diff -Nur linux-3.18.8/drivers/spi/Kconfig linux-rpi/drivers/spi/Kconfig
+--- linux-3.18.8/drivers/spi/Kconfig 2015-02-27 02:49:36.000000000 +0100
++++ linux-rpi/drivers/spi/Kconfig 2015-03-05 14:40:16.297715808 +0100
@@ -77,7 +77,7 @@
config SPI_BCM2835
@@ -48227,9 +48349,9 @@ diff -Nur linux-3.18.6/drivers/spi/Kconfig linux-rpi/drivers/spi/Kconfig
config SPI_BFIN5XX
tristate "SPI controller driver for ADI Blackfin5xx"
depends on BLACKFIN && !BF60x
-diff -Nur linux-3.18.6/drivers/spi/Makefile linux-rpi/drivers/spi/Makefile
---- linux-3.18.6/drivers/spi/Makefile 2015-02-06 15:53:48.000000000 +0100
-+++ linux-rpi/drivers/spi/Makefile 2015-02-09 04:40:23.000000000 +0100
+diff -Nur linux-3.18.8/drivers/spi/Makefile linux-rpi/drivers/spi/Makefile
+--- linux-3.18.8/drivers/spi/Makefile 2015-02-27 02:49:36.000000000 +0100
++++ linux-rpi/drivers/spi/Makefile 2015-03-05 14:40:16.297715808 +0100
@@ -20,6 +20,7 @@
obj-$(CONFIG_SPI_BCM63XX_HSSPI) += spi-bcm63xx-hsspi.o
obj-$(CONFIG_SPI_BFIN5XX) += spi-bfin5xx.o
@@ -48238,9 +48360,9 @@ diff -Nur linux-3.18.6/drivers/spi/Makefile linux-rpi/drivers/spi/Makefile
obj-$(CONFIG_SPI_BFIN_SPORT) += spi-bfin-sport.o
obj-$(CONFIG_SPI_BITBANG) += spi-bitbang.o
obj-$(CONFIG_SPI_BUTTERFLY) += spi-butterfly.o
-diff -Nur linux-3.18.6/drivers/spi/spi-bcm2708.c linux-rpi/drivers/spi/spi-bcm2708.c
---- linux-3.18.6/drivers/spi/spi-bcm2708.c 1970-01-01 01:00:00.000000000 +0100
-+++ linux-rpi/drivers/spi/spi-bcm2708.c 2015-02-09 04:40:23.000000000 +0100
+diff -Nur linux-3.18.8/drivers/spi/spi-bcm2708.c linux-rpi/drivers/spi/spi-bcm2708.c
+--- linux-3.18.8/drivers/spi/spi-bcm2708.c 1970-01-01 01:00:00.000000000 +0100
++++ linux-rpi/drivers/spi/spi-bcm2708.c 2015-03-05 14:40:16.297715808 +0100
@@ -0,0 +1,635 @@
+/*
+ * Driver for Broadcom BCM2708 SPI Controllers
@@ -48877,9 +48999,10476 @@ diff -Nur linux-3.18.6/drivers/spi/spi-bcm2708.c linux-rpi/drivers/spi/spi-bcm27
+MODULE_AUTHOR("Chris Boot <bootc@bootc.net>");
+MODULE_LICENSE("GPL v2");
+MODULE_ALIAS("platform:" DRV_NAME);
-diff -Nur linux-3.18.6/drivers/staging/media/lirc/Kconfig linux-rpi/drivers/staging/media/lirc/Kconfig
---- linux-3.18.6/drivers/staging/media/lirc/Kconfig 2015-02-06 15:53:48.000000000 +0100
-+++ linux-rpi/drivers/staging/media/lirc/Kconfig 2015-02-09 04:40:25.000000000 +0100
+diff -Nur linux-3.18.8/drivers/staging/fbtft/fb_agm1264k-fl.c linux-rpi/drivers/staging/fbtft/fb_agm1264k-fl.c
+--- linux-3.18.8/drivers/staging/fbtft/fb_agm1264k-fl.c 1970-01-01 01:00:00.000000000 +0100
++++ linux-rpi/drivers/staging/fbtft/fb_agm1264k-fl.c 2015-03-05 14:40:16.341715808 +0100
+@@ -0,0 +1,462 @@
++/*
++ * FB driver for Two KS0108 LCD controllers in AGM1264K-FL display
++ *
++ * Copyright (C) 2014 ololoshka2871
++ *
++ * This program is free software; you can redistribute it and/or modify
++ * it under the terms of the GNU General Public License as published by
++ * the Free Software Foundation; either version 2 of the License, or
++ * (at your option) any later version.
++ *
++ * This program is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
++ * GNU General Public License for more details.
++ */
++
++#include <linux/module.h>
++#include <linux/kernel.h>
++#include <linux/init.h>
++#include <linux/gpio.h>
++#include <linux/delay.h>
++#include <linux/slab.h>
++
++#include "fbtft.h"
++
++/* Uncomment text line to use negative image on display */
++/*#define NEGATIVE*/
++
++#define WHITE 0xff
++#define BLACK 0
++
++#define DRVNAME "fb_agm1264k-fl"
++#define WIDTH 64
++#define HEIGHT 64
++#define TOTALWIDTH (WIDTH * 2) /* because 2 x ks0108 in one display */
++#define FPS 20
++
++#define EPIN gpio.wr
++#define RS gpio.dc
++#define RW gpio.aux[2]
++#define CS0 gpio.aux[0]
++#define CS1 gpio.aux[1]
++
++
++/* diffusing error (“Floyd-Steinberg”) */
++#define DIFFUSING_MATRIX_WIDTH 2
++#define DIFFUSING_MATRIX_HEIGHT 2
++
++static const signed char
++diffusing_matrix[DIFFUSING_MATRIX_WIDTH][DIFFUSING_MATRIX_HEIGHT] = {
++ {-1, 3},
++ {3, 2},
++};
++
++static const unsigned char gamma_correction_table[] = {
++0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1,
++1, 1, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, 5, 6,
++6, 6, 6, 7, 7, 7, 8, 8, 8, 9, 9, 9, 10, 10, 11, 11, 11, 12, 12, 13,
++13, 13, 14, 14, 15, 15, 16, 16, 17, 17, 18, 18, 19, 19, 20, 20, 21,
++22, 22, 23, 23, 24, 25, 25, 26, 26, 27, 28, 28, 29, 30, 30, 31, 32,
++33, 33, 34, 35, 35, 36, 37, 38, 39, 39, 40, 41, 42, 43, 43, 44, 45,
++46, 47, 48, 49, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61,
++62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 73, 74, 75, 76, 77, 78, 79, 81,
++82, 83, 84, 85, 87, 88, 89, 90, 91, 93, 94, 95, 97, 98, 99, 100, 102,
++103, 105, 106, 107, 109, 110, 111, 113, 114, 116, 117, 119, 120, 121,
++123, 124, 126, 127, 129, 130, 132, 133, 135, 137, 138, 140, 141, 143,
++145, 146, 148, 149, 151, 153, 154, 156, 158, 159, 161, 163, 165, 166,
++168, 170, 172, 173, 175, 177, 179, 181, 182, 184, 186, 188, 190, 192,
++194, 196, 197, 199, 201, 203, 205, 207, 209, 211, 213, 215, 217, 219,
++221, 223, 225, 227, 229, 231, 234, 236, 238, 240, 242, 244, 246, 248,
++251, 253, 255
++};
++
++static int init_display(struct fbtft_par *par)
++{
++ u8 i;
++
++ fbtft_par_dbg(DEBUG_INIT_DISPLAY, par, "%s()\n", __func__);
++
++ par->fbtftops.reset(par);
++
++ for (i = 0; i < 2; ++i) {
++ write_reg(par, i, 0x3f); /* display on */
++ write_reg(par, i, 0x40); /* set x to 0 */
++ write_reg(par, i, 0xb0); /* set page to 0 */
++ write_reg(par, i, 0xc0); /* set start line to 0 */
++ }
++
++ return 0;
++}
++
++static void reset(struct fbtft_par *par)
++{
++ if (par->gpio.reset == -1)
++ return;
++
++ fbtft_dev_dbg(DEBUG_RESET, par, par->info->device, "%s()\n", __func__);
++
++ gpio_set_value(par->gpio.reset, 0);
++ udelay(20);
++ gpio_set_value(par->gpio.reset, 1);
++ mdelay(120);
++}
++
++/* Check if all necessary GPIOS defined */
++static int verify_gpios(struct fbtft_par *par)
++{
++ int i;
++
++ fbtft_dev_dbg(DEBUG_VERIFY_GPIOS, par, par->info->device,
++ "%s()\n", __func__);
++
++ if (par->EPIN < 0) {
++ dev_err(par->info->device,
++ "Missing info about 'wr' (aka E) gpio. Aborting.\n");
++ return -EINVAL;
++ }
++ for (i = 0; i < 8; ++i) {
++ if (par->gpio.db[i] < 0) {
++ dev_err(par->info->device,
++ "Missing info about 'db[%i]' gpio. Aborting.\n",
++ i);
++ return -EINVAL;
++ }
++ }
++ if (par->CS0 < 0) {
++ dev_err(par->info->device,
++ "Missing info about 'cs0' gpio. Aborting.\n");
++ return -EINVAL;
++ }
++ if (par->CS1 < 0) {
++ dev_err(par->info->device,
++ "Missing info about 'cs1' gpio. Aborting.\n");
++ return -EINVAL;
++ }
++ if (par->RW < 0) {
++ dev_err(par->info->device,
++ "Missing info about 'rw' gpio. Aborting.\n");
++ return -EINVAL;
++ }
++
++ return 0;
++}
++
++static unsigned long
++request_gpios_match(struct fbtft_par *par, const struct fbtft_gpio *gpio)
++{
++ fbtft_dev_dbg(DEBUG_REQUEST_GPIOS_MATCH, par, par->info->device,
++ "%s('%s')\n", __func__, gpio->name);
++
++ if (strcasecmp(gpio->name, "wr") == 0) {
++ /* left ks0108 E pin */
++ par->EPIN = gpio->gpio;
++ return GPIOF_OUT_INIT_LOW;
++ } else if (strcasecmp(gpio->name, "cs0") == 0) {
++ /* left ks0108 controller pin */
++ par->CS0 = gpio->gpio;
++ return GPIOF_OUT_INIT_HIGH;
++ } else if (strcasecmp(gpio->name, "cs1") == 0) {
++ /* right ks0108 controller pin */
++ par->CS1 = gpio->gpio;
++ return GPIOF_OUT_INIT_HIGH;
++ }
++
++ /* if write (rw = 0) e(1->0) perform write */
++ /* if read (rw = 1) e(0->1) set data on D0-7*/
++ else if (strcasecmp(gpio->name, "rw") == 0) {
++ par->RW = gpio->gpio;
++ return GPIOF_OUT_INIT_LOW;
++ }
++
++ return FBTFT_GPIO_NO_MATCH;
++}
++
++/* This function oses to enter commands
++ * first byte - destination controller 0 or 1
++ * folowing - commands
++ */
++static void write_reg8_bus8(struct fbtft_par *par, int len, ...)
++{
++ va_list args;
++ int i, ret;
++ u8 *buf = (u8 *)par->buf;
++
++ if (unlikely(par->debug & DEBUG_WRITE_REGISTER)) {
++ va_start(args, len);
++ for (i = 0; i < len; i++)
++ buf[i] = (u8)va_arg(args, unsigned int);
++
++ va_end(args);
++ fbtft_par_dbg_hex(DEBUG_WRITE_REGISTER, par,
++ par->info->device, u8, buf, len, "%s: ", __func__);
++ }
++
++ va_start(args, len);
++
++ *buf = (u8)va_arg(args, unsigned int);
++
++ if (*buf > 1) {
++ va_end(args);
++ dev_err(par->info->device, "%s: Incorrect chip sellect request (%d)\n",
++ __func__, *buf);
++ return;
++ }
++
++ /* select chip */
++ if (*buf) {
++ /* cs1 */
++ gpio_set_value(par->CS0, 1);
++ gpio_set_value(par->CS1, 0);
++ } else {
++ /* cs0 */
++ gpio_set_value(par->CS0, 0);
++ gpio_set_value(par->CS1, 1);
++ }
++
++ gpio_set_value(par->RS, 0); /* RS->0 (command mode) */
++ len--;
++
++ if (len) {
++ i = len;
++ while (i--)
++ *buf++ = (u8)va_arg(args, unsigned int);
++ ret = par->fbtftops.write(par, par->buf, len * (sizeof(u8)));
++ if (ret < 0) {
++ va_end(args);
++ dev_err(par->info->device, "%s: write() failed and returned %d\n",
++ __func__, ret);
++ return;
++ }
++ }
++
++ va_end(args);
++}
++
++static struct
++{
++ int xs, ys_page, xe, ye_page;
++} addr_win;
++
++/* save display writing zone */
++static void set_addr_win(struct fbtft_par *par, int xs, int ys, int xe, int ye)
++{
++ addr_win.xs = xs;
++ addr_win.ys_page = ys / 8;
++ addr_win.xe = xe;
++ addr_win.ye_page = ye / 8;
++
++ fbtft_par_dbg(DEBUG_SET_ADDR_WIN, par,
++ "%s(xs=%d, ys_page=%d, xe=%d, ye_page=%d)\n", __func__,
++ addr_win.xs, addr_win.ys_page, addr_win.xe, addr_win.ye_page);
++}
++
++static void
++construct_line_bitmap(struct fbtft_par *par, u8 *dest, signed short *src,
++ int xs, int xe, int y)
++{
++ int x, i;
++
++ for (x = xs; x < xe; ++x) {
++ u8 res = 0;
++
++ for (i = 0; i < 8; i++)
++ if (src[(y * 8 + i) * par->info->var.xres + x])
++ res |= 1 << i;
++#ifdef NEGATIVE
++ *dest++ = res;
++#else
++ *dest++ = ~res;
++#endif
++ }
++}
++
++static int write_vmem(struct fbtft_par *par, size_t offset, size_t len)
++{
++ u16 *vmem16 = (u16 *)par->info->screen_base;
++ u8 *buf = par->txbuf.buf;
++ int x, y;
++ int ret = 0;
++
++ /* buffer to convert RGB565 -> grayscale16 -> Ditherd image 1bpp */
++ signed short *convert_buf = kmalloc(par->info->var.xres *
++ par->info->var.yres * sizeof(signed short), GFP_NOIO);
++
++ fbtft_par_dbg(DEBUG_WRITE_VMEM, par, "%s()\n", __func__);
++
++ /* converting to grayscale16 */
++ for (x = 0; x < par->info->var.xres; ++x)
++ for (y = 0; y < par->info->var.yres; ++y) {
++ u16 pixel = vmem16[y * par->info->var.xres + x];
++ u16 b = pixel & 0x1f;
++ u16 g = (pixel & (0x3f << 5)) >> 5;
++ u16 r = (pixel & (0x1f << (5 + 6))) >> (5 + 6);
++
++ pixel = (299 * r + 587 * g + 114 * b) / 200;
++ if (pixel > 255)
++ pixel = 255;
++
++ /* gamma-correction by table */
++ convert_buf[y * par->info->var.xres + x] =
++ (signed short)gamma_correction_table[pixel];
++ }
++
++ /* Image Dithering */
++ for (x = 0; x < par->info->var.xres; ++x)
++ for (y = 0; y < par->info->var.yres; ++y) {
++ signed short pixel =
++ convert_buf[y * par->info->var.xres + x];
++ signed short error_b = pixel - BLACK;
++ signed short error_w = pixel - WHITE;
++ signed short error;
++ u16 i, j;
++
++ /* what color close? */
++ if (abs(error_b) >= abs(error_w)) {
++ /* white */
++ error = error_w;
++ pixel = 0xff;
++ } else {
++ /* black */
++ error = error_b;
++ pixel = 0;
++ }
++
++ error /= 8;
++
++ /* diffusion matrix row */
++ for (i = 0; i < DIFFUSING_MATRIX_WIDTH; ++i)
++ /* diffusion matrix column */
++ for (j = 0; j < DIFFUSING_MATRIX_HEIGHT; ++j) {
++ signed short *write_pos;
++ signed char coeff;
++
++ /* skip pixels out of zone */
++ if (x + i < 0 ||
++ x + i >= par->info->var.xres
++ || y + j >= par->info->var.yres)
++ continue;
++ write_pos = &convert_buf[
++ (y + j) * par->info->var.xres +
++ x + i];
++ coeff = diffusing_matrix[i][j];
++ if (coeff == -1)
++ /* pixel itself */
++ *write_pos = pixel;
++ else {
++ signed short p = *write_pos +
++ error * coeff;
++
++ if (p > WHITE)
++ p = WHITE;
++ if (p < BLACK)
++ p = BLACK;
++ *write_pos = p;
++ }
++ }
++ }
++
++ /* 1 string = 2 pages */
++ for (y = addr_win.ys_page; y <= addr_win.ye_page; ++y) {
++ /* left half of display */
++ if (addr_win.xs < par->info->var.xres / 2) {
++ construct_line_bitmap(par, buf, convert_buf,
++ addr_win.xs, par->info->var.xres / 2, y);
++
++ len = par->info->var.xres / 2 - addr_win.xs;
++
++ /* select left side (sc0)
++ * set addr
++ */
++ write_reg(par, 0x00, (1 << 6) | (u8)addr_win.xs);
++ write_reg(par, 0x00, (0x17 << 3) | (u8)y);
++
++ /* write bitmap */
++ gpio_set_value(par->RS, 1); /* RS->1 (data mode) */
++ ret = par->fbtftops.write(par, buf, len);
++ if (ret < 0)
++ dev_err(par->info->device,
++ "%s: write failed and returned: %d\n",
++ __func__, ret);
++ }
++ /* right half of display */
++ if (addr_win.xe >= par->info->var.xres / 2) {
++ construct_line_bitmap(par, buf,
++ convert_buf, par->info->var.xres / 2,
++ addr_win.xe + 1, y);
++
++ len = addr_win.xe + 1 - par->info->var.xres / 2;
++
++ /* select right side (sc1)
++ * set addr
++ */
++ write_reg(par, 0x01, (1 << 6));
++ write_reg(par, 0x01, (0x17 << 3) | (u8)y);
++
++ /* write bitmap */
++ gpio_set_value(par->RS, 1); /* RS->1 (data mode) */
++ par->fbtftops.write(par, buf, len);
++ if (ret < 0)
++ dev_err(par->info->device,
++ "%s: write failed and returned: %d\n",
++ __func__, ret);
++ }
++ }
++ kfree(convert_buf);
++
++ gpio_set_value(par->CS0, 1);
++ gpio_set_value(par->CS1, 1);
++
++ return ret;
++}
++
++static int write(struct fbtft_par *par, void *buf, size_t len)
++{
++ fbtft_par_dbg_hex(DEBUG_WRITE, par, par->info->device, u8, buf, len,
++ "%s(len=%d): ", __func__, len);
++
++ gpio_set_value(par->RW, 0); /* set write mode */
++
++
++ while (len--) {
++ u8 i, data;
++
++ data = *(u8 *) buf++;
++
++ /* set data bus */
++ for (i = 0; i < 8; ++i)
++ gpio_set_value(par->gpio.db[i], data & (1 << i));
++ /* set E */
++ gpio_set_value(par->EPIN, 1);
++ udelay(5);
++ /* unset E - write */
++ gpio_set_value(par->EPIN, 0);
++ udelay(1);
++ }
++
++ return 0;
++}
++
++static struct fbtft_display display = {
++ .regwidth = 8,
++ .width = TOTALWIDTH,
++ .height = HEIGHT,
++ .fps = FPS,
++ .fbtftops = {
++ .init_display = init_display,
++ .set_addr_win = set_addr_win,
++ .verify_gpios = verify_gpios,
++ .request_gpios_match = request_gpios_match,
++ .reset = reset,
++ .write = write,
++ .write_register = write_reg8_bus8,
++ .write_vmem = write_vmem,
++ },
++};
++FBTFT_REGISTER_DRIVER(DRVNAME, "displaytronic,fb_agm1264k-fl", &display);
++
++MODULE_ALIAS("platform:" DRVNAME);
++
++MODULE_DESCRIPTION("Two KS0108 LCD controllers in AGM1264K-FL display");
++MODULE_AUTHOR("ololoshka2871");
++MODULE_LICENSE("GPL");
+diff -Nur linux-3.18.8/drivers/staging/fbtft/fb_bd663474.c linux-rpi/drivers/staging/fbtft/fb_bd663474.c
+--- linux-3.18.8/drivers/staging/fbtft/fb_bd663474.c 1970-01-01 01:00:00.000000000 +0100
++++ linux-rpi/drivers/staging/fbtft/fb_bd663474.c 2015-03-05 14:40:16.341715808 +0100
+@@ -0,0 +1,193 @@
++/*
++ * FB driver for the uPD161704 LCD Controller
++ *
++ * Copyright (C) 2014 Seong-Woo Kim
++ *
++ * Based on fb_ili9325.c by Noralf Tronnes
++ * Based on ili9325.c by Jeroen Domburg
++ * Init code from UTFT library by Henning Karlsen
++ *
++ * This program is free software; you can redistribute it and/or modify
++ * it under the terms of the GNU General Public License as published by
++ * the Free Software Foundation; either version 2 of the License, or
++ * (at your option) any later version.
++ *
++ * This program is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
++ * GNU General Public License for more details.
++ *
++ * 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., 675 Mass Ave, Cambridge, MA 02139, USA.
++ */
++
++#include <linux/module.h>
++#include <linux/kernel.h>
++#include <linux/init.h>
++#include <linux/gpio.h>
++#include <linux/delay.h>
++
++#include "fbtft.h"
++
++#define DRVNAME "fb_bd663474"
++#define WIDTH 240
++#define HEIGHT 320
++#define BPP 16
++
++static int init_display(struct fbtft_par *par)
++{
++ fbtft_par_dbg(DEBUG_INIT_DISPLAY, par, "%s()\n", __func__);
++
++ if (par->gpio.cs != -1)
++ gpio_set_value(par->gpio.cs, 0); /* Activate chip */
++
++ par->fbtftops.reset(par);
++
++ /* Initialization sequence from Lib_UTFT */
++
++ /* oscillator start */
++ write_reg(par, 0x000,0x0001); /*oscillator 0: stop, 1: operation */
++ mdelay(10);
++
++ /* Power settings */
++ write_reg(par, 0x100, 0x0000 ); /* power supply setup */
++ write_reg(par, 0x101, 0x0000 );
++ write_reg(par, 0x102, 0x3110 );
++ write_reg(par, 0x103, 0xe200 );
++ write_reg(par, 0x110, 0x009d );
++ write_reg(par, 0x111, 0x0022 );
++ write_reg(par, 0x100, 0x0120 );
++ mdelay( 20 );
++
++ write_reg(par, 0x100, 0x3120 );
++ mdelay( 80 );
++ /* Display control */
++ write_reg(par, 0x001, 0x0100 );
++ write_reg(par, 0x002, 0x0000 );
++ write_reg(par, 0x003, 0x1230 );
++ write_reg(par, 0x006, 0x0000 );
++ write_reg(par, 0x007, 0x0101 );
++ write_reg(par, 0x008, 0x0808 );
++ write_reg(par, 0x009, 0x0000 );
++ write_reg(par, 0x00b, 0x0000 );
++ write_reg(par, 0x00c, 0x0000 );
++ write_reg(par, 0x00d, 0x0018 );
++ /* LTPS control settings */
++ write_reg(par, 0x012, 0x0000 );
++ write_reg(par, 0x013, 0x0000 );
++ write_reg(par, 0x018, 0x0000 );
++ write_reg(par, 0x019, 0x0000 );
++
++ write_reg(par, 0x203, 0x0000 );
++ write_reg(par, 0x204, 0x0000 );
++
++ write_reg(par, 0x210, 0x0000 );
++ write_reg(par, 0x211, 0x00ef );
++ write_reg(par, 0x212, 0x0000 );
++ write_reg(par, 0x213, 0x013f );
++ write_reg(par, 0x214, 0x0000 );
++ write_reg(par, 0x215, 0x0000 );
++ write_reg(par, 0x216, 0x0000 );
++ write_reg(par, 0x217, 0x0000 );
++
++ /* Gray scale settings */
++ write_reg(par, 0x300, 0x5343);
++ write_reg(par, 0x301, 0x1021);
++ write_reg(par, 0x302, 0x0003);
++ write_reg(par, 0x303, 0x0011);
++ write_reg(par, 0x304, 0x050a);
++ write_reg(par, 0x305, 0x4342);
++ write_reg(par, 0x306, 0x1100);
++ write_reg(par, 0x307, 0x0003);
++ write_reg(par, 0x308, 0x1201);
++ write_reg(par, 0x309, 0x050a);
++
++ /* RAM access settings */
++ write_reg(par, 0x400, 0x4027 );
++ write_reg(par, 0x401, 0x0000 );
++ write_reg(par, 0x402, 0x0000 ); /* First screen drive position (1) */
++ write_reg(par, 0x403, 0x013f ); /* First screen drive position (2) */
++ write_reg(par, 0x404, 0x0000 );
++
++ write_reg(par, 0x200, 0x0000 );
++ write_reg(par, 0x201, 0x0000 );
++ write_reg(par, 0x100, 0x7120 );
++ write_reg(par, 0x007, 0x0103 );
++ mdelay( 10 );
++ write_reg(par, 0x007, 0x0113 );
++
++ return 0;
++}
++
++static void set_addr_win(struct fbtft_par *par, int xs, int ys, int xe, int ye)
++{
++ fbtft_par_dbg(DEBUG_SET_ADDR_WIN, par,
++ "%s(xs=%d, ys=%d, xe=%d, ye=%d)\n", __func__, xs, ys, xe, ye);
++ switch (par->info->var.rotate) {
++ /* R200h = Horizontal GRAM Start Address */
++ /* R201h = Vertical GRAM Start Address */
++ case 0:
++ write_reg(par, 0x0200, xs);
++ write_reg(par, 0x0201, ys);
++ break;
++ case 180:
++ write_reg(par, 0x0200, WIDTH - 1 - xs);
++ write_reg(par, 0x0201, HEIGHT - 1 - ys);
++ break;
++ case 270:
++ write_reg(par, 0x0200, WIDTH - 1 - ys);
++ write_reg(par, 0x0201, xs);
++ break;
++ case 90:
++ write_reg(par, 0x0200, ys);
++ write_reg(par, 0x0201, HEIGHT - 1 - xs);
++ break;
++ }
++ write_reg(par, 0x202); /* Write Data to GRAM */
++}
++
++static int set_var(struct fbtft_par *par)
++{
++ fbtft_par_dbg(DEBUG_INIT_DISPLAY, par, "%s()\n", __func__);
++
++ switch (par->info->var.rotate) {
++ /* AM: GRAM update direction */
++ case 0:
++ write_reg(par, 0x003, 0x1230);
++ break;
++ case 180:
++ write_reg(par, 0x003, 0x1200);
++ break;
++ case 270:
++ write_reg(par, 0x003, 0x1228);
++ break;
++ case 90:
++ write_reg(par, 0x003, 0x1218);
++ break;
++ }
++
++ return 0;
++}
++
++static struct fbtft_display display = {
++ .regwidth = 16,
++ .width = WIDTH,
++ .height = HEIGHT,
++ .bpp = BPP,
++ .fbtftops = {
++ .init_display = init_display,
++ .set_addr_win = set_addr_win,
++ .set_var = set_var,
++ },
++};
++FBTFT_REGISTER_DRIVER(DRVNAME, "hitachi,bd663474", &display);
++
++MODULE_ALIAS("spi:" DRVNAME);
++MODULE_ALIAS("platform:" DRVNAME);
++MODULE_ALIAS("spi:bd663474");
++MODULE_ALIAS("platform:bd663474");
++
++MODULE_DESCRIPTION("FB driver for the uPD161704 LCD Controller");
++MODULE_AUTHOR("Seong-Woo Kim");
++MODULE_LICENSE("GPL");
+diff -Nur linux-3.18.8/drivers/staging/fbtft/fb_hx8340bn.c linux-rpi/drivers/staging/fbtft/fb_hx8340bn.c
+--- linux-3.18.8/drivers/staging/fbtft/fb_hx8340bn.c 1970-01-01 01:00:00.000000000 +0100
++++ linux-rpi/drivers/staging/fbtft/fb_hx8340bn.c 2015-03-05 14:40:16.341715808 +0100
+@@ -0,0 +1,229 @@
++/*
++ * FB driver for the HX8340BN LCD Controller
++ *
++ * This display uses 9-bit SPI: Data/Command bit + 8 data bits
++ * For platforms that doesn't support 9-bit, the driver is capable
++ * of emulating this using 8-bit transfer.
++ * This is done by transfering eight 9-bit words in 9 bytes.
++ *
++ * Copyright (C) 2013 Noralf Tronnes
++ *
++ * This program is free software; you can redistribute it and/or modify
++ * it under the terms of the GNU General Public License as published by
++ * the Free Software Foundation; either version 2 of the License, or
++ * (at your option) any later version.
++ *
++ * This program is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
++ * GNU General Public License for more details.
++ *
++ * 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., 675 Mass Ave, Cambridge, MA 02139, USA.
++ */
++
++#include <linux/module.h>
++#include <linux/kernel.h>
++#include <linux/init.h>
++#include <linux/vmalloc.h>
++#include <linux/spi/spi.h>
++#include <linux/delay.h>
++
++#include "fbtft.h"
++
++#define DRVNAME "fb_hx8340bn"
++#define WIDTH 176
++#define HEIGHT 220
++#define TXBUFLEN (4 * PAGE_SIZE)
++#define DEFAULT_GAMMA "1 3 0E 5 0 2 09 0 6 1 7 1 0 2 2\n" \
++ "3 3 17 8 4 7 05 7 6 0 3 1 6 0 0 "
++
++
++static bool emulate;
++module_param(emulate, bool, 0);
++MODULE_PARM_DESC(emulate, "Force emulation in 9-bit mode");
++
++
++static int init_display(struct fbtft_par *par)
++{
++ fbtft_par_dbg(DEBUG_INIT_DISPLAY, par, "%s()\n", __func__);
++
++ par->fbtftops.reset(par);
++
++ /* BTL221722-276L startup sequence, from datasheet */
++
++ /* SETEXTCOM: Set extended command set (C1h)
++ This command is used to set extended command set access enable.
++ Enable: After command (C1h), must write: ffh,83h,40h */
++ write_reg(par, 0xC1, 0xFF, 0x83, 0x40);
++
++ /* Sleep out
++ This command turns off sleep mode.
++ In this mode the DC/DC converter is enabled, Internal oscillator
++ is started, and panel scanning is started. */
++ write_reg(par, 0x11);
++ mdelay(150);
++
++ /* Undoc'd register? */
++ write_reg(par, 0xCA, 0x70, 0x00, 0xD9);
++
++ /* SETOSC: Set Internal Oscillator (B0h)
++ This command is used to set internal oscillator related settings */
++ /* OSC_EN: Enable internal oscillator */
++ /* Internal oscillator frequency: 125% x 2.52MHz */
++ write_reg(par, 0xB0, 0x01, 0x11);
++
++ /* Drive ability setting */
++ write_reg(par, 0xC9, 0x90, 0x49, 0x10, 0x28, 0x28, 0x10, 0x00, 0x06);
++ mdelay(20);
++
++ /* SETPWCTR5: Set Power Control 5(B5h)
++ This command is used to set VCOM Low and VCOM High Voltage */
++ /* VCOMH 0110101 : 3.925 */
++ /* VCOML 0100000 : -1.700 */
++ /* 45h=69 VCOMH: "VMH" + 5d VCOML: "VMH" + 5d */
++ write_reg(par, 0xB5, 0x35, 0x20, 0x45);
++
++ /* SETPWCTR4: Set Power Control 4(B4h)
++ VRH[4:0]: Specify the VREG1 voltage adjusting.
++ VREG1 voltage is for gamma voltage setting.
++ BT[2:0]: Switch the output factor of step-up circuit 2
++ for VGH and VGL voltage generation. */
++ write_reg(par, 0xB4, 0x33, 0x25, 0x4C);
++ mdelay(10);
++
++ /* Interface Pixel Format (3Ah)
++ This command is used to define the format of RGB picture data,
++ which is to be transfer via the system and RGB interface. */
++ /* RGB interface: 16 Bit/Pixel */
++ write_reg(par, 0x3A, 0x05);
++
++ /* Display on (29h)
++ This command is used to recover from DISPLAY OFF mode.
++ Output from the Frame Memory is enabled. */
++ write_reg(par, 0x29);
++ mdelay(10);
++
++ return 0;
++}
++
++void set_addr_win(struct fbtft_par *par, int xs, int ys, int xe, int ye)
++{
++ fbtft_par_dbg(DEBUG_SET_ADDR_WIN, par,
++ "%s(xs=%d, ys=%d, xe=%d, ye=%d)\n", __func__, xs, ys, xe, ye);
++
++ write_reg(par, FBTFT_CASET, 0x00, xs, 0x00, xe);
++ write_reg(par, FBTFT_RASET, 0x00, ys, 0x00, ye);
++ write_reg(par, FBTFT_RAMWR);
++}
++
++static int set_var(struct fbtft_par *par)
++{
++ fbtft_par_dbg(DEBUG_INIT_DISPLAY, par, "%s()\n", __func__);
++
++ /* MADCTL - Memory data access control */
++ /* RGB/BGR can be set with H/W pin SRGB and MADCTL BGR bit */
++#define MY (1 << 7)
++#define MX (1 << 6)
++#define MV (1 << 5)
++ switch (par->info->var.rotate) {
++ case 0:
++ write_reg(par, 0x36, (par->bgr << 3));
++ break;
++ case 270:
++ write_reg(par, 0x36, MX | MV | (par->bgr << 3));
++ break;
++ case 180:
++ write_reg(par, 0x36, MX | MY | (par->bgr << 3));
++ break;
++ case 90:
++ write_reg(par, 0x36, MY | MV | (par->bgr << 3));
++ break;
++ }
++
++ return 0;
++}
++
++/*
++ Gamma Curve selection, GC (only GC0 can be customized):
++ 0 = 2.2, 1 = 1.8, 2 = 2.5, 3 = 1.0
++ Gamma string format:
++ OP0 OP1 CP0 CP1 CP2 CP3 CP4 MP0 MP1 MP2 MP3 MP4 MP5 CGM0 CGM1
++ ON0 ON1 CN0 CN1 CN2 CN3 CN4 MN0 MN1 MN2 MN3 MN4 MN5 XXXX GC
++*/
++#define CURVE(num, idx) curves[num*par->gamma.num_values + idx]
++static int set_gamma(struct fbtft_par *par, unsigned long *curves)
++{
++ unsigned long mask[] = {
++ 0b1111, 0b1111, 0b11111, 0b1111, 0b1111, 0b1111, 0b11111,
++ 0b111, 0b111, 0b111, 0b111, 0b111, 0b111, 0b11, 0b11,
++ 0b1111, 0b1111, 0b11111, 0b1111, 0b1111, 0b1111, 0b11111,
++ 0b111, 0b111, 0b111, 0b111, 0b111, 0b111, 0b0, 0b0 };
++ int i, j;
++
++ fbtft_par_dbg(DEBUG_INIT_DISPLAY, par, "%s()\n", __func__);
++
++ /* apply mask */
++ for (i = 0; i < par->gamma.num_curves; i++)
++ for (j = 0; j < par->gamma.num_values; j++)
++ CURVE(i, j) &= mask[i * par->gamma.num_values + j];
++
++ write_reg(par, 0x26, 1 << CURVE(1, 14)); /* Gamma Set (26h) */
++
++ if (CURVE(1, 14))
++ return 0; /* only GC0 can be customized */
++
++ write_reg(par, 0xC2,
++ (CURVE(0, 8) << 4) | CURVE(0, 7),
++ (CURVE(0, 10) << 4) | CURVE(0, 9),
++ (CURVE(0, 12) << 4) | CURVE(0, 11),
++ CURVE(0, 2),
++ (CURVE(0, 4) << 4) | CURVE(0, 3),
++ CURVE(0, 5),
++ CURVE(0, 6),
++ (CURVE(0, 1) << 4) | CURVE(0, 0),
++ (CURVE(0, 14) << 2) | CURVE(0, 13));
++
++ write_reg(par, 0xC3,
++ (CURVE(1, 8) << 4) | CURVE(1, 7),
++ (CURVE(1, 10) << 4) | CURVE(1, 9),
++ (CURVE(1, 12) << 4) | CURVE(1, 11),
++ CURVE(1, 2),
++ (CURVE(1, 4) << 4) | CURVE(1, 3),
++ CURVE(1, 5),
++ CURVE(1, 6),
++ (CURVE(1, 1) << 4) | CURVE(1, 0));
++
++ mdelay(10);
++
++ return 0;
++}
++#undef CURVE
++
++
++static struct fbtft_display display = {
++ .regwidth = 8,
++ .width = WIDTH,
++ .height = HEIGHT,
++ .txbuflen = TXBUFLEN,
++ .gamma_num = 2,
++ .gamma_len = 15,
++ .gamma = DEFAULT_GAMMA,
++ .fbtftops = {
++ .init_display = init_display,
++ .set_addr_win = set_addr_win,
++ .set_var = set_var,
++ .set_gamma = set_gamma,
++ },
++};
++FBTFT_REGISTER_DRIVER(DRVNAME, "himax,hx8340bn", &display);
++
++MODULE_ALIAS("spi:" DRVNAME);
++MODULE_ALIAS("platform:" DRVNAME);
++MODULE_ALIAS("spi:hx8340bn");
++MODULE_ALIAS("platform:hx8340bn");
++
++MODULE_DESCRIPTION("FB driver for the HX8340BN LCD Controller");
++MODULE_AUTHOR("Noralf Tronnes");
++MODULE_LICENSE("GPL");
+diff -Nur linux-3.18.8/drivers/staging/fbtft/fb_hx8347d.c linux-rpi/drivers/staging/fbtft/fb_hx8347d.c
+--- linux-3.18.8/drivers/staging/fbtft/fb_hx8347d.c 1970-01-01 01:00:00.000000000 +0100
++++ linux-rpi/drivers/staging/fbtft/fb_hx8347d.c 2015-03-05 14:40:16.341715808 +0100
+@@ -0,0 +1,181 @@
++/*
++ * FB driver for the HX8347D LCD Controller
++ *
++ * Copyright (C) 2013 Christian Vogelgsang
++ *
++ * Based on driver code found here: https://github.com/watterott/r61505u-Adapter
++ *
++ * This program is free software; you can redistribute it and/or modify
++ * it under the terms of the GNU General Public License as published by
++ * the Free Software Foundation; either version 2 of the License, or
++ * (at your option) any later version.
++ *
++ * This program is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
++ * GNU General Public License for more details.
++ *
++ * 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., 675 Mass Ave, Cambridge, MA 02139, USA.
++ */
++
++#include <linux/module.h>
++#include <linux/kernel.h>
++#include <linux/init.h>
++#include <linux/delay.h>
++
++#include "fbtft.h"
++
++#define DRVNAME "fb_hx8347d"
++#define WIDTH 320
++#define HEIGHT 240
++#define DEFAULT_GAMMA "0 0 0 0 0 0 0 0 0 0 0 0 0 0\n" \
++ "0 0 0 0 0 0 0 0 0 0 0 0 0 0"
++
++
++static int init_display(struct fbtft_par *par)
++{
++ fbtft_par_dbg(DEBUG_INIT_DISPLAY, par, "%s()\n", __func__);
++
++ par->fbtftops.reset(par);
++
++ /* driving ability */
++ write_reg(par, 0xEA, 0x00);
++ write_reg(par, 0xEB, 0x20);
++ write_reg(par, 0xEC, 0x0C);
++ write_reg(par, 0xED, 0xC4);
++ write_reg(par, 0xE8, 0x40);
++ write_reg(par, 0xE9, 0x38);
++ write_reg(par, 0xF1, 0x01);
++ write_reg(par, 0xF2, 0x10);
++ write_reg(par, 0x27, 0xA3);
++
++ /* power voltage */
++ write_reg(par, 0x1B, 0x1B);
++ write_reg(par, 0x1A, 0x01);
++ write_reg(par, 0x24, 0x2F);
++ write_reg(par, 0x25, 0x57);
++
++ /* VCOM offset */
++ write_reg(par, 0x23, 0x8D); /* for flicker adjust */
++
++ /* power on */
++ write_reg(par, 0x18, 0x36);
++ write_reg(par, 0x19, 0x01); /* start osc */
++ write_reg(par, 0x01, 0x00); /* wakeup */
++ write_reg(par, 0x1F, 0x88);
++ mdelay(5);
++ write_reg(par, 0x1F, 0x80);
++ mdelay(5);
++ write_reg(par, 0x1F, 0x90);
++ mdelay(5);
++ write_reg(par, 0x1F, 0xD0);
++ mdelay(5);
++
++ /* color selection */
++ write_reg(par, 0x17, 0x05); /* 65k */
++
++ /*panel characteristic */
++ write_reg(par, 0x36, 0x00);
++
++ /*display on */
++ write_reg(par, 0x28, 0x38);
++ mdelay(40);
++ write_reg(par, 0x28, 0x3C);
++
++ /* orientation */
++ write_reg(par, 0x16, 0x60 | (par->bgr << 3));
++
++ return 0;
++}
++
++static void set_addr_win(struct fbtft_par *par, int xs, int ys, int xe, int ye)
++{
++ fbtft_par_dbg(DEBUG_SET_ADDR_WIN, par,
++ "%s(xs=%d, ys=%d, xe=%d, ye=%d)\n", __func__, xs, ys, xe, ye);
++
++ write_reg(par, 0x02, (xs >> 8) & 0xFF);
++ write_reg(par, 0x03, xs & 0xFF);
++ write_reg(par, 0x04, (xe >> 8) & 0xFF);
++ write_reg(par, 0x05, xe & 0xFF);
++ write_reg(par, 0x06, (ys >> 8) & 0xFF);
++ write_reg(par, 0x07, ys & 0xFF);
++ write_reg(par, 0x08, (ye >> 8) & 0xFF);
++ write_reg(par, 0x09, ye & 0xFF);
++ write_reg(par, 0x22);
++}
++
++/*
++ Gamma string format:
++ VRP0 VRP1 VRP2 VRP3 VRP4 VRP5 PRP0 PRP1 PKP0 PKP1 PKP2 PKP3 PKP4 CGM
++ VRN0 VRN1 VRN2 VRN3 VRN4 VRN5 PRN0 PRN1 PKN0 PKN1 PKN2 PKN3 PKN4 CGM
++*/
++#define CURVE(num, idx) curves[num*par->gamma.num_values + idx]
++static int set_gamma(struct fbtft_par *par, unsigned long *curves)
++{
++ unsigned long mask[] = {
++ 0b111111, 0b111111, 0b111111, 0b111111, 0b111111, 0b111111,
++ 0b1111111, 0b1111111,
++ 0b11111, 0b11111, 0b11111, 0b11111, 0b11111,
++ 0b1111};
++ int i, j;
++ int acc = 0;
++
++ fbtft_par_dbg(DEBUG_INIT_DISPLAY, par, "%s()\n", __func__);
++
++ /* apply mask */
++ for (i = 0; i < par->gamma.num_curves; i++)
++ for (j = 0; j < par->gamma.num_values; j++) {
++ acc += CURVE(i, j);
++ CURVE(i, j) &= mask[j];
++ }
++
++ if (acc == 0) /* skip if all values are zero */
++ return 0;
++
++ for (i = 0; i < par->gamma.num_curves; i++) {
++ write_reg(par, 0x40 + (i * 0x10), CURVE(i, 0));
++ write_reg(par, 0x41 + (i * 0x10), CURVE(i, 1));
++ write_reg(par, 0x42 + (i * 0x10), CURVE(i, 2));
++ write_reg(par, 0x43 + (i * 0x10), CURVE(i, 3));
++ write_reg(par, 0x44 + (i * 0x10), CURVE(i, 4));
++ write_reg(par, 0x45 + (i * 0x10), CURVE(i, 5));
++ write_reg(par, 0x46 + (i * 0x10), CURVE(i, 6));
++ write_reg(par, 0x47 + (i * 0x10), CURVE(i, 7));
++ write_reg(par, 0x48 + (i * 0x10), CURVE(i, 8));
++ write_reg(par, 0x49 + (i * 0x10), CURVE(i, 9));
++ write_reg(par, 0x4A + (i * 0x10), CURVE(i, 10));
++ write_reg(par, 0x4B + (i * 0x10), CURVE(i, 11));
++ write_reg(par, 0x4C + (i * 0x10), CURVE(i, 12));
++ }
++ write_reg(par, 0x5D, (CURVE(1, 0) << 4) | CURVE(0, 0));
++
++ return 0;
++}
++#undef CURVE
++
++
++static struct fbtft_display display = {
++ .regwidth = 8,
++ .width = WIDTH,
++ .height = HEIGHT,
++ .gamma_num = 2,
++ .gamma_len = 14,
++ .gamma = DEFAULT_GAMMA,
++ .fbtftops = {
++ .init_display = init_display,
++ .set_addr_win = set_addr_win,
++ .set_gamma = set_gamma,
++ },
++};
++FBTFT_REGISTER_DRIVER(DRVNAME, "himax,hx8347d", &display);
++
++MODULE_ALIAS("spi:" DRVNAME);
++MODULE_ALIAS("platform:" DRVNAME);
++MODULE_ALIAS("spi:hx8347d");
++MODULE_ALIAS("platform:hx8347d");
++
++MODULE_DESCRIPTION("FB driver for the HX8347D LCD Controller");
++MODULE_AUTHOR("Christian Vogelgsang");
++MODULE_LICENSE("GPL");
+diff -Nur linux-3.18.8/drivers/staging/fbtft/fb_hx8353d.c linux-rpi/drivers/staging/fbtft/fb_hx8353d.c
+--- linux-3.18.8/drivers/staging/fbtft/fb_hx8353d.c 1970-01-01 01:00:00.000000000 +0100
++++ linux-rpi/drivers/staging/fbtft/fb_hx8353d.c 2015-03-05 14:40:16.341715808 +0100
+@@ -0,0 +1,166 @@
++/*
++ * FB driver for the HX8353D LCD Controller
++ *
++ * Copyright (c) 2014 Petr Olivka
++ * Copyright (c) 2013 Noralf Tronnes
++ *
++ * This program is free software; you can redistribute it and/or modify
++ * it under the terms of the GNU General Public License as published by
++ * the Free Software Foundation; either version 2 of the License, or
++ * (at your option) any later version.
++ *
++ * This program is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
++ * GNU General Public License for more details.
++ *
++ * 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., 675 Mass Ave, Cambridge, MA 02139, USA.
++ */
++
++#include <linux/module.h>
++#include <linux/kernel.h>
++#include <linux/init.h>
++#include <linux/delay.h>
++
++#include "fbtft.h"
++
++#define DRVNAME "fb_hx8353d"
++#define DEFAULT_GAMMA "50 77 40 08 BF 00 03 0F 00 01 73 00 72 03 B0 0F 08 00 0F"
++
++static int init_display(struct fbtft_par *par)
++{
++
++ fbtft_par_dbg(DEBUG_INIT_DISPLAY, par, "%s()\n", __func__);
++
++ par->fbtftops.reset(par);
++ mdelay(150);
++
++ /* SETEXTC */
++ write_reg(par, 0xB9, 0xFF, 0x83, 0x53);
++
++ /* RADJ */
++ write_reg(par, 0xB0, 0x3C, 0x01);
++
++ /* VCOM */
++ write_reg(par, 0xB6, 0x94, 0x6C, 0x50);
++
++ /* PWR */
++ write_reg(par, 0xB1, 0x00, 0x01, 0x1B, 0x03, 0x01, 0x08, 0x77, 0x89);
++
++ /* COLMOD */
++ write_reg(par, 0x3A, 0x05);
++
++ /* MEM ACCESS */
++ write_reg(par, 0x36, 0xC0);
++
++ /* SLPOUT - Sleep out & booster on */
++ write_reg(par, 0x11);
++ mdelay(150);
++
++ /* DISPON - Display On */
++ write_reg(par, 0x29);
++
++ /* RGBSET */
++ write_reg(par, 0x2D,
++ 0, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30,
++ 32, 34, 36, 38, 40, 42, 44, 46, 48, 50, 52, 54, 56, 58, 60, 62,
++ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15,
++ 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31,
++ 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47,
++ 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63,
++ 0, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30,
++ 32, 34, 36, 38, 40, 42, 44, 46, 48, 50, 52, 54, 56, 58, 60, 62);
++
++ return 0;
++};
++
++static void set_addr_win(struct fbtft_par *par, int xs, int ys, int xe, int ye)
++{
++ fbtft_par_dbg(DEBUG_SET_ADDR_WIN, par,
++ "%s(xs=%d, ys=%d, xe=%d, ye=%d)\n", __func__, xs, ys, xe, ye);
++
++ /* column address */
++ write_reg(par, 0x2a, xs >> 8, xs & 0xff, xe >> 8, xe & 0xff);
++
++ /* row adress */
++ write_reg(par, 0x2b, ys >> 8, ys & 0xff, ye >> 8, ye & 0xff);
++
++ /* memory write */
++ write_reg(par, 0x2c);
++}
++
++#define my (1 << 7)
++#define mx (1 << 6)
++#define mv (1 << 5)
++static int set_var(struct fbtft_par *par)
++{
++ fbtft_par_dbg(DEBUG_INIT_DISPLAY, par, "%s()\n", __func__);
++
++ /* madctl - memory data access control
++ rgb/bgr:
++ 1. mode selection pin srgb
++ rgb h/w pin for color filter setting: 0=rgb, 1=bgr
++ 2. madctl rgb bit
++ rgb-bgr order color filter panel: 0=rgb, 1=bgr */
++ switch (par->info->var.rotate) {
++ case 0:
++ write_reg(par, 0x36, mx | my | (par->bgr << 3));
++ break;
++ case 270:
++ write_reg(par, 0x36, my | mv | (par->bgr << 3));
++ break;
++ case 180:
++ write_reg(par, 0x36, (par->bgr << 3));
++ break;
++ case 90:
++ write_reg(par, 0x36, mx | mv | (par->bgr << 3));
++ break;
++ }
++
++ return 0;
++}
++
++/*
++ gamma string format:
++*/
++static int set_gamma(struct fbtft_par *par, unsigned long *curves)
++{
++ fbtft_par_dbg(DEBUG_INIT_DISPLAY, par, "%s()\n", __func__);
++
++ write_reg(par, 0xE0,
++ curves[0], curves[1], curves[2], curves[3],
++ curves[4], curves[5], curves[6], curves[7],
++ curves[8], curves[9], curves[10], curves[11],
++ curves[12], curves[13], curves[14], curves[15],
++ curves[16], curves[17], curves[18]);
++
++ return 0;
++}
++
++
++static struct fbtft_display display = {
++ .regwidth = 8,
++ .width = 128,
++ .height = 160,
++ .gamma_num = 1,
++ .gamma_len = 19,
++ .gamma = DEFAULT_GAMMA,
++ .fbtftops = {
++ .init_display = init_display,
++ .set_addr_win = set_addr_win,
++ .set_var = set_var,
++ .set_gamma = set_gamma,
++ },
++};
++FBTFT_REGISTER_DRIVER(DRVNAME, "himax,hx8353d", &display);
++
++MODULE_ALIAS("spi:" DRVNAME);
++MODULE_ALIAS("platform:" DRVNAME);
++MODULE_ALIAS("spi:hx8353d");
++MODULE_ALIAS("platform:hx8353d");
++
++MODULE_DESCRIPTION("FB driver for the HX8353D LCD Controller");
++MODULE_AUTHOR("Petr Olivka");
++MODULE_LICENSE("GPL");
+diff -Nur linux-3.18.8/drivers/staging/fbtft/fb_ili9320.c linux-rpi/drivers/staging/fbtft/fb_ili9320.c
+--- linux-3.18.8/drivers/staging/fbtft/fb_ili9320.c 1970-01-01 01:00:00.000000000 +0100
++++ linux-rpi/drivers/staging/fbtft/fb_ili9320.c 2015-03-05 14:40:16.341715808 +0100
+@@ -0,0 +1,234 @@
++/*
++ * FB driver for the ILI9320 LCD Controller
++ *
++ * Copyright (C) 2013 Noralf Tronnes
++ *
++ * This program is free software; you can redistribute it and/or modify
++ * it under the terms of the GNU General Public License as published by
++ * the Free Software Foundation; either version 2 of the License, or
++ * (at your option) any later version.
++ *
++ * This program is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
++ * GNU General Public License for more details.
++ *
++ * 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., 675 Mass Ave, Cambridge, MA 02139, USA.
++ */
++
++#include <linux/module.h>
++#include <linux/kernel.h>
++#include <linux/init.h>
++#include <linux/gpio.h>
++#include <linux/spi/spi.h>
++#include <linux/delay.h>
++
++#include "fbtft.h"
++
++#define DRVNAME "fb_ili9320"
++#define WIDTH 240
++#define HEIGHT 320
++#define DEFAULT_GAMMA "07 07 6 0 0 0 5 5 4 0\n" \
++ "07 08 4 7 5 1 2 0 7 7"
++
++
++static unsigned read_devicecode(struct fbtft_par *par)
++{
++ int ret;
++ u8 rxbuf[8] = {0, };
++
++ write_reg(par, 0x0000);
++ ret = par->fbtftops.read(par, rxbuf, 4);
++ return (rxbuf[2] << 8) | rxbuf[3];
++}
++
++static int init_display(struct fbtft_par *par)
++{
++ unsigned devcode;
++ fbtft_par_dbg(DEBUG_INIT_DISPLAY, par, "%s()\n", __func__);
++
++ par->fbtftops.reset(par);
++
++ devcode = read_devicecode(par);
++ fbtft_par_dbg(DEBUG_INIT_DISPLAY, par, "Device code: 0x%04X\n",
++ devcode);
++ if ((devcode != 0x0000) && (devcode != 0x9320))
++ dev_warn(par->info->device,
++ "Unrecognized Device code: 0x%04X (expected 0x9320)\n",
++ devcode);
++
++ /* Initialization sequence from ILI9320 Application Notes */
++
++ /* *********** Start Initial Sequence ********* */
++ write_reg(par, 0x00E5, 0x8000); /* Set the Vcore voltage and this setting is must. */
++ write_reg(par, 0x0000, 0x0001); /* Start internal OSC. */
++ write_reg(par, 0x0001, 0x0100); /* set SS and SM bit */
++ write_reg(par, 0x0002, 0x0700); /* set 1 line inversion */
++ write_reg(par, 0x0004, 0x0000); /* Resize register */
++ write_reg(par, 0x0008, 0x0202); /* set the back and front porch */
++ write_reg(par, 0x0009, 0x0000); /* set non-display area refresh cycle */
++ write_reg(par, 0x000A, 0x0000); /* FMARK function */
++ write_reg(par, 0x000C, 0x0000); /* RGB interface setting */
++ write_reg(par, 0x000D, 0x0000); /* Frame marker Position */
++ write_reg(par, 0x000F, 0x0000); /* RGB interface polarity */
++
++ /* ***********Power On sequence *************** */
++ write_reg(par, 0x0010, 0x0000); /* SAP, BT[3:0], AP, DSTB, SLP, STB */
++ write_reg(par, 0x0011, 0x0007); /* DC1[2:0], DC0[2:0], VC[2:0] */
++ write_reg(par, 0x0012, 0x0000); /* VREG1OUT voltage */
++ write_reg(par, 0x0013, 0x0000); /* VDV[4:0] for VCOM amplitude */
++ mdelay(200); /* Dis-charge capacitor power voltage */
++ write_reg(par, 0x0010, 0x17B0); /* SAP, BT[3:0], AP, DSTB, SLP, STB */
++ write_reg(par, 0x0011, 0x0031); /* R11h=0x0031 at VCI=3.3V DC1[2:0], DC0[2:0], VC[2:0] */
++ mdelay(50);
++ write_reg(par, 0x0012, 0x0138); /* R12h=0x0138 at VCI=3.3V VREG1OUT voltage */
++ mdelay(50);
++ write_reg(par, 0x0013, 0x1800); /* R13h=0x1800 at VCI=3.3V VDV[4:0] for VCOM amplitude */
++ write_reg(par, 0x0029, 0x0008); /* R29h=0x0008 at VCI=3.3V VCM[4:0] for VCOMH */
++ mdelay(50);
++ write_reg(par, 0x0020, 0x0000); /* GRAM horizontal Address */
++ write_reg(par, 0x0021, 0x0000); /* GRAM Vertical Address */
++
++ /* ------------------ Set GRAM area --------------- */
++ write_reg(par, 0x0050, 0x0000); /* Horizontal GRAM Start Address */
++ write_reg(par, 0x0051, 0x00EF); /* Horizontal GRAM End Address */
++ write_reg(par, 0x0052, 0x0000); /* Vertical GRAM Start Address */
++ write_reg(par, 0x0053, 0x013F); /* Vertical GRAM Start Address */
++ write_reg(par, 0x0060, 0x2700); /* Gate Scan Line */
++ write_reg(par, 0x0061, 0x0001); /* NDL,VLE, REV */
++ write_reg(par, 0x006A, 0x0000); /* set scrolling line */
++
++ /* -------------- Partial Display Control --------- */
++ write_reg(par, 0x0080, 0x0000);
++ write_reg(par, 0x0081, 0x0000);
++ write_reg(par, 0x0082, 0x0000);
++ write_reg(par, 0x0083, 0x0000);
++ write_reg(par, 0x0084, 0x0000);
++ write_reg(par, 0x0085, 0x0000);
++
++ /* -------------- Panel Control ------------------- */
++ write_reg(par, 0x0090, 0x0010);
++ write_reg(par, 0x0092, 0x0000);
++ write_reg(par, 0x0093, 0x0003);
++ write_reg(par, 0x0095, 0x0110);
++ write_reg(par, 0x0097, 0x0000);
++ write_reg(par, 0x0098, 0x0000);
++ write_reg(par, 0x0007, 0x0173); /* 262K color and display ON */
++
++ return 0;
++}
++
++static void set_addr_win(struct fbtft_par *par, int xs, int ys, int xe, int ye)
++{
++ fbtft_par_dbg(DEBUG_SET_ADDR_WIN, par,
++ "%s(xs=%d, ys=%d, xe=%d, ye=%d)\n", __func__, xs, ys, xe, ye);
++
++ switch (par->info->var.rotate) {
++ /* R20h = Horizontal GRAM Start Address */
++ /* R21h = Vertical GRAM Start Address */
++ case 0:
++ write_reg(par, 0x0020, xs);
++ write_reg(par, 0x0021, ys);
++ break;
++ case 180:
++ write_reg(par, 0x0020, WIDTH - 1 - xs);
++ write_reg(par, 0x0021, HEIGHT - 1 - ys);
++ break;
++ case 270:
++ write_reg(par, 0x0020, WIDTH - 1 - ys);
++ write_reg(par, 0x0021, xs);
++ break;
++ case 90:
++ write_reg(par, 0x0020, ys);
++ write_reg(par, 0x0021, HEIGHT - 1 - xs);
++ break;
++ }
++ write_reg(par, 0x0022); /* Write Data to GRAM */
++}
++
++static int set_var(struct fbtft_par *par)
++{
++ fbtft_par_dbg(DEBUG_INIT_DISPLAY, par, "%s()\n", __func__);
++
++ switch (par->info->var.rotate) {
++ case 0:
++ write_reg(par, 0x3, (par->bgr << 12) | 0x30);
++ break;
++ case 270:
++ write_reg(par, 0x3, (par->bgr << 12) | 0x28);
++ break;
++ case 180:
++ write_reg(par, 0x3, (par->bgr << 12) | 0x00);
++ break;
++ case 90:
++ write_reg(par, 0x3, (par->bgr << 12) | 0x18);
++ break;
++ }
++ return 0;
++}
++
++/*
++ Gamma string format:
++ VRP0 VRP1 RP0 RP1 KP0 KP1 KP2 KP3 KP4 KP5
++ VRN0 VRN1 RN0 RN1 KN0 KN1 KN2 KN3 KN4 KN5
++*/
++#define CURVE(num, idx) curves[num*par->gamma.num_values + idx]
++static int set_gamma(struct fbtft_par *par, unsigned long *curves)
++{
++ unsigned long mask[] = {
++ 0b11111, 0b11111, 0b111, 0b111, 0b111,
++ 0b111, 0b111, 0b111, 0b111, 0b111,
++ 0b11111, 0b11111, 0b111, 0b111, 0b111,
++ 0b111, 0b111, 0b111, 0b111, 0b111 };
++ int i, j;
++
++ fbtft_par_dbg(DEBUG_INIT_DISPLAY, par, "%s()\n", __func__);
++
++ /* apply mask */
++ for (i = 0; i < 2; i++)
++ for (j = 0; j < 10; j++)
++ CURVE(i, j) &= mask[i*par->gamma.num_values + j];
++
++ write_reg(par, 0x0030, CURVE(0, 5) << 8 | CURVE(0, 4));
++ write_reg(par, 0x0031, CURVE(0, 7) << 8 | CURVE(0, 6));
++ write_reg(par, 0x0032, CURVE(0, 9) << 8 | CURVE(0, 8));
++ write_reg(par, 0x0035, CURVE(0, 3) << 8 | CURVE(0, 2));
++ write_reg(par, 0x0036, CURVE(0, 1) << 8 | CURVE(0, 0));
++
++ write_reg(par, 0x0037, CURVE(1, 5) << 8 | CURVE(1, 4));
++ write_reg(par, 0x0038, CURVE(1, 7) << 8 | CURVE(1, 6));
++ write_reg(par, 0x0039, CURVE(1, 9) << 8 | CURVE(1, 8));
++ write_reg(par, 0x003C, CURVE(1, 3) << 8 | CURVE(1, 2));
++ write_reg(par, 0x003D, CURVE(1, 1) << 8 | CURVE(1, 0));
++
++ return 0;
++}
++#undef CURVE
++
++
++static struct fbtft_display display = {
++ .regwidth = 16,
++ .width = WIDTH,
++ .height = HEIGHT,
++ .gamma_num = 2,
++ .gamma_len = 10,
++ .gamma = DEFAULT_GAMMA,
++ .fbtftops = {
++ .init_display = init_display,
++ .set_addr_win = set_addr_win,
++ .set_var = set_var,
++ .set_gamma = set_gamma,
++ },
++};
++FBTFT_REGISTER_DRIVER(DRVNAME, "ilitek,ili9320", &display);
++
++MODULE_ALIAS("spi:" DRVNAME);
++MODULE_ALIAS("platform:" DRVNAME);
++MODULE_ALIAS("spi:ili9320");
++MODULE_ALIAS("platform:ili9320");
++
++MODULE_DESCRIPTION("FB driver for the ILI9320 LCD Controller");
++MODULE_AUTHOR("Noralf Tronnes");
++MODULE_LICENSE("GPL");
+diff -Nur linux-3.18.8/drivers/staging/fbtft/fb_ili9325.c linux-rpi/drivers/staging/fbtft/fb_ili9325.c
+--- linux-3.18.8/drivers/staging/fbtft/fb_ili9325.c 1970-01-01 01:00:00.000000000 +0100
++++ linux-rpi/drivers/staging/fbtft/fb_ili9325.c 2015-03-05 14:40:16.341715808 +0100
+@@ -0,0 +1,291 @@
++/*
++ * FB driver for the ILI9325 LCD Controller
++ *
++ * Copyright (C) 2013 Noralf Tronnes
++ *
++ * Based on ili9325.c by Jeroen Domburg
++ *
++ * This program is free software; you can redistribute it and/or modify
++ * it under the terms of the GNU General Public License as published by
++ * the Free Software Foundation; either version 2 of the License, or
++ * (at your option) any later version.
++ *
++ * This program is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
++ * GNU General Public License for more details.
++ *
++ * 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., 675 Mass Ave, Cambridge, MA 02139, USA.
++ */
++
++#include <linux/module.h>
++#include <linux/kernel.h>
++#include <linux/init.h>
++#include <linux/gpio.h>
++#include <linux/delay.h>
++
++#include "fbtft.h"
++
++#define DRVNAME "fb_ili9325"
++#define WIDTH 240
++#define HEIGHT 320
++#define BPP 16
++#define FPS 20
++#define DEFAULT_GAMMA "0F 00 7 2 0 0 6 5 4 1\n" \
++ "04 16 2 7 6 3 2 1 7 7"
++
++
++static unsigned bt = 6; /* VGL=Vci*4 , VGH=Vci*4 */
++module_param(bt, uint, 0);
++MODULE_PARM_DESC(bt, "Sets the factor used in the step-up circuits");
++
++static unsigned vc = 0b011; /* Vci1=Vci*0.80 */
++module_param(vc, uint, 0);
++MODULE_PARM_DESC(vc,
++"Sets the ratio factor of Vci to generate the reference voltages Vci1");
++
++static unsigned vrh = 0b1101; /* VREG1OUT=Vci*1.85 */
++module_param(vrh, uint, 0);
++MODULE_PARM_DESC(vrh,
++"Set the amplifying rate (1.6 ~ 1.9) of Vci applied to output the VREG1OUT");
++
++static unsigned vdv = 0b10010; /* VCOMH amplitude=VREG1OUT*0.98 */
++module_param(vdv, uint, 0);
++MODULE_PARM_DESC(vdv,
++"Select the factor of VREG1OUT to set the amplitude of Vcom");
++
++static unsigned vcm = 0b001010; /* VCOMH=VREG1OUT*0.735 */
++module_param(vcm, uint, 0);
++MODULE_PARM_DESC(vcm, "Set the internal VcomH voltage");
++
++
++/*
++Verify that this configuration is within the Voltage limits
++
++Display module configuration: Vcc = IOVcc = Vci = 3.3V
++
++ Voltages
++----------
++Vci = 3.3
++Vci1 = Vci * 0.80 = 2.64
++DDVDH = Vci1 * 2 = 5.28
++VCL = -Vci1 = -2.64
++VREG1OUT = Vci * 1.85 = 4.88
++VCOMH = VREG1OUT * 0.735 = 3.59
++VCOM amplitude = VREG1OUT * 0.98 = 4.79
++VGH = Vci * 4 = 13.2
++VGL = -Vci * 4 = -13.2
++
++ Limits
++--------
++Power supplies
++1.65 < IOVcc < 3.30 => 1.65 < 3.3 < 3.30
++2.40 < Vcc < 3.30 => 2.40 < 3.3 < 3.30
++2.50 < Vci < 3.30 => 2.50 < 3.3 < 3.30
++
++Source/VCOM power supply voltage
++ 4.50 < DDVDH < 6.0 => 4.50 < 5.28 < 6.0
++-3.0 < VCL < -2.0 => -3.0 < -2.64 < -2.0
++VCI - VCL < 6.0 => 5.94 < 6.0
++
++Gate driver output voltage
++ 10 < VGH < 20 => 10 < 13.2 < 20
++-15 < VGL < -5 => -15 < -13.2 < -5
++VGH - VGL < 32 => 26.4 < 32
++
++VCOM driver output voltage
++VCOMH - VCOML < 6.0 => 4.79 < 6.0
++*/
++
++static int init_display(struct fbtft_par *par)
++{
++ fbtft_par_dbg(DEBUG_INIT_DISPLAY, par, "%s()\n", __func__);
++
++ par->fbtftops.reset(par);
++
++ if (par->gpio.cs != -1)
++ gpio_set_value(par->gpio.cs, 0); /* Activate chip */
++
++ bt &= 0b111;
++ vc &= 0b111;
++ vrh &= 0b1111;
++ vdv &= 0b11111;
++ vcm &= 0b111111;
++
++ /* Initialization sequence from ILI9325 Application Notes */
++
++ /* ----------- Start Initial Sequence ----------- */
++ write_reg(par, 0x00E3, 0x3008); /* Set internal timing */
++ write_reg(par, 0x00E7, 0x0012); /* Set internal timing */
++ write_reg(par, 0x00EF, 0x1231); /* Set internal timing */
++ write_reg(par, 0x0001, 0x0100); /* set SS and SM bit */
++ write_reg(par, 0x0002, 0x0700); /* set 1 line inversion */
++ write_reg(par, 0x0004, 0x0000); /* Resize register */
++ write_reg(par, 0x0008, 0x0207); /* set the back porch and front porch */
++ write_reg(par, 0x0009, 0x0000); /* set non-display area refresh cycle */
++ write_reg(par, 0x000A, 0x0000); /* FMARK function */
++ write_reg(par, 0x000C, 0x0000); /* RGB interface setting */
++ write_reg(par, 0x000D, 0x0000); /* Frame marker Position */
++ write_reg(par, 0x000F, 0x0000); /* RGB interface polarity */
++
++ /* ----------- Power On sequence ----------- */
++ write_reg(par, 0x0010, 0x0000); /* SAP, BT[3:0], AP, DSTB, SLP, STB */
++ write_reg(par, 0x0011, 0x0007); /* DC1[2:0], DC0[2:0], VC[2:0] */
++ write_reg(par, 0x0012, 0x0000); /* VREG1OUT voltage */
++ write_reg(par, 0x0013, 0x0000); /* VDV[4:0] for VCOM amplitude */
++ mdelay(200); /* Dis-charge capacitor power voltage */
++ write_reg(par, 0x0010, /* SAP, BT[3:0], AP, DSTB, SLP, STB */
++ (1 << 12) | (bt << 8) | (1 << 7) | (0b001 << 4));
++ write_reg(par, 0x0011, 0x220 | vc); /* DC1[2:0], DC0[2:0], VC[2:0] */
++ mdelay(50); /* Delay 50ms */
++ write_reg(par, 0x0012, vrh); /* Internal reference voltage= Vci; */
++ mdelay(50); /* Delay 50ms */
++ write_reg(par, 0x0013, vdv << 8); /* Set VDV[4:0] for VCOM amplitude */
++ write_reg(par, 0x0029, vcm); /* Set VCM[5:0] for VCOMH */
++ write_reg(par, 0x002B, 0x000C); /* Set Frame Rate */
++ mdelay(50); /* Delay 50ms */
++ write_reg(par, 0x0020, 0x0000); /* GRAM horizontal Address */
++ write_reg(par, 0x0021, 0x0000); /* GRAM Vertical Address */
++
++ /*------------------ Set GRAM area --------------- */
++ write_reg(par, 0x0050, 0x0000); /* Horizontal GRAM Start Address */
++ write_reg(par, 0x0051, 0x00EF); /* Horizontal GRAM End Address */
++ write_reg(par, 0x0052, 0x0000); /* Vertical GRAM Start Address */
++ write_reg(par, 0x0053, 0x013F); /* Vertical GRAM Start Address */
++ write_reg(par, 0x0060, 0xA700); /* Gate Scan Line */
++ write_reg(par, 0x0061, 0x0001); /* NDL,VLE, REV */
++ write_reg(par, 0x006A, 0x0000); /* set scrolling line */
++
++ /*-------------- Partial Display Control --------- */
++ write_reg(par, 0x0080, 0x0000);
++ write_reg(par, 0x0081, 0x0000);
++ write_reg(par, 0x0082, 0x0000);
++ write_reg(par, 0x0083, 0x0000);
++ write_reg(par, 0x0084, 0x0000);
++ write_reg(par, 0x0085, 0x0000);
++
++ /*-------------- Panel Control ------------------- */
++ write_reg(par, 0x0090, 0x0010);
++ write_reg(par, 0x0092, 0x0600);
++ write_reg(par, 0x0007, 0x0133); /* 262K color and display ON */
++
++ return 0;
++}
++
++static void set_addr_win(struct fbtft_par *par, int xs, int ys, int xe, int ye)
++{
++ fbtft_par_dbg(DEBUG_SET_ADDR_WIN, par,
++ "%s(xs=%d, ys=%d, xe=%d, ye=%d)\n", __func__, xs, ys, xe, ye);
++ switch (par->info->var.rotate) {
++ /* R20h = Horizontal GRAM Start Address */
++ /* R21h = Vertical GRAM Start Address */
++ case 0:
++ write_reg(par, 0x0020, xs);
++ write_reg(par, 0x0021, ys);
++ break;
++ case 180:
++ write_reg(par, 0x0020, WIDTH - 1 - xs);
++ write_reg(par, 0x0021, HEIGHT - 1 - ys);
++ break;
++ case 270:
++ write_reg(par, 0x0020, WIDTH - 1 - ys);
++ write_reg(par, 0x0021, xs);
++ break;
++ case 90:
++ write_reg(par, 0x0020, ys);
++ write_reg(par, 0x0021, HEIGHT - 1 - xs);
++ break;
++ }
++ write_reg(par, 0x0022); /* Write Data to GRAM */
++}
++
++static int set_var(struct fbtft_par *par)
++{
++ fbtft_par_dbg(DEBUG_INIT_DISPLAY, par, "%s()\n", __func__);
++
++ switch (par->info->var.rotate) {
++ /* AM: GRAM update direction */
++ case 0:
++ write_reg(par, 0x03, 0x0030 | (par->bgr << 12));
++ break;
++ case 180:
++ write_reg(par, 0x03, 0x0000 | (par->bgr << 12));
++ break;
++ case 270:
++ write_reg(par, 0x03, 0x0028 | (par->bgr << 12));
++ break;
++ case 90:
++ write_reg(par, 0x03, 0x0018 | (par->bgr << 12));
++ break;
++ }
++
++ return 0;
++}
++
++/*
++ Gamma string format:
++ VRP0 VRP1 RP0 RP1 KP0 KP1 KP2 KP3 KP4 KP5
++ VRN0 VRN1 RN0 RN1 KN0 KN1 KN2 KN3 KN4 KN5
++*/
++#define CURVE(num, idx) curves[num*par->gamma.num_values + idx]
++static int set_gamma(struct fbtft_par *par, unsigned long *curves)
++{
++ unsigned long mask[] = {
++ 0b11111, 0b11111, 0b111, 0b111, 0b111,
++ 0b111, 0b111, 0b111, 0b111, 0b111,
++ 0b11111, 0b11111, 0b111, 0b111, 0b111,
++ 0b111, 0b111, 0b111, 0b111, 0b111 };
++ int i, j;
++
++ fbtft_par_dbg(DEBUG_INIT_DISPLAY, par, "%s()\n", __func__);
++
++ /* apply mask */
++ for (i = 0; i < 2; i++)
++ for (j = 0; j < 10; j++)
++ CURVE(i, j) &= mask[i*par->gamma.num_values + j];
++
++ write_reg(par, 0x0030, CURVE(0, 5) << 8 | CURVE(0, 4));
++ write_reg(par, 0x0031, CURVE(0, 7) << 8 | CURVE(0, 6));
++ write_reg(par, 0x0032, CURVE(0, 9) << 8 | CURVE(0, 8));
++ write_reg(par, 0x0035, CURVE(0, 3) << 8 | CURVE(0, 2));
++ write_reg(par, 0x0036, CURVE(0, 1) << 8 | CURVE(0, 0));
++
++ write_reg(par, 0x0037, CURVE(1, 5) << 8 | CURVE(1, 4));
++ write_reg(par, 0x0038, CURVE(1, 7) << 8 | CURVE(1, 6));
++ write_reg(par, 0x0039, CURVE(1, 9) << 8 | CURVE(1, 8));
++ write_reg(par, 0x003C, CURVE(1, 3) << 8 | CURVE(1, 2));
++ write_reg(par, 0x003D, CURVE(1, 1) << 8 | CURVE(1, 0));
++
++ return 0;
++}
++#undef CURVE
++
++
++static struct fbtft_display display = {
++ .regwidth = 16,
++ .width = WIDTH,
++ .height = HEIGHT,
++ .bpp = BPP,
++ .fps = FPS,
++ .gamma_num = 2,
++ .gamma_len = 10,
++ .gamma = DEFAULT_GAMMA,
++ .fbtftops = {
++ .init_display = init_display,
++ .set_addr_win = set_addr_win,
++ .set_var = set_var,
++ .set_gamma = set_gamma,
++ },
++};
++FBTFT_REGISTER_DRIVER(DRVNAME, "ilitek,ili9325", &display);
++
++MODULE_ALIAS("spi:" DRVNAME);
++MODULE_ALIAS("platform:" DRVNAME);
++MODULE_ALIAS("spi:ili9325");
++MODULE_ALIAS("platform:ili9325");
++
++MODULE_DESCRIPTION("FB driver for the ILI9325 LCD Controller");
++MODULE_AUTHOR("Noralf Tronnes");
++MODULE_LICENSE("GPL");
+diff -Nur linux-3.18.8/drivers/staging/fbtft/fb_ili9340.c linux-rpi/drivers/staging/fbtft/fb_ili9340.c
+--- linux-3.18.8/drivers/staging/fbtft/fb_ili9340.c 1970-01-01 01:00:00.000000000 +0100
++++ linux-rpi/drivers/staging/fbtft/fb_ili9340.c 2015-03-05 14:40:16.341715808 +0100
+@@ -0,0 +1,163 @@
++/*
++ * FB driver for the ILI9340 LCD Controller
++ *
++ * Copyright (C) 2013 Noralf Tronnes
++ *
++ * This program is free software; you can redistribute it and/or modify
++ * it under the terms of the GNU General Public License as published by
++ * the Free Software Foundation; either version 2 of the License, or
++ * (at your option) any later version.
++ *
++ * This program is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
++ * GNU General Public License for more details.
++ *
++ * 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., 675 Mass Ave, Cambridge, MA 02139, USA.
++ */
++
++#include <linux/module.h>
++#include <linux/kernel.h>
++#include <linux/init.h>
++#include <linux/gpio.h>
++#include <linux/delay.h>
++
++#include "fbtft.h"
++
++#define DRVNAME "fb_ili9340"
++#define WIDTH 240
++#define HEIGHT 320
++
++
++/* Init sequence taken from: Arduino Library for the Adafruit 2.2" display */
++static int init_display(struct fbtft_par *par)
++{
++ fbtft_par_dbg(DEBUG_INIT_DISPLAY, par, "%s()\n", __func__);
++
++ par->fbtftops.reset(par);
++
++ write_reg(par, 0xEF, 0x03, 0x80, 0x02);
++ write_reg(par, 0xCF, 0x00 , 0XC1 , 0X30);
++ write_reg(par, 0xED, 0x64 , 0x03 , 0X12 , 0X81);
++ write_reg(par, 0xE8, 0x85 , 0x00 , 0x78);
++ write_reg(par, 0xCB, 0x39 , 0x2C , 0x00 , 0x34 , 0x02);
++ write_reg(par, 0xF7, 0x20);
++ write_reg(par, 0xEA, 0x00 , 0x00);
++
++ /* Power Control 1 */
++ write_reg(par, 0xC0, 0x23);
++
++ /* Power Control 2 */
++ write_reg(par, 0xC1, 0x10);
++
++ /* VCOM Control 1 */
++ write_reg(par, 0xC5, 0x3e, 0x28);
++
++ /* VCOM Control 2 */
++ write_reg(par, 0xC7, 0x86);
++
++ /* COLMOD: Pixel Format Set */
++ /* 16 bits/pixel */
++ write_reg(par, 0x3A, 0x55);
++
++ /* Frame Rate Control */
++ /* Division ratio = fosc, Frame Rate = 79Hz */
++ write_reg(par, 0xB1, 0x00, 0x18);
++
++ /* Display Function Control */
++ write_reg(par, 0xB6, 0x08, 0x82, 0x27);
++
++ /* Gamma Function Disable */
++ write_reg(par, 0xF2, 0x00);
++
++ /* Gamma curve selected */
++ write_reg(par, 0x26, 0x01);
++
++ /* Positive Gamma Correction */
++ write_reg(par, 0xE0,
++ 0x0F, 0x31, 0x2B, 0x0C, 0x0E, 0x08, 0x4E, 0xF1,
++ 0x37, 0x07, 0x10, 0x03, 0x0E, 0x09, 0x00);
++
++ /* Negative Gamma Correction */
++ write_reg(par, 0xE1,
++ 0x00, 0x0E, 0x14, 0x03, 0x11, 0x07, 0x31, 0xC1,
++ 0x48, 0x08, 0x0F, 0x0C, 0x31, 0x36, 0x0F);
++
++ /* Sleep OUT */
++ write_reg(par, 0x11);
++
++ mdelay(120);
++
++ /* Display ON */
++ write_reg(par, 0x29);
++
++ return 0;
++}
++
++static void set_addr_win(struct fbtft_par *par, int xs, int ys, int xe, int ye)
++{
++ fbtft_par_dbg(DEBUG_SET_ADDR_WIN, par,
++ "%s(xs=%d, ys=%d, xe=%d, ye=%d)\n", __func__, xs, ys, xe, ye);
++
++ /* Column address */
++ write_reg(par, 0x2A, xs >> 8, xs & 0xFF, xe >> 8, xe & 0xFF);
++
++ /* Row adress */
++ write_reg(par, 0x2B, ys >> 8, ys & 0xFF, ye >> 8, ye & 0xFF);
++
++ /* Memory write */
++ write_reg(par, 0x2C);
++}
++
++#define ILI9340_MADCTL_MV 0x20
++#define ILI9340_MADCTL_MX 0x40
++#define ILI9340_MADCTL_MY 0x80
++static int set_var(struct fbtft_par *par)
++{
++ u8 val;
++
++ fbtft_par_dbg(DEBUG_INIT_DISPLAY, par, "%s()\n", __func__);
++
++ switch (par->info->var.rotate) {
++ case 270:
++ val = ILI9340_MADCTL_MV;
++ break;
++ case 180:
++ val = ILI9340_MADCTL_MY;
++ break;
++ case 90:
++ val = ILI9340_MADCTL_MV | ILI9340_MADCTL_MY | ILI9340_MADCTL_MX;
++ break;
++ default:
++ val = ILI9340_MADCTL_MX;
++ break;
++ }
++ /* Memory Access Control */
++ write_reg(par, 0x36, val | (par->bgr << 3));
++
++ return 0;
++}
++
++
++static struct fbtft_display display = {
++ .regwidth = 8,
++ .width = WIDTH,
++ .height = HEIGHT,
++ .fbtftops = {
++ .init_display = init_display,
++ .set_addr_win = set_addr_win,
++ .set_var = set_var,
++ },
++};
++FBTFT_REGISTER_DRIVER(DRVNAME, "ilitek,ili9340", &display);
++
++MODULE_ALIAS("spi:" DRVNAME);
++MODULE_ALIAS("platform:" DRVNAME);
++MODULE_ALIAS("spi:ili9340");
++MODULE_ALIAS("platform:ili9340");
++
++MODULE_DESCRIPTION("FB driver for the ILI9340 LCD Controller");
++MODULE_AUTHOR("Noralf Tronnes");
++MODULE_LICENSE("GPL");
+diff -Nur linux-3.18.8/drivers/staging/fbtft/fb_ili9341.c linux-rpi/drivers/staging/fbtft/fb_ili9341.c
+--- linux-3.18.8/drivers/staging/fbtft/fb_ili9341.c 1970-01-01 01:00:00.000000000 +0100
++++ linux-rpi/drivers/staging/fbtft/fb_ili9341.c 2015-03-05 14:40:16.341715808 +0100
+@@ -0,0 +1,179 @@
++/*
++ * FB driver for the ILI9341 LCD display controller
++ *
++ * This display uses 9-bit SPI: Data/Command bit + 8 data bits
++ * For platforms that doesn't support 9-bit, the driver is capable
++ * of emulating this using 8-bit transfer.
++ * This is done by transfering eight 9-bit words in 9 bytes.
++ *
++ * Copyright (C) 2013 Christian Vogelgsang
++ * Based on adafruit22fb.c by Noralf Tronnes
++ *
++ * This program is free software; you can redistribute it and/or modify
++ * it under the terms of the GNU General Public License as published by
++ * the Free Software Foundation; either version 2 of the License, or
++ * (at your option) any later version.
++ *
++ * This program is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
++ * GNU General Public License for more details.
++ *
++ * 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., 675 Mass Ave, Cambridge, MA 02139, USA.
++ */
++
++#include <linux/module.h>
++#include <linux/kernel.h>
++#include <linux/init.h>
++#include <linux/delay.h>
++
++#include "fbtft.h"
++
++#define DRVNAME "fb_ili9341"
++#define WIDTH 240
++#define HEIGHT 320
++#define TXBUFLEN (4 * PAGE_SIZE)
++#define DEFAULT_GAMMA "1F 1A 18 0A 0F 06 45 87 32 0A 07 02 07 05 00\n" \
++ "00 25 27 05 10 09 3A 78 4D 05 18 0D 38 3A 1F"
++
++
++static int init_display(struct fbtft_par *par)
++{
++ fbtft_par_dbg(DEBUG_INIT_DISPLAY, par, "%s()\n", __func__);
++
++ par->fbtftops.reset(par);
++
++ /* startup sequence for MI0283QT-9A */
++ write_reg(par, 0x01); /* software reset */
++ mdelay(5);
++ write_reg(par, 0x28); /* display off */
++ /* --------------------------------------------------------- */
++ write_reg(par, 0xCF, 0x00, 0x83, 0x30);
++ write_reg(par, 0xED, 0x64, 0x03, 0x12, 0x81);
++ write_reg(par, 0xE8, 0x85, 0x01, 0x79);
++ write_reg(par, 0xCB, 0x39, 0X2C, 0x00, 0x34, 0x02);
++ write_reg(par, 0xF7, 0x20);
++ write_reg(par, 0xEA, 0x00, 0x00);
++ /* ------------power control-------------------------------- */
++ write_reg(par, 0xC0, 0x26);
++ write_reg(par, 0xC1, 0x11);
++ /* ------------VCOM --------- */
++ write_reg(par, 0xC5, 0x35, 0x3E);
++ write_reg(par, 0xC7, 0xBE);
++ /* ------------memory access control------------------------ */
++ write_reg(par, 0x3A, 0x55); /* 16bit pixel */
++ /* ------------frame rate----------------------------------- */
++ write_reg(par, 0xB1, 0x00, 0x1B);
++ /* ------------Gamma---------------------------------------- */
++ /* write_reg(par, 0xF2, 0x08); */ /* Gamma Function Disable */
++ write_reg(par, 0x26, 0x01);
++ /* ------------display-------------------------------------- */
++ write_reg(par, 0xB7, 0x07); /* entry mode set */
++ write_reg(par, 0xB6, 0x0A, 0x82, 0x27, 0x00);
++ write_reg(par, 0x11); /* sleep out */
++ mdelay(100);
++ write_reg(par, 0x29); /* display on */
++ mdelay(20);
++
++ return 0;
++}
++
++static void set_addr_win(struct fbtft_par *par, int xs, int ys, int xe, int ye)
++{
++ fbtft_par_dbg(DEBUG_SET_ADDR_WIN, par,
++ "%s(xs=%d, ys=%d, xe=%d, ye=%d)\n", __func__, xs, ys, xe, ye);
++
++ /* Column address set */
++ write_reg(par, 0x2A,
++ (xs >> 8) & 0xFF, xs & 0xFF, (xe >> 8) & 0xFF, xe & 0xFF);
++
++ /* Row adress set */
++ write_reg(par, 0x2B,
++ (ys >> 8) & 0xFF, ys & 0xFF, (ye >> 8) & 0xFF, ye & 0xFF);
++
++ /* Memory write */
++ write_reg(par, 0x2C);
++}
++
++#define MEM_Y (7) /* MY row address order */
++#define MEM_X (6) /* MX column address order */
++#define MEM_V (5) /* MV row / column exchange */
++#define MEM_L (4) /* ML vertical refresh order */
++#define MEM_H (2) /* MH horizontal refresh order */
++#define MEM_BGR (3) /* RGB-BGR Order */
++static int set_var(struct fbtft_par *par)
++{
++ fbtft_par_dbg(DEBUG_INIT_DISPLAY, par, "%s()\n", __func__);
++
++ switch (par->info->var.rotate) {
++ case 0:
++ write_reg(par, 0x36, (1 << MEM_X) | (par->bgr << MEM_BGR));
++ break;
++ case 270:
++ write_reg(par, 0x36,
++ (1<<MEM_V) | (1 << MEM_L) | (par->bgr << MEM_BGR));
++ break;
++ case 180:
++ write_reg(par, 0x36, (1 << MEM_Y) | (par->bgr << MEM_BGR));
++ break;
++ case 90:
++ write_reg(par, 0x36, (1 << MEM_Y) | (1 << MEM_X) |
++ (1 << MEM_V) | (par->bgr << MEM_BGR));
++ break;
++ }
++
++ return 0;
++}
++
++/*
++ Gamma string format:
++ Positive: Par1 Par2 [...] Par15
++ Negative: Par1 Par2 [...] Par15
++*/
++#define CURVE(num, idx) curves[num*par->gamma.num_values + idx]
++static int set_gamma(struct fbtft_par *par, unsigned long *curves)
++{
++ int i;
++
++ fbtft_par_dbg(DEBUG_INIT_DISPLAY, par, "%s()\n", __func__);
++
++ for (i = 0; i < par->gamma.num_curves; i++)
++ write_reg(par, 0xE0 + i,
++ CURVE(i, 0), CURVE(i, 1), CURVE(i, 2),
++ CURVE(i, 3), CURVE(i, 4), CURVE(i, 5),
++ CURVE(i, 6), CURVE(i, 7), CURVE(i, 8),
++ CURVE(i, 9), CURVE(i, 10), CURVE(i, 11),
++ CURVE(i, 12), CURVE(i, 13), CURVE(i, 14));
++
++ return 0;
++}
++#undef CURVE
++
++
++static struct fbtft_display display = {
++ .regwidth = 8,
++ .width = WIDTH,
++ .height = HEIGHT,
++ .txbuflen = TXBUFLEN,
++ .gamma_num = 2,
++ .gamma_len = 15,
++ .gamma = DEFAULT_GAMMA,
++ .fbtftops = {
++ .init_display = init_display,
++ .set_addr_win = set_addr_win,
++ .set_var = set_var,
++ .set_gamma = set_gamma,
++ },
++};
++FBTFT_REGISTER_DRIVER(DRVNAME, "ilitek,ili9341", &display);
++
++MODULE_ALIAS("spi:" DRVNAME);
++MODULE_ALIAS("platform:" DRVNAME);
++MODULE_ALIAS("spi:ili9341");
++MODULE_ALIAS("platform:ili9341");
++
++MODULE_DESCRIPTION("FB driver for the ILI9341 LCD display controller");
++MODULE_AUTHOR("Christian Vogelgsang");
++MODULE_LICENSE("GPL");
+diff -Nur linux-3.18.8/drivers/staging/fbtft/fb_ili9481.c linux-rpi/drivers/staging/fbtft/fb_ili9481.c
+--- linux-3.18.8/drivers/staging/fbtft/fb_ili9481.c 1970-01-01 01:00:00.000000000 +0100
++++ linux-rpi/drivers/staging/fbtft/fb_ili9481.c 2015-03-05 14:40:16.341715808 +0100
+@@ -0,0 +1,117 @@
++/*
++ * FB driver for the ILI9481 LCD Controller
++ *
++ * Copyright (c) 2014 Petr Olivka
++ * Copyright (c) 2013 Noralf Tronnes
++ *
++ * This program is free software; you can redistribute it and/or modify
++ * it under the terms of the GNU General Public License as published by
++ * the Free Software Foundation; either version 2 of the License, or
++ * (at your option) any later version.
++ *
++ * This program is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
++ * GNU General Public License for more details.
++ *
++ * 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., 675 Mass Ave, Cambridge, MA 02139, USA.
++ */
++
++#include <linux/module.h>
++#include <linux/kernel.h>
++#include <linux/init.h>
++#include <linux/delay.h>
++
++#include "fbtft.h"
++
++#define DRVNAME "fb_ili9481"
++#define WIDTH 320
++#define HEIGHT 480
++
++static int default_init_sequence[] = {
++
++ /* SLP_OUT - Sleep out */
++ -1, 0x11,
++ -2, 50,
++ /* Power setting */
++ -1, 0xD0, 0x07, 0x42, 0x18,
++ /* VCOM */
++ -1, 0xD1, 0x00, 0x07, 0x10,
++ /* Power setting for norm. mode */
++ -1, 0xD2, 0x01, 0x02,
++ /* Panel driving setting */
++ -1, 0xC0, 0x10, 0x3B, 0x00, 0x02, 0x11,
++ /* Frame rate & inv. */
++ -1, 0xC5, 0x03,
++ /* Pixel format */
++ -1, 0x3A, 0x55,
++ /* Gamma */
++ -1, 0xC8, 0x00, 0x32, 0x36, 0x45, 0x06, 0x16,
++ 0x37, 0x75, 0x77, 0x54, 0x0C, 0x00,
++ /* DISP_ON */
++ -1, 0x29,
++ -3
++};
++
++static void set_addr_win(struct fbtft_par *par, int xs, int ys, int xe, int ye)
++{
++ fbtft_par_dbg(DEBUG_SET_ADDR_WIN, par,
++ "%s(xs=%d, ys=%d, xe=%d, ye=%d)\n", __func__, xs, ys, xe, ye);
++
++ /* column address */
++ write_reg(par, 0x2a, xs >> 8, xs & 0xff, xe >> 8, xe & 0xff);
++
++ /* row adress */
++ write_reg(par, 0x2b, ys >> 8, ys & 0xff, ye >> 8, ye & 0xff);
++
++ /* memory write */
++ write_reg(par, 0x2c);
++}
++
++#define HFLIP 0x01
++#define VFLIP 0x02
++#define ROWxCOL 0x20
++static int set_var(struct fbtft_par *par)
++{
++ fbtft_par_dbg(DEBUG_INIT_DISPLAY, par, "%s()\n", __func__);
++
++ switch (par->info->var.rotate) {
++ case 270:
++ write_reg(par, 0x36, ROWxCOL | HFLIP | VFLIP | (par->bgr << 3));
++ break;
++ case 180:
++ write_reg(par, 0x36, VFLIP | (par->bgr << 3));
++ break;
++ case 90:
++ write_reg(par, 0x36, ROWxCOL | (par->bgr << 3));
++ break;
++ default:
++ write_reg(par, 0x36, HFLIP | (par->bgr << 3));
++ break;
++ }
++
++ return 0;
++}
++
++static struct fbtft_display display = {
++ .regwidth = 8,
++ .width = WIDTH,
++ .height = HEIGHT,
++ .init_sequence = default_init_sequence,
++ .fbtftops = {
++ .set_addr_win = set_addr_win,
++ .set_var = set_var,
++ },
++};
++FBTFT_REGISTER_DRIVER(DRVNAME, "ilitek,ili9481", &display);
++
++MODULE_ALIAS("spi:" DRVNAME);
++MODULE_ALIAS("platform:" DRVNAME);
++MODULE_ALIAS("spi:ili9481");
++MODULE_ALIAS("platform:ili9481");
++
++MODULE_DESCRIPTION("FB driver for the ILI9481 LCD Controller");
++MODULE_AUTHOR("Petr Olivka");
++MODULE_LICENSE("GPL");
+diff -Nur linux-3.18.8/drivers/staging/fbtft/fb_ili9486.c linux-rpi/drivers/staging/fbtft/fb_ili9486.c
+--- linux-3.18.8/drivers/staging/fbtft/fb_ili9486.c 1970-01-01 01:00:00.000000000 +0100
++++ linux-rpi/drivers/staging/fbtft/fb_ili9486.c 2015-03-05 14:40:16.341715808 +0100
+@@ -0,0 +1,121 @@
++/*
++ * FB driver for the ILI9486 LCD Controller
++ *
++ * Copyright (C) 2014 Noralf Tronnes
++ *
++ * This program is free software; you can redistribute it and/or modify
++ * it under the terms of the GNU General Public License as published by
++ * the Free Software Foundation; either version 2 of the License, or
++ * (at your option) any later version.
++ *
++ * This program is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
++ * GNU General Public License for more details.
++ *
++ * 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., 675 Mass Ave, Cambridge, MA 02139, USA.
++ */
++
++#include <linux/module.h>
++#include <linux/kernel.h>
++#include <linux/init.h>
++
++#include "fbtft.h"
++
++#define DRVNAME "fb_ili9486"
++#define WIDTH 320
++#define HEIGHT 480
++
++
++/* this init sequence matches PiScreen */
++static int default_init_sequence[] = {
++ /* Interface Mode Control */
++ -1, 0xb0, 0x0,
++ /* Sleep OUT */
++ -1, 0x11,
++ -2, 250,
++ /* Interface Pixel Format */
++ -1, 0x3A, 0x55,
++ /* Power Control 3 */
++ -1, 0xC2, 0x44,
++ /* VCOM Control 1 */
++ -1, 0xC5, 0x00, 0x00, 0x00, 0x00,
++ /* PGAMCTRL(Positive Gamma Control) */
++ -1, 0xE0, 0x0F, 0x1F, 0x1C, 0x0C, 0x0F, 0x08, 0x48, 0x98,
++ 0x37, 0x0A, 0x13, 0x04, 0x11, 0x0D, 0x00,
++ /* NGAMCTRL(Negative Gamma Control) */
++ -1, 0xE1, 0x0F, 0x32, 0x2E, 0x0B, 0x0D, 0x05, 0x47, 0x75,
++ 0x37, 0x06, 0x10, 0x03, 0x24, 0x20, 0x00,
++ /* Digital Gamma Control 1 */
++ -1, 0xE2, 0x0F, 0x32, 0x2E, 0x0B, 0x0D, 0x05, 0x47, 0x75,
++ 0x37, 0x06, 0x10, 0x03, 0x24, 0x20, 0x00,
++ /* Sleep OUT */
++ -1, 0x11,
++ /* Display ON */
++ -1, 0x29,
++ /* end marker */
++ -3
++};
++
++static void set_addr_win(struct fbtft_par *par, int xs, int ys, int xe, int ye)
++{
++ fbtft_par_dbg(DEBUG_SET_ADDR_WIN, par,
++ "%s(xs=%d, ys=%d, xe=%d, ye=%d)\n", __func__, xs, ys, xe, ye);
++
++ /* Column address */
++ write_reg(par, 0x2A, xs >> 8, xs & 0xFF, xe >> 8, xe & 0xFF);
++
++ /* Row adress */
++ write_reg(par, 0x2B, ys >> 8, ys & 0xFF, ye >> 8, ye & 0xFF);
++
++ /* Memory write */
++ write_reg(par, 0x2C);
++}
++
++static int set_var(struct fbtft_par *par)
++{
++ fbtft_par_dbg(DEBUG_INIT_DISPLAY, par, "%s()\n", __func__);
++
++ switch (par->info->var.rotate) {
++ case 0:
++ write_reg(par, 0x36, 0x80 | (par->bgr << 3));
++ break;
++ case 90:
++ write_reg(par, 0x36, 0x20 | (par->bgr << 3));
++ break;
++ case 180:
++ write_reg(par, 0x36, 0x40 | (par->bgr << 3));
++ break;
++ case 270:
++ write_reg(par, 0x36, 0xE0 | (par->bgr << 3));
++ break;
++ default:
++ break;
++ }
++
++ return 0;
++}
++
++
++static struct fbtft_display display = {
++ .regwidth = 8,
++ .width = WIDTH,
++ .height = HEIGHT,
++ .init_sequence = default_init_sequence,
++ .fbtftops = {
++ .set_addr_win = set_addr_win,
++ .set_var = set_var,
++ },
++};
++FBTFT_REGISTER_DRIVER(DRVNAME, "ilitek,ili9486", &display);
++
++MODULE_ALIAS("spi:" DRVNAME);
++MODULE_ALIAS("platform:" DRVNAME);
++MODULE_ALIAS("spi:ili9486");
++MODULE_ALIAS("platform:ili9486");
++
++MODULE_DESCRIPTION("FB driver for the ILI9486 LCD Controller");
++MODULE_AUTHOR("Noralf Tronnes");
++MODULE_LICENSE("GPL");
+diff -Nur linux-3.18.8/drivers/staging/fbtft/fb_pcd8544.c linux-rpi/drivers/staging/fbtft/fb_pcd8544.c
+--- linux-3.18.8/drivers/staging/fbtft/fb_pcd8544.c 1970-01-01 01:00:00.000000000 +0100
++++ linux-rpi/drivers/staging/fbtft/fb_pcd8544.c 2015-03-05 14:40:16.341715808 +0100
+@@ -0,0 +1,177 @@
++/*
++ * FB driver for the PCD8544 LCD Controller
++ *
++ * The display is monochrome and the video memory is RGB565.
++ * Any pixel value except 0 turns the pixel on.
++ *
++ * Copyright (C) 2013 Noralf Tronnes
++ *
++ * This program is free software; you can redistribute it and/or modify
++ * it under the terms of the GNU General Public License as published by
++ * the Free Software Foundation; either version 2 of the License, or
++ * (at your option) any later version.
++ *
++ * This program is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
++ * GNU General Public License for more details.
++ *
++ * 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., 675 Mass Ave, Cambridge, MA 02139, USA.
++ */
++
++#include <linux/module.h>
++#include <linux/kernel.h>
++#include <linux/init.h>
++#include <linux/gpio.h>
++#include <linux/spi/spi.h>
++#include <linux/delay.h>
++
++#include "fbtft.h"
++
++#define DRVNAME "fb_pcd8544"
++#define WIDTH 84
++#define HEIGHT 48
++#define TXBUFLEN (84*6)
++#define DEFAULT_GAMMA "40" /* gamma is used to control contrast in this driver */
++
++static unsigned tc;
++module_param(tc, uint, 0);
++MODULE_PARM_DESC(tc, "TC[1:0] Temperature coefficient: 0-3 (default: 0)");
++
++static unsigned bs = 4;
++module_param(bs, uint, 0);
++MODULE_PARM_DESC(bs, "BS[2:0] Bias voltage level: 0-7 (default: 4)");
++
++
++static int init_display(struct fbtft_par *par)
++{
++ fbtft_par_dbg(DEBUG_INIT_DISPLAY, par, "%s()\n", __func__);
++
++ par->fbtftops.reset(par);
++
++ /* Function set */
++ write_reg(par, 0x21); /* 5:1 1
++ 2:0 PD - Powerdown control: chip is active
++ 1:0 V - Entry mode: horizontal addressing
++ 0:1 H - Extended instruction set control: extended
++ */
++
++ /* H=1 Temperature control */
++ write_reg(par, 0x04 | (tc & 0x3)); /*
++ 2:1 1
++ 1:x TC1 - Temperature Coefficient: 0x10
++ 0:x TC0
++ */
++
++ /* H=1 Bias system */
++ write_reg(par, 0x10 | (bs & 0x7)); /*
++ 4:1 1
++ 3:0 0
++ 2:x BS2 - Bias System
++ 1:x BS1
++ 0:x BS0
++ */
++
++ /* Function set */
++ write_reg(par, 0x22); /* 5:1 1
++ 2:0 PD - Powerdown control: chip is active
++ 1:1 V - Entry mode: vertical addressing
++ 0:0 H - Extended instruction set control: basic
++ */
++
++ /* H=0 Display control */
++ write_reg(par, 0x08 | 4); /*
++ 3:1 1
++ 2:1 D - DE: 10=normal mode
++ 1:0 0
++ 0:0 E
++ */
++
++ return 0;
++}
++
++static void set_addr_win(struct fbtft_par *par, int xs, int ys, int xe, int ye)
++{
++ fbtft_par_dbg(DEBUG_SET_ADDR_WIN, par, "%s(xs=%d, ys=%d, xe=%d, ye=%d)\n", __func__, xs, ys, xe, ye);
++
++ /* H=0 Set X address of RAM */
++ write_reg(par, 0x80); /* 7:1 1
++ 6-0: X[6:0] - 0x00
++ */
++
++ /* H=0 Set Y address of RAM */
++ write_reg(par, 0x40); /* 7:0 0
++ 6:1 1
++ 2-0: Y[2:0] - 0x0
++ */
++}
++
++static int write_vmem(struct fbtft_par *par, size_t offset, size_t len)
++{
++ u16 *vmem16 = (u16 *)par->info->screen_base;
++ u8 *buf = par->txbuf.buf;
++ int x, y, i;
++ int ret = 0;
++
++ fbtft_par_dbg(DEBUG_WRITE_VMEM, par, "%s()\n", __func__);
++
++ for (x = 0; x < 84; x++) {
++ for (y = 0; y < 6; y++) {
++ *buf = 0x00;
++ for (i = 0; i < 8; i++) {
++ *buf |= (vmem16[(y*8+i)*84+x] ? 1 : 0) << i;
++ }
++ buf++;
++ }
++ }
++
++ /* Write data */
++ gpio_set_value(par->gpio.dc, 1);
++ ret = par->fbtftops.write(par, par->txbuf.buf, 6*84);
++ if (ret < 0)
++ dev_err(par->info->device, "%s: write failed and returned: %d\n", __func__, ret);
++
++ return ret;
++}
++
++static int set_gamma(struct fbtft_par *par, unsigned long *curves)
++{
++ fbtft_par_dbg(DEBUG_INIT_DISPLAY, par, "%s()\n", __func__);
++
++ /* apply mask */
++ curves[0] &= 0x7F;
++
++ write_reg(par, 0x23); /* turn on extended instruction set */
++ write_reg(par, 0x80 | curves[0]);
++ write_reg(par, 0x22); /* turn off extended instruction set */
++
++ return 0;
++}
++
++
++static struct fbtft_display display = {
++ .regwidth = 8,
++ .width = WIDTH,
++ .height = HEIGHT,
++ .txbuflen = TXBUFLEN,
++ .gamma_num = 1,
++ .gamma_len = 1,
++ .gamma = DEFAULT_GAMMA,
++ .fbtftops = {
++ .init_display = init_display,
++ .set_addr_win = set_addr_win,
++ .write_vmem = write_vmem,
++ .set_gamma = set_gamma,
++ },
++ .backlight = 1,
++};
++FBTFT_REGISTER_DRIVER(DRVNAME, "philips,pdc8544", &display);
++
++MODULE_ALIAS("spi:" DRVNAME);
++MODULE_ALIAS("spi:pdc8544");
++
++MODULE_DESCRIPTION("FB driver for the PCD8544 LCD Controller");
++MODULE_AUTHOR("Noralf Tronnes");
++MODULE_LICENSE("GPL");
+diff -Nur linux-3.18.8/drivers/staging/fbtft/fb_ra8875.c linux-rpi/drivers/staging/fbtft/fb_ra8875.c
+--- linux-3.18.8/drivers/staging/fbtft/fb_ra8875.c 1970-01-01 01:00:00.000000000 +0100
++++ linux-rpi/drivers/staging/fbtft/fb_ra8875.c 2015-03-05 14:40:16.341715808 +0100
+@@ -0,0 +1,331 @@
++/******************************************************************************
++
++ ProjectName: FBTFT driver ***** *****
++ for the RA8875 LCD Controller * * ************
++ * ** ** * *
++ Copyright © by Pf@nne & NOTRO * * * * * **** *
++ * * * * * * *
++ Last modification by: * * * * **** *
++ - Pf@nne (pf@nne-mail.de) * * ***** *
++ * * * *******
++ ***** * *
++ Date : 10.06.2014 * *
++ Version : V1.13 *****
++ Revison : 5
++
++*******************************************************************************
++ * This program is free software; you can redistribute it and/or modify
++ * it under the terms of the GNU General Public License as published by
++ * the Free Software Foundation; either version 2 of the License, or
++ * (at your option) any later version.
++ *
++ * This program is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
++ * GNU General Public License for more details.
++ *
++ * 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., 675 Mass Ave, Cambridge, MA 02139, USA.
++ */
++
++#include <linux/module.h>
++#include <linux/kernel.h>
++#include <linux/init.h>
++#include <linux/delay.h>
++
++#include <linux/gpio.h>
++#include "fbtft.h"
++
++#define DRVNAME "fb_ra8875"
++
++static int write_spi(struct fbtft_par *par, void *buf, size_t len)
++{
++ struct spi_transfer t = {
++ .tx_buf = buf,
++ .len = len,
++ .speed_hz = 1000000,
++ };
++ struct spi_message m;
++
++ fbtft_par_dbg_hex(DEBUG_WRITE, par, par->info->device, u8, buf, len,
++ "%s(len=%d): ", __func__, len);
++
++ if (!par->spi) {
++ dev_err(par->info->device,
++ "%s: par->spi is unexpectedly NULL\n", __func__);
++ return -1;
++ }
++
++ spi_message_init(&m);
++ if (par->txbuf.dma && buf == par->txbuf.buf) {
++ t.tx_dma = par->txbuf.dma;
++ m.is_dma_mapped = 1;
++ }
++ spi_message_add_tail(&t, &m);
++ return spi_sync(par->spi, &m);
++}
++
++static int init_display(struct fbtft_par *par)
++{
++ gpio_set_value(par->gpio.dc, 1);
++
++ fbtft_par_dbg(DEBUG_INIT_DISPLAY, par,
++ "%s()\n", __func__);
++ fbtft_par_dbg(DEBUG_INIT_DISPLAY, par,
++ "display size %dx%d\n", par->info->var.xres, par->info->var.yres);
++
++ par->fbtftops.reset(par);
++
++ if ((par->info->var.xres == 320) && (par->info->var.yres == 240)) {
++ /* PLL clock frequency */
++ write_reg(par, 0x88 , 0x0A);
++ write_reg(par, 0x89 , 0x02);
++ mdelay(10);
++ /* color deep / MCU Interface */
++ write_reg(par, 0x10 , 0x0C);
++ /* pixel clock period */
++ write_reg(par, 0x04 , 0x03);
++ mdelay(1);
++ /* horizontal settings */
++ write_reg(par, 0x14 , 0x27);
++ write_reg(par, 0x15 , 0x00);
++ write_reg(par, 0x16 , 0x05);
++ write_reg(par, 0x17 , 0x04);
++ write_reg(par, 0x18 , 0x03);
++ /* vertical settings */
++ write_reg(par, 0x19 , 0xEF);
++ write_reg(par, 0x1A , 0x00);
++ write_reg(par, 0x1B , 0x05);
++ write_reg(par, 0x1C , 0x00);
++ write_reg(par, 0x1D , 0x0E);
++ write_reg(par, 0x1E , 0x00);
++ write_reg(par, 0x1F , 0x02);
++ } else if ((par->info->var.xres == 480) && (par->info->var.yres == 272)) {
++ /* PLL clock frequency */
++ write_reg(par, 0x88 , 0x0A);
++ write_reg(par, 0x89 , 0x02);
++ mdelay(10);
++ /* color deep / MCU Interface */
++ write_reg(par, 0x10 , 0x0C);
++ /* pixel clock period */
++ write_reg(par, 0x04 , 0x82);
++ mdelay(1);
++ /* horizontal settings */
++ write_reg(par, 0x14 , 0x3B);
++ write_reg(par, 0x15 , 0x00);
++ write_reg(par, 0x16 , 0x01);
++ write_reg(par, 0x17 , 0x00);
++ write_reg(par, 0x18 , 0x05);
++ /* vertical settings */
++ write_reg(par, 0x19 , 0x0F);
++ write_reg(par, 0x1A , 0x01);
++ write_reg(par, 0x1B , 0x02);
++ write_reg(par, 0x1C , 0x00);
++ write_reg(par, 0x1D , 0x07);
++ write_reg(par, 0x1E , 0x00);
++ write_reg(par, 0x1F , 0x09);
++ } else if ((par->info->var.xres == 640) && (par->info->var.yres == 480)) {
++ /* PLL clock frequency */
++ write_reg(par, 0x88 , 0x0B);
++ write_reg(par, 0x89 , 0x02);
++ mdelay(10);
++ /* color deep / MCU Interface */
++ write_reg(par, 0x10 , 0x0C);
++ /* pixel clock period */
++ write_reg(par, 0x04 , 0x01);
++ mdelay(1);
++ /* horizontal settings */
++ write_reg(par, 0x14 , 0x4F);
++ write_reg(par, 0x15 , 0x05);
++ write_reg(par, 0x16 , 0x0F);
++ write_reg(par, 0x17 , 0x01);
++ write_reg(par, 0x18 , 0x00);
++ /* vertical settings */
++ write_reg(par, 0x19 , 0xDF);
++ write_reg(par, 0x1A , 0x01);
++ write_reg(par, 0x1B , 0x0A);
++ write_reg(par, 0x1C , 0x00);
++ write_reg(par, 0x1D , 0x0E);
++ write_reg(par, 0x1E , 0x00);
++ write_reg(par, 0x1F , 0x01);
++ } else if ((par->info->var.xres == 800) && (par->info->var.yres == 480)) {
++ /* PLL clock frequency */
++ write_reg(par, 0x88 , 0x0B);
++ write_reg(par, 0x89 , 0x02);
++ mdelay(10);
++ /* color deep / MCU Interface */
++ write_reg(par, 0x10 , 0x0C);
++ /* pixel clock period */
++ write_reg(par, 0x04 , 0x81);
++ mdelay(1);
++ /* horizontal settings */
++ write_reg(par, 0x14 , 0x63);
++ write_reg(par, 0x15 , 0x03);
++ write_reg(par, 0x16 , 0x03);
++ write_reg(par, 0x17 , 0x02);
++ write_reg(par, 0x18 , 0x00);
++ /* vertical settings */
++ write_reg(par, 0x19 , 0xDF);
++ write_reg(par, 0x1A , 0x01);
++ write_reg(par, 0x1B , 0x14);
++ write_reg(par, 0x1C , 0x00);
++ write_reg(par, 0x1D , 0x06);
++ write_reg(par, 0x1E , 0x00);
++ write_reg(par, 0x1F , 0x01);
++ } else {
++ dev_err(par->info->device, "display size is not supported!!");
++ return -1;
++ }
++
++ /* PWM clock */
++ write_reg(par, 0x8a , 0x81);
++ write_reg(par, 0x8b , 0xFF);
++ mdelay(10);
++
++ /* Display ON */
++ write_reg(par, 0x01 , 0x80);
++ mdelay(10);
++
++ return 0;
++}
++
++static void set_addr_win(struct fbtft_par *par, int xs, int ys, int xe, int ye)
++{
++ fbtft_par_dbg(DEBUG_SET_ADDR_WIN, par,
++ "%s(xs=%d, ys=%d, xe=%d, ye=%d)\n", __func__, xs, ys, xe, ye);
++
++ /* Set_Active_Window */
++ write_reg(par, 0x30 , xs & 0x00FF);
++ write_reg(par, 0x31 , (xs & 0xFF00) >> 8);
++ write_reg(par, 0x32 , ys & 0x00FF);
++ write_reg(par, 0x33 , (ys & 0xFF00) >> 8);
++ write_reg(par, 0x34 , (xs+xe) & 0x00FF);
++ write_reg(par, 0x35 , ((xs+xe) & 0xFF00) >> 8);
++ write_reg(par, 0x36 , (ys+ye) & 0x00FF);
++ write_reg(par, 0x37 , ((ys+ye) & 0xFF00) >> 8);
++
++ /* Set_Memory_Write_Cursor */
++ write_reg(par, 0x46, xs & 0xff);
++ write_reg(par, 0x47, (xs >> 8) & 0x03);
++ write_reg(par, 0x48, ys & 0xff);
++ write_reg(par, 0x49, (ys >> 8) & 0x01);
++
++ write_reg(par, 0x02);
++}
++
++static void write_reg8_bus8(struct fbtft_par *par, int len, ...)
++{
++ va_list args;
++ int i, ret;
++ u8 *buf = (u8 *)par->buf;
++
++ /* slow down spi-speed for writing registers */
++ par->fbtftops.write = write_spi;
++
++ if (unlikely(par->debug & DEBUG_WRITE_REGISTER)) {
++ va_start(args, len);
++ for (i = 0; i < len; i++)
++ buf[i] = (u8)va_arg(args, unsigned int);
++ va_end(args);
++ fbtft_par_dbg_hex(DEBUG_WRITE_REGISTER, par, par->info->device,
++ u8, buf, len, "%s: ", __func__);
++ }
++
++ va_start(args, len);
++ *buf++ = 0x80;
++ *buf = (u8)va_arg(args, unsigned int);
++ ret = par->fbtftops.write(par, par->buf, 2);
++ if (ret < 0) {
++ va_end(args);
++ dev_err(par->info->device, "%s: write() failed and returned %dn",
++ __func__, ret);
++ return;
++ }
++ len--;
++
++ udelay(100);
++
++ if (len) {
++ buf = (u8 *)par->buf;
++ *buf++ = 0x00;
++ i = len;
++ while (i--)
++ *buf++ = (u8)va_arg(args, unsigned int);
++
++ ret = par->fbtftops.write(par, par->buf, len + 1);
++ if (ret < 0) {
++ va_end(args);
++ dev_err(par->info->device, "%s: write() failed and returned %dn",
++ __func__, ret);
++ return;
++ }
++ }
++ va_end(args);
++
++ /* restore user spi-speed */
++ par->fbtftops.write = fbtft_write_spi;
++ udelay(100);
++}
++
++static int write_vmem16_bus8(struct fbtft_par *par, size_t offset, size_t len)
++{
++ u16 *vmem16;
++ u16 *txbuf16 = (u16 *)par->txbuf.buf;
++ size_t remain;
++ size_t to_copy;
++ size_t tx_array_size;
++ int i;
++ int ret = 0;
++ size_t startbyte_size = 0;
++
++ fbtft_par_dbg(DEBUG_WRITE_VMEM, par, "%s(offset=%zu, len=%zu)\n",
++ __func__, offset, len);
++
++ remain = len / 2;
++ vmem16 = (u16 *)(par->info->screen_base + offset);
++ tx_array_size = par->txbuf.len / 2;
++ txbuf16 = (u16 *)(par->txbuf.buf + 1);
++ tx_array_size -= 2;
++ *(u8 *)(par->txbuf.buf) = 0x00;
++ startbyte_size = 1;
++
++ while (remain) {
++ to_copy = remain > tx_array_size ? tx_array_size : remain;
++ dev_dbg(par->info->device, " to_copy=%zu, remain=%zu\n",
++ to_copy, remain - to_copy);
++
++ for (i = 0; i < to_copy; i++)
++ txbuf16[i] = cpu_to_be16(vmem16[i]);
++
++ vmem16 = vmem16 + to_copy;
++ ret = par->fbtftops.write(par, par->txbuf.buf,
++ startbyte_size + to_copy * 2);
++ if (ret < 0)
++ return ret;
++ remain -= to_copy;
++ }
++
++ return ret;
++}
++
++static struct fbtft_display display = {
++ .regwidth = 8,
++ .fbtftops = {
++ .init_display = init_display,
++ .set_addr_win = set_addr_win,
++ .write_register = write_reg8_bus8,
++ .write_vmem = write_vmem16_bus8,
++ .write = write_spi,
++ },
++};
++FBTFT_REGISTER_DRIVER(DRVNAME, "raio,ra8875", &display);
++
++MODULE_ALIAS("spi:" DRVNAME);
++MODULE_ALIAS("platform:" DRVNAME);
++MODULE_ALIAS("spi:ra8875");
++MODULE_ALIAS("platform:ra8875");
++
++MODULE_DESCRIPTION("FB driver for the RA8875 LCD Controller");
++MODULE_AUTHOR("Pf@nne");
++MODULE_LICENSE("GPL");
+diff -Nur linux-3.18.8/drivers/staging/fbtft/fb_s6d02a1.c linux-rpi/drivers/staging/fbtft/fb_s6d02a1.c
+--- linux-3.18.8/drivers/staging/fbtft/fb_s6d02a1.c 1970-01-01 01:00:00.000000000 +0100
++++ linux-rpi/drivers/staging/fbtft/fb_s6d02a1.c 2015-03-05 14:40:16.341715808 +0100
+@@ -0,0 +1,168 @@
++/*
++ * FB driver for the S6D02A1 LCD Controller
++ *
++ * Based on fb_st7735r.c by Noralf Tronnes
++ * Init code from UTFT library by Henning Karlsen
++ *
++ * This program is free software; you can redistribute it and/or modify
++ * it under the terms of the GNU General Public License as published by
++ * the Free Software Foundation; either version 2 of the License, or
++ * (at your option) any later version.
++ *
++ * This program is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
++ * GNU General Public License for more details.
++ *
++ * 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., 675 Mass Ave, Cambridge, MA 02139, USA.
++ */
++
++#include <linux/module.h>
++#include <linux/kernel.h>
++#include <linux/init.h>
++
++#include "fbtft.h"
++
++#define DRVNAME "fb_s6d02a1"
++
++static int default_init_sequence[] = {
++
++ -1, 0xf0, 0x5a, 0x5a,
++
++ -1, 0xfc, 0x5a, 0x5a,
++
++ -1, 0xfa, 0x02, 0x1f, 0x00, 0x10, 0x22, 0x30, 0x38, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, 0x3d, 0x02, 0x01,
++
++ -1, 0xfb, 0x21, 0x00, 0x02, 0x04, 0x07, 0x0a, 0x0b, 0x0c, 0x0c, 0x16, 0x1e, 0x30, 0x3f, 0x01, 0x02,
++
++ /* power setting sequence */
++ -1, 0xfd, 0x00, 0x00, 0x00, 0x17, 0x10, 0x00, 0x01, 0x01, 0x00, 0x1f, 0x1f,
++
++ -1, 0xf4, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 0x3f, 0x07, 0x00, 0x3C, 0x36, 0x00, 0x3C, 0x36, 0x00,
++
++ -1, 0xf5, 0x00, 0x70, 0x66, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x6d, 0x66, 0x06,
++
++ -1, 0xf6, 0x02, 0x00, 0x3f, 0x00, 0x00, 0x00, 0x02, 0x00, 0x06, 0x01, 0x00,
++
++ -1, 0xf2, 0x00, 0x01, 0x03, 0x08, 0x08, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x04, 0x08, 0x08,
++
++ -1, 0xf8, 0x11,
++
++ -1, 0xf7, 0xc8, 0x20, 0x00, 0x00,
++
++ -1, 0xf3, 0x00, 0x00,
++
++ -1, 0x11,
++ -2, 50,
++
++ -1, 0xf3, 0x00, 0x01,
++ -2, 50,
++ -1, 0xf3, 0x00, 0x03,
++ -2, 50,
++ -1, 0xf3, 0x00, 0x07,
++ -2, 50,
++ -1, 0xf3, 0x00, 0x0f,
++ -2, 50,
++
++ -1, 0xf4, 0x00, 0x04, 0x00, 0x00, 0x00, 0x3f, 0x3f, 0x07, 0x00, 0x3C, 0x36, 0x00, 0x3C, 0x36, 0x00,
++ -2, 50,
++
++ -1, 0xf3, 0x00, 0x1f,
++ -2, 50,
++ -1, 0xf3, 0x00, 0x7f,
++ -2, 50,
++
++ -1, 0xf3, 0x00, 0xff,
++ -2, 50,
++
++ -1, 0xfd, 0x00, 0x00, 0x00, 0x17, 0x10, 0x00, 0x00, 0x01, 0x00, 0x16, 0x16,
++
++ -1, 0xf4, 0x00, 0x09, 0x00, 0x00, 0x00, 0x3f, 0x3f, 0x07, 0x00, 0x3C, 0x36, 0x00, 0x3C, 0x36, 0x00,
++
++ /* initializing sequence */
++
++ -1, 0x36, 0x08,
++
++ -1, 0x35, 0x00,
++
++ -1, 0x3a, 0x05,
++
++ /* gamma setting sequence */
++ -1, 0x26, 0x01, /* preset gamma curves, possible values 0x01, 0x02, 0x04, 0x08 */
++
++ -2, 150,
++ -1, 0x29,
++ -1, 0x2c,
++ /* end marker */
++ -3
++
++};
++
++static void set_addr_win(struct fbtft_par *par, int xs, int ys, int xe, int ye)
++{
++ fbtft_par_dbg(DEBUG_SET_ADDR_WIN, par,
++ "%s(xs=%d, ys=%d, xe=%d, ye=%d)\n", __func__, xs, ys, xe, ye);
++
++ /* Column address */
++ write_reg(par, 0x2A, xs >> 8, xs & 0xFF, xe >> 8, xe & 0xFF);
++
++ /* Row adress */
++ write_reg(par, 0x2B, ys >> 8, ys & 0xFF, ye >> 8, ye & 0xFF);
++
++ /* Memory write */
++ write_reg(par, 0x2C);
++}
++
++#define MY (1 << 7)
++#define MX (1 << 6)
++#define MV (1 << 5)
++static int set_var(struct fbtft_par *par)
++{
++ fbtft_par_dbg(DEBUG_INIT_DISPLAY, par, "%s()\n", __func__);
++
++ /* MADCTL - Memory data access control
++ RGB/BGR:
++ 1. Mode selection pin SRGB
++ RGB H/W pin for color filter setting: 0=RGB, 1=BGR
++ 2. MADCTL RGB bit
++ RGB-BGR ORDER color filter panel: 0=RGB, 1=BGR */
++ switch (par->info->var.rotate) {
++ case 0:
++ write_reg(par, 0x36, MX | MY | (par->bgr << 3));
++ break;
++ case 270:
++ write_reg(par, 0x36, MY | MV | (par->bgr << 3));
++ break;
++ case 180:
++ write_reg(par, 0x36, (par->bgr << 3));
++ break;
++ case 90:
++ write_reg(par, 0x36, MX | MV | (par->bgr << 3));
++ break;
++ }
++
++ return 0;
++}
++
++static struct fbtft_display display = {
++ .regwidth = 8,
++ .width = 128,
++ .height = 160,
++ .init_sequence = default_init_sequence,
++ .fbtftops = {
++ .set_addr_win = set_addr_win,
++ .set_var = set_var,
++ },
++};
++FBTFT_REGISTER_DRIVER(DRVNAME, "samsung,s6d02a1", &display);
++
++MODULE_ALIAS("spi:" DRVNAME);
++MODULE_ALIAS("platform:" DRVNAME);
++MODULE_ALIAS("spi:s6d02a1");
++MODULE_ALIAS("platform:s6d02a1");
++
++MODULE_DESCRIPTION("FB driver for the S6D02A1 LCD Controller");
++MODULE_AUTHOR("WOLFGANG BUENING");
++MODULE_LICENSE("GPL");
+diff -Nur linux-3.18.8/drivers/staging/fbtft/fb_s6d1121.c linux-rpi/drivers/staging/fbtft/fb_s6d1121.c
+--- linux-3.18.8/drivers/staging/fbtft/fb_s6d1121.c 1970-01-01 01:00:00.000000000 +0100
++++ linux-rpi/drivers/staging/fbtft/fb_s6d1121.c 2015-03-05 14:40:16.341715808 +0100
+@@ -0,0 +1,208 @@
++/*
++ * FB driver for the S6D1121 LCD Controller
++ *
++ * Copyright (C) 2013 Roman Rolinsky
++ *
++ * Based on fb_ili9325.c by Noralf Tronnes
++ * Based on ili9325.c by Jeroen Domburg
++ * Init code from UTFT library by Henning Karlsen
++ *
++ * This program is free software; you can redistribute it and/or modify
++ * it under the terms of the GNU General Public License as published by
++ * the Free Software Foundation; either version 2 of the License, or
++ * (at your option) any later version.
++ *
++ * This program is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
++ * GNU General Public License for more details.
++ *
++ * 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., 675 Mass Ave, Cambridge, MA 02139, USA.
++ */
++
++#include <linux/module.h>
++#include <linux/kernel.h>
++#include <linux/init.h>
++#include <linux/gpio.h>
++#include <linux/delay.h>
++
++#include "fbtft.h"
++
++#define DRVNAME "fb_s6d1121"
++#define WIDTH 240
++#define HEIGHT 320
++#define BPP 16
++#define FPS 20
++#define DEFAULT_GAMMA "26 09 24 2C 1F 23 24 25 22 26 25 23 0D 00\n" \
++ "1C 1A 13 1D 0B 11 12 10 13 15 36 19 00 0D"
++
++static int init_display(struct fbtft_par *par)
++{
++ fbtft_par_dbg(DEBUG_INIT_DISPLAY, par, "%s()\n", __func__);
++
++ par->fbtftops.reset(par);
++
++ if (par->gpio.cs != -1)
++ gpio_set_value(par->gpio.cs, 0); /* Activate chip */
++
++ /* Initialization sequence from Lib_UTFT */
++
++ write_reg(par, 0x0011, 0x2004);
++ write_reg(par, 0x0013, 0xCC00);
++ write_reg(par, 0x0015, 0x2600);
++ write_reg(par, 0x0014, 0x252A);
++ write_reg(par, 0x0012, 0x0033);
++ write_reg(par, 0x0013, 0xCC04);
++ write_reg(par, 0x0013, 0xCC06);
++ write_reg(par, 0x0013, 0xCC4F);
++ write_reg(par, 0x0013, 0x674F);
++ write_reg(par, 0x0011, 0x2003);
++ write_reg(par, 0x0016, 0x0007);
++ write_reg(par, 0x0002, 0x0013);
++ write_reg(par, 0x0003, 0x0003);
++ write_reg(par, 0x0001, 0x0127);
++ write_reg(par, 0x0008, 0x0303);
++ write_reg(par, 0x000A, 0x000B);
++ write_reg(par, 0x000B, 0x0003);
++ write_reg(par, 0x000C, 0x0000);
++ write_reg(par, 0x0041, 0x0000);
++ write_reg(par, 0x0050, 0x0000);
++ write_reg(par, 0x0060, 0x0005);
++ write_reg(par, 0x0070, 0x000B);
++ write_reg(par, 0x0071, 0x0000);
++ write_reg(par, 0x0078, 0x0000);
++ write_reg(par, 0x007A, 0x0000);
++ write_reg(par, 0x0079, 0x0007);
++ write_reg(par, 0x0007, 0x0051);
++ write_reg(par, 0x0007, 0x0053);
++ write_reg(par, 0x0079, 0x0000);
++
++ write_reg(par, 0x0022); /* Write Data to GRAM */
++
++ return 0;
++}
++
++static void set_addr_win(struct fbtft_par *par, int xs, int ys, int xe, int ye)
++{
++ fbtft_par_dbg(DEBUG_SET_ADDR_WIN, par,
++ "%s(xs=%d, ys=%d, xe=%d, ye=%d)\n", __func__, xs, ys, xe, ye);
++ switch (par->info->var.rotate) {
++ /* R20h = Horizontal GRAM Start Address */
++ /* R21h = Vertical GRAM Start Address */
++ case 0:
++ write_reg(par, 0x0020, xs);
++ write_reg(par, 0x0021, ys);
++ break;
++ case 180:
++ write_reg(par, 0x0020, WIDTH - 1 - xs);
++ write_reg(par, 0x0021, HEIGHT - 1 - ys);
++ break;
++ case 270:
++ write_reg(par, 0x0020, WIDTH - 1 - ys);
++ write_reg(par, 0x0021, xs);
++ break;
++ case 90:
++ write_reg(par, 0x0020, ys);
++ write_reg(par, 0x0021, HEIGHT - 1 - xs);
++ break;
++ }
++ write_reg(par, 0x0022); /* Write Data to GRAM */
++}
++
++static int set_var(struct fbtft_par *par)
++{
++ fbtft_par_dbg(DEBUG_INIT_DISPLAY, par, "%s()\n", __func__);
++
++ switch (par->info->var.rotate) {
++ /* AM: GRAM update direction */
++ case 0:
++ write_reg(par, 0x03, 0x0003 | (par->bgr << 12));
++ break;
++ case 180:
++ write_reg(par, 0x03, 0x0000 | (par->bgr << 12));
++ break;
++ case 270:
++ write_reg(par, 0x03, 0x000A | (par->bgr << 12));
++ break;
++ case 90:
++ write_reg(par, 0x03, 0x0009 | (par->bgr << 12));
++ break;
++ }
++
++ return 0;
++}
++
++/*
++ Gamma string format:
++ PKP0 PKP1 PKP2 PKP3 PKP4 PKP5 PKP6 PKP7 PKP8 PKP9 PKP10 PKP11 VRP0 VRP1
++ PKN0 PKN1 PKN2 PKN3 PKN4 PKN5 PKN6 PKN7 PRN8 PRN9 PRN10 PRN11 VRN0 VRN1
++*/
++#define CURVE(num, idx) curves[num*par->gamma.num_values + idx]
++static int set_gamma(struct fbtft_par *par, unsigned long *curves)
++{
++ unsigned long mask[] = {
++ 0b111111, 0b111111, 0b111111, 0b111111, 0b111111, 0b111111,
++ 0b111111, 0b111111, 0b111111, 0b111111, 0b111111, 0b111111,
++ 0b11111, 0b11111,
++ 0b111111, 0b111111, 0b111111, 0b111111, 0b111111, 0b111111,
++ 0b111111, 0b111111, 0b111111, 0b111111, 0b111111, 0b111111,
++ 0b11111, 0b11111 };
++ int i, j;
++
++ fbtft_par_dbg(DEBUG_INIT_DISPLAY, par, "%s()\n", __func__);
++
++ /* apply mask */
++ for (i = 0; i < 2; i++)
++ for (j = 0; j < 14; j++)
++ CURVE(i, j) &= mask[i*par->gamma.num_values + j];
++
++ write_reg(par, 0x0030, CURVE(0, 1) << 8 | CURVE(0, 0));
++ write_reg(par, 0x0031, CURVE(0, 3) << 8 | CURVE(0, 2));
++ write_reg(par, 0x0032, CURVE(0, 5) << 8 | CURVE(0, 3));
++ write_reg(par, 0x0033, CURVE(0, 7) << 8 | CURVE(0, 6));
++ write_reg(par, 0x0034, CURVE(0, 9) << 8 | CURVE(0, 8));
++ write_reg(par, 0x0035, CURVE(0, 11) << 8 | CURVE(0, 10));
++
++ write_reg(par, 0x0036, CURVE(1, 1) << 8 | CURVE(1, 0));
++ write_reg(par, 0x0037, CURVE(1, 3) << 8 | CURVE(1, 2));
++ write_reg(par, 0x0038, CURVE(1, 5) << 8 | CURVE(1, 4));
++ write_reg(par, 0x0039, CURVE(1, 7) << 8 | CURVE(1, 6));
++ write_reg(par, 0x003A, CURVE(1, 9) << 8 | CURVE(1, 8));
++ write_reg(par, 0x003B, CURVE(1, 11) << 8 | CURVE(1, 10));
++
++ write_reg(par, 0x003C, CURVE(0, 13) << 8 | CURVE(0, 12));
++ write_reg(par, 0x003D, CURVE(1, 13) << 8 | CURVE(1, 12));
++
++ return 0;
++}
++#undef CURVE
++
++
++static struct fbtft_display display = {
++ .regwidth = 16,
++ .width = WIDTH,
++ .height = HEIGHT,
++ .bpp = BPP,
++ .fps = FPS,
++ .gamma_num = 2,
++ .gamma_len = 14,
++ .gamma = DEFAULT_GAMMA,
++ .fbtftops = {
++ .init_display = init_display,
++ .set_addr_win = set_addr_win,
++ .set_var = set_var,
++ .set_gamma = set_gamma,
++ },
++};
++FBTFT_REGISTER_DRIVER(DRVNAME, "samsung,s6d1121", &display);
++
++MODULE_ALIAS("spi:" DRVNAME);
++MODULE_ALIAS("platform:" DRVNAME);
++MODULE_ALIAS("spi:s6d1121");
++MODULE_ALIAS("platform:s6d1121");
++
++MODULE_DESCRIPTION("FB driver for the S6D1121 LCD Controller");
++MODULE_AUTHOR("Roman Rolinsky");
++MODULE_LICENSE("GPL");
+diff -Nur linux-3.18.8/drivers/staging/fbtft/fb_ssd1289.c linux-rpi/drivers/staging/fbtft/fb_ssd1289.c
+--- linux-3.18.8/drivers/staging/fbtft/fb_ssd1289.c 1970-01-01 01:00:00.000000000 +0100
++++ linux-rpi/drivers/staging/fbtft/fb_ssd1289.c 2015-03-05 14:40:16.341715808 +0100
+@@ -0,0 +1,206 @@
++/*
++ * FB driver for the SSD1289 LCD Controller
++ *
++ * Copyright (C) 2013 Noralf Tronnes
++ *
++ * Init sequence taken from ITDB02_Graph16.cpp - (C)2010-2011 Henning Karlsen
++ *
++ * This program is free software; you can redistribute it and/or modify
++ * it under the terms of the GNU General Public License as published by
++ * the Free Software Foundation; either version 2 of the License, or
++ * (at your option) any later version.
++ *
++ * This program is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
++ * GNU General Public License for more details.
++ *
++ * 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., 675 Mass Ave, Cambridge, MA 02139, USA.
++ */
++
++#include <linux/module.h>
++#include <linux/kernel.h>
++#include <linux/init.h>
++#include <linux/gpio.h>
++
++#include "fbtft.h"
++
++#define DRVNAME "fb_ssd1289"
++#define WIDTH 240
++#define HEIGHT 320
++#define DEFAULT_GAMMA "02 03 2 5 7 7 4 2 4 2\n" \
++ "02 03 2 5 7 5 4 2 4 2"
++
++static unsigned reg11 = 0x6040;
++module_param(reg11, uint, 0);
++MODULE_PARM_DESC(reg11, "Register 11h value");
++
++
++static int init_display(struct fbtft_par *par)
++{
++ fbtft_par_dbg(DEBUG_INIT_DISPLAY, par, "%s()\n", __func__);
++
++ par->fbtftops.reset(par);
++
++ if (par->gpio.cs != -1)
++ gpio_set_value(par->gpio.cs, 0); /* Activate chip */
++
++ write_reg(par, 0x00, 0x0001);
++ write_reg(par, 0x03, 0xA8A4);
++ write_reg(par, 0x0C, 0x0000);
++ write_reg(par, 0x0D, 0x080C);
++ write_reg(par, 0x0E, 0x2B00);
++ write_reg(par, 0x1E, 0x00B7);
++ write_reg(par, 0x01,
++ (1 << 13) | (par->bgr << 11) | (1 << 9) | (HEIGHT - 1));
++ write_reg(par, 0x02, 0x0600);
++ write_reg(par, 0x10, 0x0000);
++ write_reg(par, 0x05, 0x0000);
++ write_reg(par, 0x06, 0x0000);
++ write_reg(par, 0x16, 0xEF1C);
++ write_reg(par, 0x17, 0x0003);
++ write_reg(par, 0x07, 0x0233);
++ write_reg(par, 0x0B, 0x0000);
++ write_reg(par, 0x0F, 0x0000);
++ write_reg(par, 0x41, 0x0000);
++ write_reg(par, 0x42, 0x0000);
++ write_reg(par, 0x48, 0x0000);
++ write_reg(par, 0x49, 0x013F);
++ write_reg(par, 0x4A, 0x0000);
++ write_reg(par, 0x4B, 0x0000);
++ write_reg(par, 0x44, 0xEF00);
++ write_reg(par, 0x45, 0x0000);
++ write_reg(par, 0x46, 0x013F);
++ write_reg(par, 0x23, 0x0000);
++ write_reg(par, 0x24, 0x0000);
++ write_reg(par, 0x25, 0x8000);
++ write_reg(par, 0x4f, 0x0000);
++ write_reg(par, 0x4e, 0x0000);
++ write_reg(par, 0x22);
++ return 0;
++}
++
++static void set_addr_win(struct fbtft_par *par, int xs, int ys, int xe, int ye)
++{
++ fbtft_par_dbg(DEBUG_SET_ADDR_WIN, par,
++ "%s(xs=%d, ys=%d, xe=%d, ye=%d)\n", __func__, xs, ys, xe, ye);
++
++ switch (par->info->var.rotate) {
++ /* R4Eh - Set GDDRAM X address counter */
++ /* R4Fh - Set GDDRAM Y address counter */
++ case 0:
++ write_reg(par, 0x4e, xs);
++ write_reg(par, 0x4f, ys);
++ break;
++ case 180:
++ write_reg(par, 0x4e, par->info->var.xres - 1 - xs);
++ write_reg(par, 0x4f, par->info->var.yres - 1 - ys);
++ break;
++ case 270:
++ write_reg(par, 0x4e, par->info->var.yres - 1 - ys);
++ write_reg(par, 0x4f, xs);
++ break;
++ case 90:
++ write_reg(par, 0x4e, ys);
++ write_reg(par, 0x4f, par->info->var.xres - 1 - xs);
++ break;
++ }
++
++ /* R22h - RAM data write */
++ write_reg(par, 0x22);
++}
++
++static int set_var(struct fbtft_par *par)
++{
++ fbtft_par_dbg(DEBUG_INIT_DISPLAY, par, "%s()\n", __func__);
++
++ if (par->fbtftops.init_display != init_display) {
++ /* don't risk messing up register 11h */
++ fbtft_par_dbg(DEBUG_INIT_DISPLAY, par,
++ "%s: skipping since custom init_display() is used\n",
++ __func__);
++ return 0;
++ }
++
++ switch (par->info->var.rotate) {
++ case 0:
++ write_reg(par, 0x11, reg11 | 0b110000);
++ break;
++ case 270:
++ write_reg(par, 0x11, reg11 | 0b101000);
++ break;
++ case 180:
++ write_reg(par, 0x11, reg11 | 0b000000);
++ break;
++ case 90:
++ write_reg(par, 0x11, reg11 | 0b011000);
++ break;
++ }
++
++ return 0;
++}
++
++/*
++ Gamma string format:
++ VRP0 VRP1 PRP0 PRP1 PKP0 PKP1 PKP2 PKP3 PKP4 PKP5
++ VRN0 VRN1 PRN0 PRN1 PKN0 PKN1 PKN2 PKN3 PKN4 PKN5
++*/
++#define CURVE(num, idx) curves[num*par->gamma.num_values + idx]
++static int set_gamma(struct fbtft_par *par, unsigned long *curves)
++{
++ unsigned long mask[] = {
++ 0b11111, 0b11111, 0b111, 0b111, 0b111,
++ 0b111, 0b111, 0b111, 0b111, 0b111,
++ 0b11111, 0b11111, 0b111, 0b111, 0b111,
++ 0b111, 0b111, 0b111, 0b111, 0b111 };
++ int i, j;
++
++ fbtft_par_dbg(DEBUG_INIT_DISPLAY, par, "%s()\n", __func__);
++
++ /* apply mask */
++ for (i = 0; i < 2; i++)
++ for (j = 0; j < 10; j++)
++ CURVE(i, j) &= mask[i*par->gamma.num_values + j];
++
++ write_reg(par, 0x0030, CURVE(0, 5) << 8 | CURVE(0, 4));
++ write_reg(par, 0x0031, CURVE(0, 7) << 8 | CURVE(0, 6));
++ write_reg(par, 0x0032, CURVE(0, 9) << 8 | CURVE(0, 8));
++ write_reg(par, 0x0033, CURVE(0, 3) << 8 | CURVE(0, 2));
++ write_reg(par, 0x0034, CURVE(1, 5) << 8 | CURVE(1, 4));
++ write_reg(par, 0x0035, CURVE(1, 7) << 8 | CURVE(1, 6));
++ write_reg(par, 0x0036, CURVE(1, 9) << 8 | CURVE(1, 8));
++ write_reg(par, 0x0037, CURVE(1, 3) << 8 | CURVE(1, 2));
++ write_reg(par, 0x003A, CURVE(0, 1) << 8 | CURVE(0, 0));
++ write_reg(par, 0x003B, CURVE(1, 1) << 8 | CURVE(1, 0));
++
++ return 0;
++}
++#undef CURVE
++
++
++static struct fbtft_display display = {
++ .regwidth = 16,
++ .width = WIDTH,
++ .height = HEIGHT,
++ .gamma_num = 2,
++ .gamma_len = 10,
++ .gamma = DEFAULT_GAMMA,
++ .fbtftops = {
++ .init_display = init_display,
++ .set_addr_win = set_addr_win,
++ .set_var = set_var,
++ .set_gamma = set_gamma,
++ },
++};
++FBTFT_REGISTER_DRIVER(DRVNAME, "solomon,ssd1289", &display);
++
++MODULE_ALIAS("spi:" DRVNAME);
++MODULE_ALIAS("platform:" DRVNAME);
++MODULE_ALIAS("spi:ssd1289");
++MODULE_ALIAS("platform:ssd1289");
++
++MODULE_DESCRIPTION("FB driver for the SSD1289 LCD Controller");
++MODULE_AUTHOR("Noralf Tronnes");
++MODULE_LICENSE("GPL");
+diff -Nur linux-3.18.8/drivers/staging/fbtft/fb_ssd1306.c linux-rpi/drivers/staging/fbtft/fb_ssd1306.c
+--- linux-3.18.8/drivers/staging/fbtft/fb_ssd1306.c 1970-01-01 01:00:00.000000000 +0100
++++ linux-rpi/drivers/staging/fbtft/fb_ssd1306.c 2015-03-05 14:40:16.341715808 +0100
+@@ -0,0 +1,229 @@
++/*
++ * FB driver for the SSD1306 OLED Controller
++ *
++ * Copyright (C) 2013 Noralf Tronnes
++ *
++ * This program is free software; you can redistribute it and/or modify
++ * it under the terms of the GNU General Public License as published by
++ * the Free Software Foundation; either version 2 of the License, or
++ * (at your option) any later version.
++ *
++ * This program is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
++ * GNU General Public License for more details.
++ *
++ * 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., 675 Mass Ave, Cambridge, MA 02139, USA.
++ */
++
++#include <linux/module.h>
++#include <linux/kernel.h>
++#include <linux/init.h>
++#include <linux/gpio.h>
++#include <linux/delay.h>
++
++#include "fbtft.h"
++
++#define DRVNAME "fb_ssd1306"
++#define WIDTH 128
++#define HEIGHT 64
++
++
++/*
++ write_reg() caveat:
++
++ This doesn't work because D/C has to be LOW for both values:
++ write_reg(par, val1, val2);
++
++ Do it like this:
++ write_reg(par, val1);
++ write_reg(par, val2);
++*/
++
++/* Init sequence taken from the Adafruit SSD1306 Arduino library */
++static int init_display(struct fbtft_par *par)
++{
++ fbtft_par_dbg(DEBUG_INIT_DISPLAY, par, "%s()\n", __func__);
++
++ par->fbtftops.reset(par);
++
++ if (par->gamma.curves[0] == 0) {
++ mutex_lock(&par->gamma.lock);
++ if (par->info->var.yres == 64)
++ par->gamma.curves[0] = 0xCF;
++ else
++ par->gamma.curves[0] = 0x8F;
++ mutex_unlock(&par->gamma.lock);
++ }
++
++ /* Set Display OFF */
++ write_reg(par, 0xAE);
++
++ /* Set Display Clock Divide Ratio/ Oscillator Frequency */
++ write_reg(par, 0xD5);
++ write_reg(par, 0x80);
++
++ /* Set Multiplex Ratio */
++ write_reg(par, 0xA8);
++ if (par->info->var.yres == 64)
++ write_reg(par, 0x3F);
++ else
++ write_reg(par, 0x1F);
++
++ /* Set Display Offset */
++ write_reg(par, 0xD3);
++ write_reg(par, 0x0);
++
++ /* Set Display Start Line */
++ write_reg(par, 0x40 | 0x0);
++
++ /* Charge Pump Setting */
++ write_reg(par, 0x8D);
++ /* A[2] = 1b, Enable charge pump during display on */
++ write_reg(par, 0x14);
++
++ /* Set Memory Addressing Mode */
++ write_reg(par, 0x20);
++ /* Vertical addressing mode */
++ write_reg(par, 0x01);
++
++ /*Set Segment Re-map */
++ /* column address 127 is mapped to SEG0 */
++ write_reg(par, 0xA0 | 0x1);
++
++ /* Set COM Output Scan Direction */
++ /* remapped mode. Scan from COM[N-1] to COM0 */
++ write_reg(par, 0xC8);
++
++ /* Set COM Pins Hardware Configuration */
++ write_reg(par, 0xDA);
++ if (par->info->var.yres == 64)
++ /* A[4]=1b, Alternative COM pin configuration */
++ write_reg(par, 0x12);
++ else
++ /* A[4]=0b, Sequential COM pin configuration */
++ write_reg(par, 0x02);
++
++ /* Set Pre-charge Period */
++ write_reg(par, 0xD9);
++ write_reg(par, 0xF1);
++
++ /* Set VCOMH Deselect Level */
++ write_reg(par, 0xDB);
++ /* according to the datasheet, this value is out of bounds */
++ write_reg(par, 0x40);
++
++ /* Entire Display ON */
++ /* Resume to RAM content display. Output follows RAM content */
++ write_reg(par, 0xA4);
++
++ /* Set Normal Display
++ 0 in RAM: OFF in display panel
++ 1 in RAM: ON in display panel */
++ write_reg(par, 0xA6);
++
++ /* Set Display ON */
++ write_reg(par, 0xAF);
++
++ return 0;
++}
++
++static void set_addr_win(struct fbtft_par *par, int xs, int ys, int xe, int ye)
++{
++ fbtft_par_dbg(DEBUG_SET_ADDR_WIN, par,
++ "%s(xs=%d, ys=%d, xe=%d, ye=%d)\n", __func__, xs, ys, xe, ye);
++
++ /* Set Lower Column Start Address for Page Addressing Mode */
++ write_reg(par, 0x00 | 0x0);
++ /* Set Higher Column Start Address for Page Addressing Mode */
++ write_reg(par, 0x10 | 0x0);
++ /* Set Display Start Line */
++ write_reg(par, 0x40 | 0x0);
++}
++
++static int blank(struct fbtft_par *par, bool on)
++{
++ fbtft_par_dbg(DEBUG_BLANK, par, "%s(blank=%s)\n",
++ __func__, on ? "true" : "false");
++
++ if (on)
++ write_reg(par, 0xAE);
++ else
++ write_reg(par, 0xAF);
++ return 0;
++}
++
++/* Gamma is used to control Contrast */
++static int set_gamma(struct fbtft_par *par, unsigned long *curves)
++{
++ fbtft_par_dbg(DEBUG_INIT_DISPLAY, par, "%s()\n", __func__);
++
++ /* apply mask */
++ curves[0] &= 0xFF;
++
++ /* Set Contrast Control for BANK0 */
++ write_reg(par, 0x81);
++ write_reg(par, curves[0]);
++
++ return 0;
++}
++
++static int write_vmem(struct fbtft_par *par, size_t offset, size_t len)
++{
++ u16 *vmem16 = (u16 *)par->info->screen_base;
++ u8 *buf = par->txbuf.buf;
++ int x, y, i;
++ int ret = 0;
++
++ fbtft_par_dbg(DEBUG_WRITE_VMEM, par, "%s()\n", __func__);
++
++ for (x = 0; x < par->info->var.xres; x++) {
++ for (y = 0; y < par->info->var.yres/8; y++) {
++ *buf = 0x00;
++ for (i = 0; i < 8; i++)
++ *buf |= (vmem16[(y*8+i)*par->info->var.xres+x] ? 1 : 0) << i;
++ buf++;
++ }
++ }
++
++ /* Write data */
++ gpio_set_value(par->gpio.dc, 1);
++ ret = par->fbtftops.write(par, par->txbuf.buf,
++ par->info->var.xres*par->info->var.yres/8);
++ if (ret < 0)
++ dev_err(par->info->device,
++ "%s: write failed and returned: %d\n", __func__, ret);
++
++ return ret;
++}
++
++
++static struct fbtft_display display = {
++ .regwidth = 8,
++ .width = WIDTH,
++ .height = HEIGHT,
++ .gamma_num = 1,
++ .gamma_len = 1,
++ .gamma = "00",
++ .fbtftops = {
++ .write_vmem = write_vmem,
++ .init_display = init_display,
++ .set_addr_win = set_addr_win,
++ .blank = blank,
++ .set_gamma = set_gamma,
++ },
++};
++
++
++FBTFT_REGISTER_DRIVER(DRVNAME, "solomon,ssd1306", &display);
++
++MODULE_ALIAS("spi:" DRVNAME);
++MODULE_ALIAS("platform:" DRVNAME);
++MODULE_ALIAS("spi:ssd1306");
++MODULE_ALIAS("platform:ssd1306");
++
++MODULE_DESCRIPTION("SSD1306 OLED Driver");
++MODULE_AUTHOR("Noralf Tronnes");
++MODULE_LICENSE("GPL");
+diff -Nur linux-3.18.8/drivers/staging/fbtft/fb_ssd1331.c linux-rpi/drivers/staging/fbtft/fb_ssd1331.c
+--- linux-3.18.8/drivers/staging/fbtft/fb_ssd1331.c 1970-01-01 01:00:00.000000000 +0100
++++ linux-rpi/drivers/staging/fbtft/fb_ssd1331.c 2015-03-05 14:40:16.345715808 +0100
+@@ -0,0 +1,205 @@
++#include <linux/module.h>
++#include <linux/kernel.h>
++#include <linux/init.h>
++#include <linux/gpio.h>
++#include <linux/spi/spi.h>
++#include <linux/delay.h>
++
++#include "fbtft.h"
++
++#define DRVNAME "fb_ssd1331"
++#define WIDTH 96
++#define HEIGHT 64
++#define GAMMA_NUM 1
++#define GAMMA_LEN 63
++#define DEFAULT_GAMMA "0 2 2 2 2 2 2 2 " \
++ "2 2 2 2 2 2 2 2 " \
++ "2 2 2 2 2 2 2 2 " \
++ "2 2 2 2 2 2 2 2 " \
++ "2 2 2 2 2 2 2 2 " \
++ "2 2 2 2 2 2 2 2 " \
++ "2 2 2 2 2 2 2 2 " \
++ "2 2 2 2 2 2 2" \
++
++static int init_display(struct fbtft_par *par)
++{
++ fbtft_par_dbg(DEBUG_INIT_DISPLAY, par, "%s()\n", __func__);
++
++ par->fbtftops.reset(par);
++
++ write_reg(par, 0xae); /* Display Off */
++ write_reg(par, 0xa0, 0x70 | (par->bgr << 2)); /* Set Colour Depth */
++ write_reg(par, 0x72); // RGB colour
++ write_reg(par, 0xa1, 0x00); /* Set Display Start Line */
++ write_reg(par, 0xa2, 0x00); /* Set Display Offset */
++ write_reg(par, 0xa4); /* NORMALDISPLAY */
++ write_reg(par, 0xa8, 0x3f); // Set multiplex
++ write_reg(par, 0xad, 0x8e); // Set master
++ // write_reg(par, 0xb0, 0x0b); // Set power mode
++ write_reg(par, 0xb1, 0x31); // Precharge
++ write_reg(par, 0xb3, 0xf0); // Clock div
++ write_reg(par, 0x8a, 0x64); // Precharge A
++ write_reg(par, 0x8b, 0x78); // Precharge B
++ write_reg(par, 0x8c, 0x64); // Precharge C
++ write_reg(par, 0xbb, 0x3a); // Precharge level
++ write_reg(par, 0xbe, 0x3e); // vcomh
++ write_reg(par, 0x87, 0x06); // Master current
++ write_reg(par, 0x81, 0x91); // Contrast A
++ write_reg(par, 0x82, 0x50); // Contrast B
++ write_reg(par, 0x83, 0x7d); // Contrast C
++ write_reg(par, 0xaf); /* Set Sleep Mode Display On */
++
++ return 0;
++}
++
++static void set_addr_win(struct fbtft_par *par, int xs, int ys, int xe, int ye)
++{
++ fbtft_par_dbg(DEBUG_SET_ADDR_WIN, par,
++ "%s(xs=%d, ys=%d, xe=%d, ye=%d)\n", __func__, xs, ys, xe, ye);
++
++ write_reg(par, 0x15, xs, xe);
++ write_reg(par, 0x75, ys, ye);
++}
++
++static void write_reg8_bus8(struct fbtft_par *par, int len, ...)
++{
++ va_list args;
++ int i, ret;
++ u8 *buf = (u8 *)par->buf;
++
++ if (unlikely(par->debug & DEBUG_WRITE_REGISTER)) {
++ va_start(args, len);
++ for (i = 0; i < len; i++) {
++ buf[i] = (u8)va_arg(args, unsigned int);
++ }
++ va_end(args);
++ fbtft_par_dbg_hex(DEBUG_WRITE_REGISTER, par, par->info->device, u8, buf, len, "%s: ", __func__);
++ }
++
++ va_start(args, len);
++
++ *buf = (u8)va_arg(args, unsigned int);
++ if (par->gpio.dc != -1)
++ gpio_set_value(par->gpio.dc, 0);
++ ret = par->fbtftops.write(par, par->buf, sizeof(u8));
++ if (ret < 0) {
++ va_end(args);
++ dev_err(par->info->device, "%s: write() failed and returned %d\n", __func__, ret);
++ return;
++ }
++ len--;
++
++ if (len) {
++ i = len;
++ while (i--) {
++ *buf++ = (u8)va_arg(args, unsigned int);
++ }
++ ret = par->fbtftops.write(par, par->buf, len * (sizeof(u8)));
++ if (ret < 0) {
++ va_end(args);
++ dev_err(par->info->device, "%s: write() failed and returned %d\n", __func__, ret);
++ return;
++ }
++ }
++ if (par->gpio.dc != -1)
++ gpio_set_value(par->gpio.dc, 1);
++ va_end(args);
++}
++
++/*
++ Grayscale Lookup Table
++ GS1 - GS63
++ The driver Gamma curve contains the relative values between the entries
++ in the Lookup table.
++
++ From datasheet:
++ 8.8 Gray Scale Decoder
++
++ there are total 180 Gamma Settings (Setting 0 to Setting 180)
++ available for the Gray Scale table.
++
++ The gray scale is defined in incremental way, with reference
++ to the length of previous table entry:
++ Setting of GS1 has to be >= 0
++ Setting of GS2 has to be > Setting of GS1 +1
++ Setting of GS3 has to be > Setting of GS2 +1
++ :
++ Setting of GS63 has to be > Setting of GS62 +1
++
++
++*/
++static int set_gamma(struct fbtft_par *par, unsigned long *curves)
++{
++ unsigned long tmp[GAMMA_NUM * GAMMA_LEN];
++ int i, acc = 0;
++
++ fbtft_par_dbg(DEBUG_INIT_DISPLAY, par, "%s()\n", __func__);
++
++ for (i = 0; i < 63; i++) {
++ if (i > 0 && curves[i] < 2) {
++ dev_err(par->info->device,
++ "Illegal value in Grayscale Lookup Table at index %d. " \
++ "Must be greater than 1\n", i);
++ return -EINVAL;
++ }
++ acc += curves[i];
++ tmp[i] = acc;
++ if (acc > 180) {
++ dev_err(par->info->device,
++ "Illegal value(s) in Grayscale Lookup Table. " \
++ "At index=%d, the accumulated value has exceeded 180\n", i);
++ return -EINVAL;
++ }
++ }
++
++ write_reg(par, 0xB8,
++ tmp[0], tmp[1], tmp[2], tmp[3], tmp[4], tmp[5], tmp[6], tmp[7],
++ tmp[8], tmp[9], tmp[10], tmp[11], tmp[12], tmp[13], tmp[14], tmp[15],
++ tmp[16], tmp[17], tmp[18], tmp[19], tmp[20], tmp[21], tmp[22], tmp[23],
++ tmp[24], tmp[25], tmp[26], tmp[27], tmp[28], tmp[29], tmp[30], tmp[31],
++ tmp[32], tmp[33], tmp[34], tmp[35], tmp[36], tmp[37], tmp[38], tmp[39],
++ tmp[40], tmp[41], tmp[42], tmp[43], tmp[44], tmp[45], tmp[46], tmp[47],
++ tmp[48], tmp[49], tmp[50], tmp[51], tmp[52], tmp[53], tmp[54], tmp[55],
++ tmp[56], tmp[57], tmp[58], tmp[59], tmp[60], tmp[61], tmp[62]);
++
++ return 0;
++}
++
++static int blank(struct fbtft_par *par, bool on)
++{
++ fbtft_par_dbg(DEBUG_BLANK, par, "%s(blank=%s)\n",
++ __func__, on ? "true" : "false");
++ if (on)
++ write_reg(par, 0xAE);
++ else
++ write_reg(par, 0xAF);
++ return 0;
++}
++
++
++static struct fbtft_display display = {
++ .regwidth = 8,
++ .width = WIDTH,
++ .height = HEIGHT,
++ .gamma_num = GAMMA_NUM,
++ .gamma_len = GAMMA_LEN,
++ .gamma = DEFAULT_GAMMA,
++ .fbtftops = {
++ .write_register = write_reg8_bus8,
++ .init_display = init_display,
++ .set_addr_win = set_addr_win,
++ .set_gamma = set_gamma,
++ .blank = blank,
++ },
++};
++
++FBTFT_REGISTER_DRIVER(DRVNAME, "solomon,ssd1331", &display);
++
++MODULE_ALIAS("spi:" DRVNAME);
++MODULE_ALIAS("platform:" DRVNAME);
++MODULE_ALIAS("spi:ssd1331");
++MODULE_ALIAS("platform:ssd1331");
++
++MODULE_DESCRIPTION("SSD1331 OLED Driver");
++MODULE_AUTHOR("Alec Smecher (adapted from SSD1351 by James Davies)");
++MODULE_LICENSE("GPL");
+diff -Nur linux-3.18.8/drivers/staging/fbtft/fb_ssd1351.c linux-rpi/drivers/staging/fbtft/fb_ssd1351.c
+--- linux-3.18.8/drivers/staging/fbtft/fb_ssd1351.c 1970-01-01 01:00:00.000000000 +0100
++++ linux-rpi/drivers/staging/fbtft/fb_ssd1351.c 2015-03-05 14:40:16.345715808 +0100
+@@ -0,0 +1,258 @@
++#include <linux/module.h>
++#include <linux/kernel.h>
++#include <linux/init.h>
++#include <linux/gpio.h>
++#include <linux/spi/spi.h>
++#include <linux/delay.h>
++
++#include "fbtft.h"
++
++#define DRVNAME "fb_ssd1351"
++#define WIDTH 128
++#define HEIGHT 128
++#define GAMMA_NUM 1
++#define GAMMA_LEN 63
++#define DEFAULT_GAMMA "0 2 2 2 2 2 2 2 " \
++ "2 2 2 2 2 2 2 2 " \
++ "2 2 2 2 2 2 2 2 " \
++ "2 2 2 2 2 2 2 2 " \
++ "2 2 2 2 2 2 2 2 " \
++ "2 2 2 2 2 2 2 2 " \
++ "2 2 2 2 2 2 2 2 " \
++ "2 2 2 2 2 2 2" \
++
++static void register_onboard_backlight(struct fbtft_par *par);
++
++static int init_display(struct fbtft_par *par)
++{
++ fbtft_par_dbg(DEBUG_INIT_DISPLAY, par, "%s()\n", __func__);
++
++ if (par->pdata
++ && par->pdata->display.backlight == FBTFT_ONBOARD_BACKLIGHT) {
++ /* module uses onboard GPIO for panel power */
++ par->fbtftops.register_backlight = register_onboard_backlight;
++ }
++
++ par->fbtftops.reset(par);
++
++ write_reg(par, 0xfd, 0x12); /* Command Lock */
++ write_reg(par, 0xfd, 0xb1); /* Command Lock */
++ write_reg(par, 0xae); /* Display Off */
++ write_reg(par, 0xb3, 0xf1); /* Front Clock Div */
++ write_reg(par, 0xca, 0x7f); /* Set Mux Ratio */
++ write_reg(par, 0x15, 0x00, 0x7f); /* Set Column Address */
++ write_reg(par, 0x75, 0x00, 0x7f); /* Set Row Address */
++ write_reg(par, 0xa1, 0x00); /* Set Display Start Line */
++ write_reg(par, 0xa2, 0x00); /* Set Display Offset */
++ write_reg(par, 0xb5, 0x00); /* Set GPIO */
++ write_reg(par, 0xab, 0x01); /* Set Function Selection */
++ write_reg(par, 0xb1, 0x32); /* Set Phase Length */
++ write_reg(par, 0xb4, 0xa0, 0xb5, 0x55); /* Set Segment Low Voltage */
++ write_reg(par, 0xbb, 0x17); /* Set Precharge Voltage */
++ write_reg(par, 0xbe, 0x05); /* Set VComH Voltage */
++ write_reg(par, 0xc1, 0xc8, 0x80, 0xc8); /* Set Contrast */
++ write_reg(par, 0xc7, 0x0f); /* Set Master Contrast */
++ write_reg(par, 0xb6, 0x01); /* Set Second Precharge Period */
++ write_reg(par, 0xa6); /* Set Display Mode Reset */
++ write_reg(par, 0xaf); /* Set Sleep Mode Display On */
++
++ return 0;
++}
++
++static void set_addr_win(struct fbtft_par *par, int xs, int ys, int xe, int ye)
++{
++ fbtft_par_dbg(DEBUG_SET_ADDR_WIN, par,
++ "%s(xs=%d, ys=%d, xe=%d, ye=%d)\n", __func__, xs, ys, xe, ye);
++
++ write_reg(par, 0x15, xs, xe);
++ write_reg(par, 0x75, ys, ye);
++ write_reg(par, 0x5c);
++}
++
++static int set_var(struct fbtft_par *par)
++{
++ unsigned remap;
++ fbtft_par_dbg(DEBUG_INIT_DISPLAY, par, "%s()\n", __func__);
++
++ if (par->fbtftops.init_display != init_display) {
++ /* don't risk messing up register A0h */
++ fbtft_par_dbg(DEBUG_INIT_DISPLAY, par,
++ "%s: skipping since custom init_display() is used\n",
++ __func__);
++ return 0;
++ }
++
++ remap = 0x60 | (par->bgr << 2); /* Set Colour Depth */
++
++ switch (par->info->var.rotate) {
++ case 0:
++ write_reg(par, 0xA0, remap | 0b00 | 1<<4);
++ break;
++ case 270:
++ write_reg(par, 0xA0, remap | 0b11 | 1<<4);
++ break;
++ case 180:
++ write_reg(par, 0xA0, remap | 0b10);
++ break;
++ case 90:
++ write_reg(par, 0xA0, remap | 0b01);
++ break;
++ }
++
++ return 0;
++}
++
++/*
++ Grayscale Lookup Table
++ GS1 - GS63
++ The driver Gamma curve contains the relative values between the entries
++ in the Lookup table.
++
++ From datasheet:
++ 8.8 Gray Scale Decoder
++
++ there are total 180 Gamma Settings (Setting 0 to Setting 180)
++ available for the Gray Scale table.
++
++ The gray scale is defined in incremental way, with reference
++ to the length of previous table entry:
++ Setting of GS1 has to be >= 0
++ Setting of GS2 has to be > Setting of GS1 +1
++ Setting of GS3 has to be > Setting of GS2 +1
++ :
++ Setting of GS63 has to be > Setting of GS62 +1
++
++
++*/
++static int set_gamma(struct fbtft_par *par, unsigned long *curves)
++{
++ unsigned long tmp[GAMMA_NUM * GAMMA_LEN];
++ int i, acc = 0;
++
++ fbtft_par_dbg(DEBUG_INIT_DISPLAY, par, "%s()\n", __func__);
++
++ for (i = 0; i < 63; i++) {
++ if (i > 0 && curves[i] < 2) {
++ dev_err(par->info->device,
++ "Illegal value in Grayscale Lookup Table at index %d. " \
++ "Must be greater than 1\n", i);
++ return -EINVAL;
++ }
++ acc += curves[i];
++ tmp[i] = acc;
++ if (acc > 180) {
++ dev_err(par->info->device,
++ "Illegal value(s) in Grayscale Lookup Table. " \
++ "At index=%d, the accumulated value has exceeded 180\n", i);
++ return -EINVAL;
++ }
++ }
++
++ write_reg(par, 0xB8,
++ tmp[0], tmp[1], tmp[2], tmp[3], tmp[4], tmp[5], tmp[6], tmp[7],
++ tmp[8], tmp[9], tmp[10], tmp[11], tmp[12], tmp[13], tmp[14], tmp[15],
++ tmp[16], tmp[17], tmp[18], tmp[19], tmp[20], tmp[21], tmp[22], tmp[23],
++ tmp[24], tmp[25], tmp[26], tmp[27], tmp[28], tmp[29], tmp[30], tmp[31],
++ tmp[32], tmp[33], tmp[34], tmp[35], tmp[36], tmp[37], tmp[38], tmp[39],
++ tmp[40], tmp[41], tmp[42], tmp[43], tmp[44], tmp[45], tmp[46], tmp[47],
++ tmp[48], tmp[49], tmp[50], tmp[51], tmp[52], tmp[53], tmp[54], tmp[55],
++ tmp[56], tmp[57], tmp[58], tmp[59], tmp[60], tmp[61], tmp[62]);
++
++ return 0;
++}
++
++static int blank(struct fbtft_par *par, bool on)
++{
++ fbtft_par_dbg(DEBUG_BLANK, par, "%s(blank=%s)\n",
++ __func__, on ? "true" : "false");
++ if (on)
++ write_reg(par, 0xAE);
++ else
++ write_reg(par, 0xAF);
++ return 0;
++}
++
++
++static struct fbtft_display display = {
++ .regwidth = 8,
++ .width = WIDTH,
++ .height = HEIGHT,
++ .gamma_num = GAMMA_NUM,
++ .gamma_len = GAMMA_LEN,
++ .gamma = DEFAULT_GAMMA,
++ .fbtftops = {
++ .init_display = init_display,
++ .set_addr_win = set_addr_win,
++ .set_var = set_var,
++ .set_gamma = set_gamma,
++ .blank = blank,
++ },
++};
++
++#ifdef CONFIG_FB_BACKLIGHT
++static int update_onboard_backlight(struct backlight_device *bd)
++{
++ struct fbtft_par *par = bl_get_data(bd);
++ bool on;
++
++ fbtft_par_dbg(DEBUG_BACKLIGHT, par,
++ "%s: power=%d, fb_blank=%d\n",
++ __func__, bd->props.power, bd->props.fb_blank);
++
++ on = (bd->props.power == FB_BLANK_UNBLANK)
++ && (bd->props.fb_blank == FB_BLANK_UNBLANK);
++ /* Onboard backlight connected to GPIO0 on SSD1351, GPIO1 unused */
++ write_reg(par, 0xB5, on ? 0x03 : 0x02);
++
++ return 0;
++}
++
++static void register_onboard_backlight(struct fbtft_par *par)
++{
++ struct backlight_device *bd;
++ struct backlight_properties bl_props = { 0, };
++ struct backlight_ops *bl_ops;
++
++ fbtft_par_dbg(DEBUG_BACKLIGHT, par, "%s()\n", __func__);
++
++ bl_ops = devm_kzalloc(par->info->device, sizeof(struct backlight_ops),
++ GFP_KERNEL);
++ if (!bl_ops) {
++ dev_err(par->info->device,
++ "%s: could not allocate memory for backlight operations.\n",
++ __func__);
++ return;
++ }
++
++ bl_ops->update_status = update_onboard_backlight;
++ bl_props.type = BACKLIGHT_RAW;
++ bl_props.power = FB_BLANK_POWERDOWN;
++
++ bd = backlight_device_register(dev_driver_string(par->info->device),
++ par->info->device, par, bl_ops, &bl_props);
++ if (IS_ERR(bd)) {
++ dev_err(par->info->device,
++ "cannot register backlight device (%ld)\n",
++ PTR_ERR(bd));
++ return;
++ }
++ par->info->bl_dev = bd;
++
++ if (!par->fbtftops.unregister_backlight)
++ par->fbtftops.unregister_backlight = fbtft_unregister_backlight;
++}
++#else
++static void register_onboard_backlight(struct fbtft_par *par) { };
++#endif
++
++
++FBTFT_REGISTER_DRIVER(DRVNAME, "solomon,ssd1351", &display);
++
++MODULE_ALIAS("spi:" DRVNAME);
++MODULE_ALIAS("platform:" DRVNAME);
++MODULE_ALIAS("spi:ssd1351");
++MODULE_ALIAS("platform:ssd1351");
++
++MODULE_DESCRIPTION("SSD1351 OLED Driver");
++MODULE_AUTHOR("James Davies");
++MODULE_LICENSE("GPL");
+diff -Nur linux-3.18.8/drivers/staging/fbtft/fb_st7735r.c linux-rpi/drivers/staging/fbtft/fb_st7735r.c
+--- linux-3.18.8/drivers/staging/fbtft/fb_st7735r.c 1970-01-01 01:00:00.000000000 +0100
++++ linux-rpi/drivers/staging/fbtft/fb_st7735r.c 2015-03-05 14:40:16.345715808 +0100
+@@ -0,0 +1,195 @@
++/*
++ * FB driver for the ST7735R LCD Controller
++ *
++ * Copyright (C) 2013 Noralf Tronnes
++ *
++ * This program is free software; you can redistribute it and/or modify
++ * it under the terms of the GNU General Public License as published by
++ * the Free Software Foundation; either version 2 of the License, or
++ * (at your option) any later version.
++ *
++ * This program is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
++ * GNU General Public License for more details.
++ *
++ * 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., 675 Mass Ave, Cambridge, MA 02139, USA.
++ */
++
++#include <linux/module.h>
++#include <linux/kernel.h>
++#include <linux/init.h>
++
++#include "fbtft.h"
++
++#define DRVNAME "fb_st7735r"
++#define DEFAULT_GAMMA "0F 1A 0F 18 2F 28 20 22 1F 1B 23 37 00 07 02 10\n" \
++ "0F 1B 0F 17 33 2C 29 2E 30 30 39 3F 00 07 03 10"
++
++
++static int default_init_sequence[] = {
++ /* SWRESET - Software reset */
++ -1, 0x01,
++ -2, 150, /* delay */
++
++ /* SLPOUT - Sleep out & booster on */
++ -1, 0x11,
++ -2, 500, /* delay */
++
++ /* FRMCTR1 - frame rate control: normal mode
++ frame rate = fosc / (1 x 2 + 40) * (LINE + 2C + 2D) */
++ -1, 0xB1, 0x01, 0x2C, 0x2D,
++
++ /* FRMCTR2 - frame rate control: idle mode
++ frame rate = fosc / (1 x 2 + 40) * (LINE + 2C + 2D) */
++ -1, 0xB2, 0x01, 0x2C, 0x2D,
++
++ /* FRMCTR3 - frame rate control - partial mode
++ dot inversion mode, line inversion mode */
++ -1, 0xB3, 0x01, 0x2C, 0x2D, 0x01, 0x2C, 0x2D,
++
++ /* INVCTR - display inversion control
++ no inversion */
++ -1, 0xB4, 0x07,
++
++ /* PWCTR1 - Power Control
++ -4.6V, AUTO mode */
++ -1, 0xC0, 0xA2, 0x02, 0x84,
++
++ /* PWCTR2 - Power Control
++ VGH25 = 2.4C VGSEL = -10 VGH = 3 * AVDD */
++ -1, 0xC1, 0xC5,
++
++ /* PWCTR3 - Power Control
++ Opamp current small, Boost frequency */
++ -1, 0xC2, 0x0A, 0x00,
++
++ /* PWCTR4 - Power Control
++ BCLK/2, Opamp current small & Medium low */
++ -1, 0xC3,0x8A,0x2A,
++
++ /* PWCTR5 - Power Control */
++ -1, 0xC4, 0x8A, 0xEE,
++
++ /* VMCTR1 - Power Control */
++ -1, 0xC5, 0x0E,
++
++ /* INVOFF - Display inversion off */
++ -1, 0x20,
++
++ /* COLMOD - Interface pixel format */
++ -1, 0x3A, 0x05,
++
++ /* DISPON - Display On */
++ -1, 0x29,
++ -2, 100, /* delay */
++
++ /* NORON - Partial off (Normal) */
++ -1, 0x13,
++ -2, 10, /* delay */
++
++ /* end marker */
++ -3
++};
++
++static void set_addr_win(struct fbtft_par *par, int xs, int ys, int xe, int ye)
++{
++ fbtft_par_dbg(DEBUG_SET_ADDR_WIN, par,
++ "%s(xs=%d, ys=%d, xe=%d, ye=%d)\n", __func__, xs, ys, xe, ye);
++
++ /* Column address */
++ write_reg(par, 0x2A, xs >> 8, xs & 0xFF, xe >> 8, xe & 0xFF);
++
++ /* Row adress */
++ write_reg(par, 0x2B, ys >> 8, ys & 0xFF, ye >> 8, ye & 0xFF);
++
++ /* Memory write */
++ write_reg(par, 0x2C);
++}
++
++#define MY (1 << 7)
++#define MX (1 << 6)
++#define MV (1 << 5)
++static int set_var(struct fbtft_par *par)
++{
++ fbtft_par_dbg(DEBUG_INIT_DISPLAY, par, "%s()\n", __func__);
++
++ /* MADCTL - Memory data access control
++ RGB/BGR:
++ 1. Mode selection pin SRGB
++ RGB H/W pin for color filter setting: 0=RGB, 1=BGR
++ 2. MADCTL RGB bit
++ RGB-BGR ORDER color filter panel: 0=RGB, 1=BGR */
++ switch (par->info->var.rotate) {
++ case 0:
++ write_reg(par, 0x36, MX | MY | (par->bgr << 3));
++ break;
++ case 270:
++ write_reg(par, 0x36, MY | MV | (par->bgr << 3));
++ break;
++ case 180:
++ write_reg(par, 0x36, (par->bgr << 3));
++ break;
++ case 90:
++ write_reg(par, 0x36, MX | MV | (par->bgr << 3));
++ break;
++ }
++
++ return 0;
++}
++
++/*
++ Gamma string format:
++ VRF0P VOS0P PK0P PK1P PK2P PK3P PK4P PK5P PK6P PK7P PK8P PK9P SELV0P SELV1P SELV62P SELV63P
++ VRF0N VOS0N PK0N PK1N PK2N PK3N PK4N PK5N PK6N PK7N PK8N PK9N SELV0N SELV1N SELV62N SELV63N
++*/
++#define CURVE(num, idx) curves[num*par->gamma.num_values + idx]
++static int set_gamma(struct fbtft_par *par, unsigned long *curves)
++{
++ int i,j;
++
++ fbtft_par_dbg(DEBUG_INIT_DISPLAY, par, "%s()\n", __func__);
++
++ /* apply mask */
++ for (i = 0; i < par->gamma.num_curves; i++)
++ for (j = 0; j < par->gamma.num_values; j++)
++ CURVE(i,j) &= 0b111111;
++
++ for (i = 0; i < par->gamma.num_curves; i++)
++ write_reg(par, 0xE0 + i,
++ CURVE(i, 0), CURVE(i, 1), CURVE(i, 2), CURVE(i, 3),
++ CURVE(i, 4), CURVE(i, 5), CURVE(i, 6), CURVE(i, 7),
++ CURVE(i, 8), CURVE(i, 9), CURVE(i, 10), CURVE(i, 11),
++ CURVE(i, 12), CURVE(i, 13), CURVE(i, 14), CURVE(i,15));
++
++ return 0;
++}
++#undef CURVE
++
++
++static struct fbtft_display display = {
++ .regwidth = 8,
++ .width = 128,
++ .height = 160,
++ .init_sequence = default_init_sequence,
++ .gamma_num = 2,
++ .gamma_len = 16,
++ .gamma = DEFAULT_GAMMA,
++ .fbtftops = {
++ .set_addr_win = set_addr_win,
++ .set_var = set_var,
++ .set_gamma = set_gamma,
++ },
++};
++FBTFT_REGISTER_DRIVER(DRVNAME, "sitronix,st7735r", &display);
++
++MODULE_ALIAS("spi:" DRVNAME);
++MODULE_ALIAS("platform:" DRVNAME);
++MODULE_ALIAS("spi:st7735r");
++MODULE_ALIAS("platform:st7735r");
++
++MODULE_DESCRIPTION("FB driver for the ST7735R LCD Controller");
++MODULE_AUTHOR("Noralf Tronnes");
++MODULE_LICENSE("GPL");
+diff -Nur linux-3.18.8/drivers/staging/fbtft/fbtft-bus.c linux-rpi/drivers/staging/fbtft/fbtft-bus.c
+--- linux-3.18.8/drivers/staging/fbtft/fbtft-bus.c 1970-01-01 01:00:00.000000000 +0100
++++ linux-rpi/drivers/staging/fbtft/fbtft-bus.c 2015-03-05 14:40:16.345715808 +0100
+@@ -0,0 +1,256 @@
++#include <linux/export.h>
++#include <linux/errno.h>
++#include <linux/gpio.h>
++#include <linux/spi/spi.h>
++#include "fbtft.h"
++
++
++
++
++/*****************************************************************************
++ *
++ * void (*write_reg)(struct fbtft_par *par, int len, ...);
++ *
++ *****************************************************************************/
++
++#define define_fbtft_write_reg(func, type, modifier) \
++void func(struct fbtft_par *par, int len, ...) \
++{ \
++ va_list args; \
++ int i, ret; \
++ int offset = 0; \
++ type *buf = (type *)par->buf; \
++ \
++ if (unlikely(par->debug & DEBUG_WRITE_REGISTER)) { \
++ va_start(args, len); \
++ for (i = 0; i < len; i++) { \
++ buf[i] = (type)va_arg(args, unsigned int); \
++ } \
++ va_end(args); \
++ fbtft_par_dbg_hex(DEBUG_WRITE_REGISTER, par, par->info->device, type, buf, len, "%s: ", __func__); \
++ } \
++ \
++ va_start(args, len); \
++ \
++ if (par->startbyte) { \
++ *(u8 *)par->buf = par->startbyte; \
++ buf = (type *)(par->buf + 1); \
++ offset = 1; \
++ } \
++ \
++ *buf = modifier((type)va_arg(args, unsigned int)); \
++ if (par->gpio.dc != -1) \
++ gpio_set_value(par->gpio.dc, 0); \
++ ret = par->fbtftops.write(par, par->buf, sizeof(type)+offset); \
++ if (ret < 0) { \
++ va_end(args); \
++ dev_err(par->info->device, "%s: write() failed and returned %d\n", __func__, ret); \
++ return; \
++ } \
++ len--; \
++ \
++ if (par->startbyte) \
++ *(u8 *)par->buf = par->startbyte | 0x2; \
++ \
++ if (len) { \
++ i = len; \
++ while (i--) { \
++ *buf++ = modifier((type)va_arg(args, unsigned int)); \
++ } \
++ if (par->gpio.dc != -1) \
++ gpio_set_value(par->gpio.dc, 1); \
++ ret = par->fbtftops.write(par, par->buf, len * (sizeof(type)+offset)); \
++ if (ret < 0) { \
++ va_end(args); \
++ dev_err(par->info->device, "%s: write() failed and returned %d\n", __func__, ret); \
++ return; \
++ } \
++ } \
++ va_end(args); \
++} \
++EXPORT_SYMBOL(func);
++
++define_fbtft_write_reg(fbtft_write_reg8_bus8, u8, )
++define_fbtft_write_reg(fbtft_write_reg16_bus8, u16, cpu_to_be16)
++define_fbtft_write_reg(fbtft_write_reg16_bus16, u16, )
++
++void fbtft_write_reg8_bus9(struct fbtft_par *par, int len, ...)
++{
++ va_list args;
++ int i, ret;
++ int pad = 0;
++ u16 *buf = (u16 *)par->buf;
++
++ if (unlikely(par->debug & DEBUG_WRITE_REGISTER)) {
++ va_start(args, len);
++ for (i = 0; i < len; i++)
++ *(((u8 *)buf) + i) = (u8)va_arg(args, unsigned int);
++ va_end(args);
++ fbtft_par_dbg_hex(DEBUG_WRITE_REGISTER, par,
++ par->info->device, u8, buf, len, "%s: ", __func__);
++ }
++ if (len <= 0)
++ return;
++
++ if (par->spi && (par->spi->bits_per_word == 8)) {
++ /* we're emulating 9-bit, pad start of buffer with no-ops
++ (assuming here that zero is a no-op) */
++ pad = (len % 4) ? 4 - (len % 4) : 0;
++ for (i = 0; i < pad; i++)
++ *buf++ = 0x000;
++ }
++
++ va_start(args, len);
++ *buf++ = (u8)va_arg(args, unsigned int);
++ i = len - 1;
++ while (i--) {
++ *buf = (u8)va_arg(args, unsigned int);
++ *buf++ |= 0x100; /* dc=1 */
++ }
++ va_end(args);
++ ret = par->fbtftops.write(par, par->buf, (len + pad) * sizeof(u16));
++ if (ret < 0) {
++ dev_err(par->info->device,
++ "%s: write() failed and returned %d\n", __func__, ret);
++ return;
++ }
++}
++EXPORT_SYMBOL(fbtft_write_reg8_bus9);
++
++
++
++
++/*****************************************************************************
++ *
++ * int (*write_vmem)(struct fbtft_par *par);
++ *
++ *****************************************************************************/
++
++/* 16 bit pixel over 8-bit databus */
++int fbtft_write_vmem16_bus8(struct fbtft_par *par, size_t offset, size_t len)
++{
++ u16 *vmem16;
++ u16 *txbuf16 = (u16 *)par->txbuf.buf;
++ size_t remain;
++ size_t to_copy;
++ size_t tx_array_size;
++ int i;
++ int ret = 0;
++ size_t startbyte_size = 0;
++
++ fbtft_par_dbg(DEBUG_WRITE_VMEM, par, "%s(offset=%zu, len=%zu)\n",
++ __func__, offset, len);
++
++ remain = len / 2;
++ vmem16 = (u16 *)(par->info->screen_base + offset);
++
++ if (par->gpio.dc != -1)
++ gpio_set_value(par->gpio.dc, 1);
++
++ /* non buffered write */
++ if (!par->txbuf.buf)
++ return par->fbtftops.write(par, vmem16, len);
++
++ /* buffered write */
++ tx_array_size = par->txbuf.len / 2;
++
++ if (par->startbyte) {
++ txbuf16 = (u16 *)(par->txbuf.buf + 1);
++ tx_array_size -= 2;
++ *(u8 *)(par->txbuf.buf) = par->startbyte | 0x2;
++ startbyte_size = 1;
++ }
++
++ while (remain) {
++ to_copy = remain > tx_array_size ? tx_array_size : remain;
++ dev_dbg(par->info->device, " to_copy=%zu, remain=%zu\n",
++ to_copy, remain - to_copy);
++
++ for (i = 0; i < to_copy; i++)
++ txbuf16[i] = cpu_to_be16(vmem16[i]);
++
++ vmem16 = vmem16 + to_copy;
++ ret = par->fbtftops.write(par, par->txbuf.buf,
++ startbyte_size + to_copy * 2);
++ if (ret < 0)
++ return ret;
++ remain -= to_copy;
++ }
++
++ return ret;
++}
++EXPORT_SYMBOL(fbtft_write_vmem16_bus8);
++
++/* 16 bit pixel over 9-bit SPI bus: dc + high byte, dc + low byte */
++int fbtft_write_vmem16_bus9(struct fbtft_par *par, size_t offset, size_t len)
++{
++ u8 *vmem8;
++ u16 *txbuf16 = par->txbuf.buf;
++ size_t remain;
++ size_t to_copy;
++ size_t tx_array_size;
++ int i;
++ int ret = 0;
++
++ fbtft_par_dbg(DEBUG_WRITE_VMEM, par, "%s(offset=%zu, len=%zu)\n",
++ __func__, offset, len);
++
++ if (!par->txbuf.buf) {
++ dev_err(par->info->device, "%s: txbuf.buf is NULL\n", __func__);
++ return -1;
++ }
++
++ remain = len;
++ vmem8 = par->info->screen_base + offset;
++
++ tx_array_size = par->txbuf.len / 2;
++
++ while (remain) {
++ to_copy = remain > tx_array_size ? tx_array_size : remain;
++ dev_dbg(par->info->device, " to_copy=%zu, remain=%zu\n",
++ to_copy, remain - to_copy);
++
++#ifdef __LITTLE_ENDIAN
++ for (i = 0; i < to_copy; i += 2) {
++ txbuf16[i] = 0x0100 | vmem8[i+1];
++ txbuf16[i+1] = 0x0100 | vmem8[i];
++ }
++#else
++ for (i = 0; i < to_copy; i++)
++ txbuf16[i] = 0x0100 | vmem8[i];
++#endif
++ vmem8 = vmem8 + to_copy;
++ ret = par->fbtftops.write(par, par->txbuf.buf, to_copy*2);
++ if (ret < 0)
++ return ret;
++ remain -= to_copy;
++ }
++
++ return ret;
++}
++EXPORT_SYMBOL(fbtft_write_vmem16_bus9);
++
++int fbtft_write_vmem8_bus8(struct fbtft_par *par, size_t offset, size_t len)
++{
++ dev_err(par->info->device, "%s: function not implemented\n", __func__);
++ return -1;
++}
++EXPORT_SYMBOL(fbtft_write_vmem8_bus8);
++
++/* 16 bit pixel over 16-bit databus */
++int fbtft_write_vmem16_bus16(struct fbtft_par *par, size_t offset, size_t len)
++{
++ u16 *vmem16;
++
++ fbtft_par_dbg(DEBUG_WRITE_VMEM, par, "%s(offset=%zu, len=%zu)\n",
++ __func__, offset, len);
++
++ vmem16 = (u16 *)(par->info->screen_base + offset);
++
++ if (par->gpio.dc != -1)
++ gpio_set_value(par->gpio.dc, 1);
++
++ /* no need for buffered write with 16-bit bus */
++ return par->fbtftops.write(par, vmem16, len);
++}
++EXPORT_SYMBOL(fbtft_write_vmem16_bus16);
+diff -Nur linux-3.18.8/drivers/staging/fbtft/fbtft-core.c linux-rpi/drivers/staging/fbtft/fbtft-core.c
+--- linux-3.18.8/drivers/staging/fbtft/fbtft-core.c 1970-01-01 01:00:00.000000000 +0100
++++ linux-rpi/drivers/staging/fbtft/fbtft-core.c 2015-03-05 14:40:16.345715808 +0100
+@@ -0,0 +1,1521 @@
++/*
++ * Copyright (C) 2013 Noralf Tronnes
++ *
++ * This driver is inspired by:
++ * st7735fb.c, Copyright (C) 2011, Matt Porter
++ * broadsheetfb.c, Copyright (C) 2008, Jaya Kumar
++ *
++ * This program is free software; you can redistribute it and/or modify
++ * it under the terms of the GNU General Public License as published by
++ * the Free Software Foundation; either version 2 of the License, or
++ * (at your option) any later version.
++ *
++ * This program is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
++ * GNU General Public License for more details.
++ *
++ * 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., 675 Mass Ave, Cambridge, MA 02139, USA.
++ */
++
++#include <linux/module.h>
++#include <linux/kernel.h>
++#include <linux/errno.h>
++#include <linux/string.h>
++#include <linux/mm.h>
++#include <linux/vmalloc.h>
++#include <linux/slab.h>
++#include <linux/init.h>
++#include <linux/fb.h>
++#include <linux/gpio.h>
++#include <linux/spi/spi.h>
++#include <linux/delay.h>
++#include <linux/uaccess.h>
++#include <linux/backlight.h>
++#include <linux/platform_device.h>
++#include <linux/spinlock.h>
++#include <linux/dma-mapping.h>
++#include <linux/of.h>
++#include <linux/of_gpio.h>
++
++#include "fbtft.h"
++
++extern void fbtft_sysfs_init(struct fbtft_par *par);
++extern void fbtft_sysfs_exit(struct fbtft_par *par);
++extern void fbtft_expand_debug_value(unsigned long *debug);
++extern int fbtft_gamma_parse_str(struct fbtft_par *par, unsigned long *curves,
++ const char *str, int size);
++
++static unsigned long debug;
++module_param(debug, ulong , 0);
++MODULE_PARM_DESC(debug, "override device debug level");
++
++static bool dma = true;
++module_param(dma, bool, 0);
++MODULE_PARM_DESC(dma, "Use DMA buffer");
++
++
++void fbtft_dbg_hex(const struct device *dev, int groupsize,
++ void *buf, size_t len, const char *fmt, ...)
++{
++ va_list args;
++ static char textbuf[512];
++ char *text = textbuf;
++ size_t text_len;
++
++ va_start(args, fmt);
++ text_len = vscnprintf(text, sizeof(textbuf), fmt, args);
++ va_end(args);
++
++ hex_dump_to_buffer(buf, len, 32, groupsize, text + text_len,
++ 512 - text_len, false);
++
++ if (len > 32)
++ dev_info(dev, "%s ...\n", text);
++ else
++ dev_info(dev, "%s\n", text);
++}
++EXPORT_SYMBOL(fbtft_dbg_hex);
++
++static unsigned long fbtft_request_gpios_match(struct fbtft_par *par,
++ const struct fbtft_gpio *gpio)
++{
++ int ret;
++ long val;
++
++ fbtft_par_dbg(DEBUG_REQUEST_GPIOS_MATCH, par, "%s('%s')\n",
++ __func__, gpio->name);
++
++ if (strcasecmp(gpio->name, "reset") == 0) {
++ par->gpio.reset = gpio->gpio;
++ return GPIOF_OUT_INIT_HIGH;
++ } else if (strcasecmp(gpio->name, "dc") == 0) {
++ par->gpio.dc = gpio->gpio;
++ return GPIOF_OUT_INIT_LOW;
++ } else if (strcasecmp(gpio->name, "cs") == 0) {
++ par->gpio.cs = gpio->gpio;
++ return GPIOF_OUT_INIT_HIGH;
++ } else if (strcasecmp(gpio->name, "wr") == 0) {
++ par->gpio.wr = gpio->gpio;
++ return GPIOF_OUT_INIT_HIGH;
++ } else if (strcasecmp(gpio->name, "rd") == 0) {
++ par->gpio.rd = gpio->gpio;
++ return GPIOF_OUT_INIT_HIGH;
++ } else if (strcasecmp(gpio->name, "latch") == 0) {
++ par->gpio.latch = gpio->gpio;
++ return GPIOF_OUT_INIT_LOW;
++ } else if (gpio->name[0] == 'd' && gpio->name[1] == 'b') {
++ ret = kstrtol(&gpio->name[2], 10, &val);
++ if (ret == 0 && val < 16) {
++ par->gpio.db[val] = gpio->gpio;
++ return GPIOF_OUT_INIT_LOW;
++ }
++ } else if (strcasecmp(gpio->name, "led") == 0) {
++ par->gpio.led[0] = gpio->gpio;
++ return GPIOF_OUT_INIT_LOW;
++ } else if (strcasecmp(gpio->name, "led_") == 0) {
++ par->gpio.led[0] = gpio->gpio;
++ return GPIOF_OUT_INIT_HIGH;
++ }
++
++ return FBTFT_GPIO_NO_MATCH;
++}
++
++static int fbtft_request_gpios(struct fbtft_par *par)
++{
++ struct fbtft_platform_data *pdata = par->pdata;
++ const struct fbtft_gpio *gpio;
++ unsigned long flags;
++ int ret;
++
++ if (pdata && pdata->gpios) {
++ gpio = pdata->gpios;
++ while (gpio->name[0]) {
++ flags = FBTFT_GPIO_NO_MATCH;
++ /* if driver provides match function, try it first,
++ if no match use our own */
++ if (par->fbtftops.request_gpios_match)
++ flags = par->fbtftops.request_gpios_match(par, gpio);
++ if (flags == FBTFT_GPIO_NO_MATCH)
++ flags = fbtft_request_gpios_match(par, gpio);
++ if (flags != FBTFT_GPIO_NO_MATCH) {
++ ret = devm_gpio_request_one(par->info->device,
++ gpio->gpio, flags,
++ par->info->device->driver->name);
++ if (ret < 0) {
++ dev_err(par->info->device,
++ "%s: gpio_request_one('%s'=%d) failed with %d\n",
++ __func__, gpio->name,
++ gpio->gpio, ret);
++ return ret;
++ }
++ fbtft_par_dbg(DEBUG_REQUEST_GPIOS, par,
++ "%s: '%s' = GPIO%d\n",
++ __func__, gpio->name, gpio->gpio);
++ }
++ gpio++;
++ }
++ }
++
++ return 0;
++}
++
++#ifdef CONFIG_OF
++static int fbtft_request_one_gpio(struct fbtft_par *par,
++ const char *name, int index, int *gpiop)
++{
++ struct device *dev = par->info->device;
++ struct device_node *node = dev->of_node;
++ int gpio, flags, ret = 0;
++ enum of_gpio_flags of_flags;
++
++ if (of_find_property(node, name, NULL)) {
++ gpio = of_get_named_gpio_flags(node, name, index, &of_flags);
++ if (gpio == -ENOENT)
++ return 0;
++ if (gpio == -EPROBE_DEFER)
++ return gpio;
++ if (gpio < 0) {
++ dev_err(dev,
++ "failed to get '%s' from DT\n", name);
++ return gpio;
++ }
++
++ /* active low translates to initially low */
++ flags = (of_flags & OF_GPIO_ACTIVE_LOW) ? GPIOF_OUT_INIT_LOW :
++ GPIOF_OUT_INIT_HIGH;
++ ret = devm_gpio_request_one(dev, gpio, flags,
++ dev->driver->name);
++ if (ret) {
++ dev_err(dev,
++ "gpio_request_one('%s'=%d) failed with %d\n",
++ name, gpio, ret);
++ return ret;
++ }
++ if (gpiop)
++ *gpiop = gpio;
++ fbtft_par_dbg(DEBUG_REQUEST_GPIOS, par, "%s: '%s' = GPIO%d\n",
++ __func__, name, gpio);
++ }
++
++ return ret;
++}
++
++static int fbtft_request_gpios_dt(struct fbtft_par *par)
++{
++ int i;
++ int ret;
++
++ if (!par->info->device->of_node)
++ return -EINVAL;
++
++ ret = fbtft_request_one_gpio(par, "reset-gpios", 0, &par->gpio.reset);
++ if (ret)
++ return ret;
++ ret = fbtft_request_one_gpio(par, "dc-gpios", 0, &par->gpio.dc);
++ if (ret)
++ return ret;
++ ret = fbtft_request_one_gpio(par, "rd-gpios", 0, &par->gpio.rd);
++ if (ret)
++ return ret;
++ ret = fbtft_request_one_gpio(par, "wr-gpios", 0, &par->gpio.wr);
++ if (ret)
++ return ret;
++ ret = fbtft_request_one_gpio(par, "cs-gpios", 0, &par->gpio.cs);
++ if (ret)
++ return ret;
++ ret = fbtft_request_one_gpio(par, "latch-gpios", 0, &par->gpio.latch);
++ if (ret)
++ return ret;
++ for (i = 0; i < 16; i++) {
++ ret = fbtft_request_one_gpio(par, "db-gpios", i,
++ &par->gpio.db[i]);
++ if (ret)
++ return ret;
++ ret = fbtft_request_one_gpio(par, "led-gpios", i,
++ &par->gpio.led[i]);
++ if (ret)
++ return ret;
++ ret = fbtft_request_one_gpio(par, "aux-gpios", i,
++ &par->gpio.aux[i]);
++ if (ret)
++ return ret;
++ }
++
++ return 0;
++}
++#endif
++
++#ifdef CONFIG_FB_BACKLIGHT
++static int fbtft_backlight_update_status(struct backlight_device *bd)
++{
++ struct fbtft_par *par = bl_get_data(bd);
++ bool polarity = !!(bd->props.state & BL_CORE_DRIVER1);
++
++ fbtft_par_dbg(DEBUG_BACKLIGHT, par,
++ "%s: polarity=%d, power=%d, fb_blank=%d\n",
++ __func__, polarity, bd->props.power, bd->props.fb_blank);
++
++ if ((bd->props.power == FB_BLANK_UNBLANK) && (bd->props.fb_blank == FB_BLANK_UNBLANK))
++ gpio_set_value(par->gpio.led[0], polarity);
++ else
++ gpio_set_value(par->gpio.led[0], !polarity);
++
++ return 0;
++}
++
++static int fbtft_backlight_get_brightness(struct backlight_device *bd)
++{
++ return bd->props.brightness;
++}
++
++void fbtft_unregister_backlight(struct fbtft_par *par)
++{
++ const struct backlight_ops *bl_ops;
++
++ fbtft_par_dbg(DEBUG_BACKLIGHT, par, "%s()\n", __func__);
++
++ if (par->info->bl_dev) {
++ par->info->bl_dev->props.power = FB_BLANK_POWERDOWN;
++ backlight_update_status(par->info->bl_dev);
++ bl_ops = par->info->bl_dev->ops;
++ backlight_device_unregister(par->info->bl_dev);
++ par->info->bl_dev = NULL;
++ }
++}
++
++void fbtft_register_backlight(struct fbtft_par *par)
++{
++ struct backlight_device *bd;
++ struct backlight_properties bl_props = { 0, };
++ struct backlight_ops *bl_ops;
++
++ fbtft_par_dbg(DEBUG_BACKLIGHT, par, "%s()\n", __func__);
++
++ if (par->gpio.led[0] == -1) {
++ fbtft_par_dbg(DEBUG_BACKLIGHT, par,
++ "%s(): led pin not set, exiting.\n", __func__);
++ return;
++ }
++
++ bl_ops = devm_kzalloc(par->info->device, sizeof(struct backlight_ops),
++ GFP_KERNEL);
++ if (!bl_ops) {
++ dev_err(par->info->device,
++ "%s: could not allocate memeory for backlight operations.\n",
++ __func__);
++ return;
++ }
++
++ bl_ops->get_brightness = fbtft_backlight_get_brightness;
++ bl_ops->update_status = fbtft_backlight_update_status;
++ bl_props.type = BACKLIGHT_RAW;
++ /* Assume backlight is off, get polarity from current state of pin */
++ bl_props.power = FB_BLANK_POWERDOWN;
++ if (!gpio_get_value(par->gpio.led[0]))
++ bl_props.state |= BL_CORE_DRIVER1;
++
++ bd = backlight_device_register(dev_driver_string(par->info->device),
++ par->info->device, par, bl_ops, &bl_props);
++ if (IS_ERR(bd)) {
++ dev_err(par->info->device,
++ "cannot register backlight device (%ld)\n",
++ PTR_ERR(bd));
++ return;
++ }
++ par->info->bl_dev = bd;
++
++ if (!par->fbtftops.unregister_backlight)
++ par->fbtftops.unregister_backlight = fbtft_unregister_backlight;
++}
++#else
++void fbtft_register_backlight(struct fbtft_par *par) { };
++void fbtft_unregister_backlight(struct fbtft_par *par) { };
++#endif
++EXPORT_SYMBOL(fbtft_register_backlight);
++EXPORT_SYMBOL(fbtft_unregister_backlight);
++
++static void fbtft_set_addr_win(struct fbtft_par *par, int xs, int ys, int xe,
++ int ye)
++{
++ fbtft_par_dbg(DEBUG_SET_ADDR_WIN, par,
++ "%s(xs=%d, ys=%d, xe=%d, ye=%d)\n", __func__, xs, ys, xe, ye);
++
++ /* Column address set */
++ write_reg(par, 0x2A,
++ (xs >> 8) & 0xFF, xs & 0xFF, (xe >> 8) & 0xFF, xe & 0xFF);
++
++ /* Row adress set */
++ write_reg(par, 0x2B,
++ (ys >> 8) & 0xFF, ys & 0xFF, (ye >> 8) & 0xFF, ye & 0xFF);
++
++ /* Memory write */
++ write_reg(par, 0x2C);
++}
++
++
++static void fbtft_reset(struct fbtft_par *par)
++{
++ if (par->gpio.reset == -1)
++ return;
++ fbtft_par_dbg(DEBUG_RESET, par, "%s()\n", __func__);
++ gpio_set_value(par->gpio.reset, 0);
++ udelay(20);
++ gpio_set_value(par->gpio.reset, 1);
++ mdelay(120);
++}
++
++
++static void fbtft_update_display(struct fbtft_par *par, unsigned start_line,
++ unsigned end_line)
++{
++ size_t offset, len;
++ struct timespec ts_start, ts_end, ts_fps, ts_duration;
++ long fps_ms, fps_us, duration_ms, duration_us;
++ long fps, throughput;
++ bool timeit = false;
++ int ret = 0;
++
++ if (unlikely(par->debug & (DEBUG_TIME_FIRST_UPDATE | DEBUG_TIME_EACH_UPDATE))) {
++ if ((par->debug & DEBUG_TIME_EACH_UPDATE) || \
++ ((par->debug & DEBUG_TIME_FIRST_UPDATE) && !par->first_update_done)) {
++ getnstimeofday(&ts_start);
++ timeit = true;
++ }
++ }
++
++ /* Sanity checks */
++ if (start_line > end_line) {
++ dev_warn(par->info->device,
++ "%s: start_line=%u is larger than end_line=%u. Shouldn't happen, will do full display update\n",
++ __func__, start_line, end_line);
++ start_line = 0;
++ end_line = par->info->var.yres - 1;
++ }
++ if (start_line > par->info->var.yres - 1 || end_line > par->info->var.yres - 1) {
++ dev_warn(par->info->device,
++ "%s: start_line=%u or end_line=%u is larger than max=%d. Shouldn't happen, will do full display update\n",
++ __func__, start_line, end_line, par->info->var.yres - 1);
++ start_line = 0;
++ end_line = par->info->var.yres - 1;
++ }
++
++ fbtft_par_dbg(DEBUG_UPDATE_DISPLAY, par, "%s(start_line=%u, end_line=%u)\n",
++ __func__, start_line, end_line);
++
++ if (par->fbtftops.set_addr_win)
++ par->fbtftops.set_addr_win(par, 0, start_line,
++ par->info->var.xres-1, end_line);
++
++ offset = start_line * par->info->fix.line_length;
++ len = (end_line - start_line + 1) * par->info->fix.line_length;
++ ret = par->fbtftops.write_vmem(par, offset, len);
++ if (ret < 0)
++ dev_err(par->info->device,
++ "%s: write_vmem failed to update display buffer\n",
++ __func__);
++
++ if (unlikely(timeit)) {
++ getnstimeofday(&ts_end);
++ if (par->update_time.tv_nsec == 0 && par->update_time.tv_sec == 0) {
++ par->update_time.tv_sec = ts_start.tv_sec;
++ par->update_time.tv_nsec = ts_start.tv_nsec;
++ }
++ ts_fps = timespec_sub(ts_start, par->update_time);
++ par->update_time.tv_sec = ts_start.tv_sec;
++ par->update_time.tv_nsec = ts_start.tv_nsec;
++ fps_ms = (ts_fps.tv_sec * 1000) + ((ts_fps.tv_nsec / 1000000) % 1000);
++ fps_us = (ts_fps.tv_nsec / 1000) % 1000;
++ fps = fps_ms * 1000 + fps_us;
++ fps = fps ? 1000000 / fps : 0;
++
++ ts_duration = timespec_sub(ts_end, ts_start);
++ duration_ms = (ts_duration.tv_sec * 1000) + ((ts_duration.tv_nsec / 1000000) % 1000);
++ duration_us = (ts_duration.tv_nsec / 1000) % 1000;
++ throughput = duration_ms * 1000 + duration_us;
++ throughput = throughput ? (len * 1000) / throughput : 0;
++ throughput = throughput * 1000 / 1024;
++
++ dev_info(par->info->device,
++ "Display update: %ld kB/s (%ld.%.3ld ms), fps=%ld (%ld.%.3ld ms)\n",
++ throughput, duration_ms, duration_us,
++ fps, fps_ms, fps_us);
++ par->first_update_done = true;
++ }
++}
++
++
++static void fbtft_mkdirty(struct fb_info *info, int y, int height)
++{
++ struct fbtft_par *par = info->par;
++ struct fb_deferred_io *fbdefio = info->fbdefio;
++
++ /* special case, needed ? */
++ if (y == -1) {
++ y = 0;
++ height = info->var.yres - 1;
++ }
++
++ /* Mark display lines/area as dirty */
++ spin_lock(&par->dirty_lock);
++ if (y < par->dirty_lines_start)
++ par->dirty_lines_start = y;
++ if (y + height - 1 > par->dirty_lines_end)
++ par->dirty_lines_end = y + height - 1;
++ spin_unlock(&par->dirty_lock);
++
++ /* Schedule deferred_io to update display (no-op if already on queue)*/
++ schedule_delayed_work(&info->deferred_work, fbdefio->delay);
++}
++
++static void fbtft_deferred_io(struct fb_info *info, struct list_head *pagelist)
++{
++ struct fbtft_par *par = info->par;
++ unsigned dirty_lines_start, dirty_lines_end;
++ struct page *page;
++ unsigned long index;
++ unsigned y_low = 0, y_high = 0;
++ int count = 0;
++
++ spin_lock(&par->dirty_lock);
++ dirty_lines_start = par->dirty_lines_start;
++ dirty_lines_end = par->dirty_lines_end;
++ /* set display line markers as clean */
++ par->dirty_lines_start = par->info->var.yres - 1;
++ par->dirty_lines_end = 0;
++ spin_unlock(&par->dirty_lock);
++
++ /* Mark display lines as dirty */
++ list_for_each_entry(page, pagelist, lru) {
++ count++;
++ index = page->index << PAGE_SHIFT;
++ y_low = index / info->fix.line_length;
++ y_high = (index + PAGE_SIZE - 1) / info->fix.line_length;
++ fbtft_dev_dbg(DEBUG_DEFERRED_IO, par, info->device,
++ "page->index=%lu y_low=%d y_high=%d\n",
++ page->index, y_low, y_high);
++ if (y_high > info->var.yres - 1)
++ y_high = info->var.yres - 1;
++ if (y_low < dirty_lines_start)
++ dirty_lines_start = y_low;
++ if (y_high > dirty_lines_end)
++ dirty_lines_end = y_high;
++ }
++
++ par->fbtftops.update_display(info->par,
++ dirty_lines_start, dirty_lines_end);
++}
++
++
++static void fbtft_fb_fillrect(struct fb_info *info,
++ const struct fb_fillrect *rect)
++{
++ struct fbtft_par *par = info->par;
++
++ fbtft_dev_dbg(DEBUG_FB_FILLRECT, par, info->dev,
++ "%s: dx=%d, dy=%d, width=%d, height=%d\n",
++ __func__, rect->dx, rect->dy, rect->width, rect->height);
++ sys_fillrect(info, rect);
++
++ par->fbtftops.mkdirty(info, rect->dy, rect->height);
++}
++
++static void fbtft_fb_copyarea(struct fb_info *info,
++ const struct fb_copyarea *area)
++{
++ struct fbtft_par *par = info->par;
++
++ fbtft_dev_dbg(DEBUG_FB_COPYAREA, par, info->dev,
++ "%s: dx=%d, dy=%d, width=%d, height=%d\n",
++ __func__, area->dx, area->dy, area->width, area->height);
++ sys_copyarea(info, area);
++
++ par->fbtftops.mkdirty(info, area->dy, area->height);
++}
++
++static void fbtft_fb_imageblit(struct fb_info *info,
++ const struct fb_image *image)
++{
++ struct fbtft_par *par = info->par;
++
++ fbtft_dev_dbg(DEBUG_FB_IMAGEBLIT, par, info->dev,
++ "%s: dx=%d, dy=%d, width=%d, height=%d\n",
++ __func__, image->dx, image->dy, image->width, image->height);
++ sys_imageblit(info, image);
++
++ par->fbtftops.mkdirty(info, image->dy, image->height);
++}
++
++static ssize_t fbtft_fb_write(struct fb_info *info, const char __user *buf,
++ size_t count, loff_t *ppos)
++{
++ struct fbtft_par *par = info->par;
++ ssize_t res;
++
++ fbtft_dev_dbg(DEBUG_FB_WRITE, par, info->dev,
++ "%s: count=%zd, ppos=%llu\n", __func__, count, *ppos);
++ res = fb_sys_write(info, buf, count, ppos);
++
++ /* TODO: only mark changed area
++ update all for now */
++ par->fbtftops.mkdirty(info, -1, 0);
++
++ return res;
++}
++
++/* from pxafb.c */
++static unsigned int chan_to_field(unsigned chan, struct fb_bitfield *bf)
++{
++ chan &= 0xffff;
++ chan >>= 16 - bf->length;
++ return chan << bf->offset;
++}
++
++static int fbtft_fb_setcolreg(unsigned regno, unsigned red, unsigned green,
++ unsigned blue, unsigned transp,
++ struct fb_info *info)
++{
++ struct fbtft_par *par = info->par;
++ unsigned val;
++ int ret = 1;
++
++ fbtft_dev_dbg(DEBUG_FB_SETCOLREG, par, info->dev,
++ "%s(regno=%u, red=0x%X, green=0x%X, blue=0x%X, trans=0x%X)\n",
++ __func__, regno, red, green, blue, transp);
++
++ switch (info->fix.visual) {
++ case FB_VISUAL_TRUECOLOR:
++ if (regno < 16) {
++ u32 *pal = info->pseudo_palette;
++
++ val = chan_to_field(red, &info->var.red);
++ val |= chan_to_field(green, &info->var.green);
++ val |= chan_to_field(blue, &info->var.blue);
++
++ pal[regno] = val;
++ ret = 0;
++ }
++ break;
++
++ }
++ return ret;
++}
++
++static int fbtft_fb_blank(int blank, struct fb_info *info)
++{
++ struct fbtft_par *par = info->par;
++ int ret = -EINVAL;
++
++ fbtft_dev_dbg(DEBUG_FB_BLANK, par, info->dev, "%s(blank=%d)\n",
++ __func__, blank);
++
++ if (!par->fbtftops.blank)
++ return ret;
++
++ switch (blank) {
++ case FB_BLANK_POWERDOWN:
++ case FB_BLANK_VSYNC_SUSPEND:
++ case FB_BLANK_HSYNC_SUSPEND:
++ case FB_BLANK_NORMAL:
++ ret = par->fbtftops.blank(par, true);
++ break;
++ case FB_BLANK_UNBLANK:
++ ret = par->fbtftops.blank(par, false);
++ break;
++ }
++ return ret;
++}
++
++static void fbtft_merge_fbtftops(struct fbtft_ops *dst, struct fbtft_ops *src)
++{
++ if (src->write)
++ dst->write = src->write;
++ if (src->read)
++ dst->read = src->read;
++ if (src->write_vmem)
++ dst->write_vmem = src->write_vmem;
++ if (src->write_register)
++ dst->write_register = src->write_register;
++ if (src->set_addr_win)
++ dst->set_addr_win = src->set_addr_win;
++ if (src->reset)
++ dst->reset = src->reset;
++ if (src->mkdirty)
++ dst->mkdirty = src->mkdirty;
++ if (src->update_display)
++ dst->update_display = src->update_display;
++ if (src->init_display)
++ dst->init_display = src->init_display;
++ if (src->blank)
++ dst->blank = src->blank;
++ if (src->request_gpios_match)
++ dst->request_gpios_match = src->request_gpios_match;
++ if (src->request_gpios)
++ dst->request_gpios = src->request_gpios;
++ if (src->verify_gpios)
++ dst->verify_gpios = src->verify_gpios;
++ if (src->register_backlight)
++ dst->register_backlight = src->register_backlight;
++ if (src->unregister_backlight)
++ dst->unregister_backlight = src->unregister_backlight;
++ if (src->set_var)
++ dst->set_var = src->set_var;
++ if (src->set_gamma)
++ dst->set_gamma = src->set_gamma;
++}
++
++/**
++ * fbtft_framebuffer_alloc - creates a new frame buffer info structure
++ *
++ * @display: pointer to structure describing the display
++ * @dev: pointer to the device for this fb, this can be NULL
++ *
++ * Creates a new frame buffer info structure.
++ *
++ * Also creates and populates the following structures:
++ * info->fbops
++ * info->fbdefio
++ * info->pseudo_palette
++ * par->fbtftops
++ * par->txbuf
++ *
++ * Returns the new structure, or NULL if an error occurred.
++ *
++ */
++struct fb_info *fbtft_framebuffer_alloc(struct fbtft_display *display,
++ struct device *dev)
++{
++ struct fb_info *info;
++ struct fbtft_par *par;
++ struct fb_ops *fbops = NULL;
++ struct fb_deferred_io *fbdefio = NULL;
++ struct fbtft_platform_data *pdata = dev->platform_data;
++ u8 *vmem = NULL;
++ void *txbuf = NULL;
++ void *buf = NULL;
++ unsigned width;
++ unsigned height;
++ int txbuflen = display->txbuflen;
++ unsigned bpp = display->bpp;
++ unsigned fps = display->fps;
++ int vmem_size, i;
++ int *init_sequence = display->init_sequence;
++ char *gamma = display->gamma;
++ unsigned long *gamma_curves = NULL;
++
++ /* sanity check */
++ if (display->gamma_num * display->gamma_len > FBTFT_GAMMA_MAX_VALUES_TOTAL) {
++ dev_err(dev,
++ "%s: FBTFT_GAMMA_MAX_VALUES_TOTAL=%d is exceeded\n",
++ __func__, FBTFT_GAMMA_MAX_VALUES_TOTAL);
++ return NULL;
++ }
++
++ /* defaults */
++ if (!fps)
++ fps = 20;
++ if (!bpp)
++ bpp = 16;
++
++ if (!pdata) {
++ dev_err(dev, "platform data is missing\n");
++ return NULL;
++ }
++
++ /* override driver values? */
++ if (pdata->fps)
++ fps = pdata->fps;
++ if (pdata->txbuflen)
++ txbuflen = pdata->txbuflen;
++ if (pdata->display.init_sequence)
++ init_sequence = pdata->display.init_sequence;
++ if (pdata->gamma)
++ gamma = pdata->gamma;
++ if (pdata->display.debug)
++ display->debug = pdata->display.debug;
++ if (pdata->display.backlight)
++ display->backlight = pdata->display.backlight;
++ if (pdata->display.width)
++ display->width = pdata->display.width;
++ if (pdata->display.height)
++ display->height = pdata->display.height;
++ if (pdata->display.buswidth)
++ display->buswidth = pdata->display.buswidth;
++ if (pdata->display.regwidth)
++ display->regwidth = pdata->display.regwidth;
++
++ display->debug |= debug;
++ fbtft_expand_debug_value(&display->debug);
++
++ switch (pdata->rotate) {
++ case 90:
++ case 270:
++ width = display->height;
++ height = display->width;
++ break;
++ default:
++ width = display->width;
++ height = display->height;
++ }
++
++ vmem_size = display->width * display->height * bpp / 8;
++ vmem = vzalloc(vmem_size);
++ if (!vmem)
++ goto alloc_fail;
++
++ fbops = devm_kzalloc(dev, sizeof(struct fb_ops), GFP_KERNEL);
++ if (!fbops)
++ goto alloc_fail;
++
++ fbdefio = devm_kzalloc(dev, sizeof(struct fb_deferred_io), GFP_KERNEL);
++ if (!fbdefio)
++ goto alloc_fail;
++
++ buf = devm_kzalloc(dev, 128, GFP_KERNEL);
++ if (!buf)
++ goto alloc_fail;
++
++ if (display->gamma_num && display->gamma_len) {
++ gamma_curves = devm_kzalloc(dev, display->gamma_num * display->gamma_len * sizeof(gamma_curves[0]),
++ GFP_KERNEL);
++ if (!gamma_curves)
++ goto alloc_fail;
++ }
++
++ info = framebuffer_alloc(sizeof(struct fbtft_par), dev);
++ if (!info)
++ goto alloc_fail;
++
++ info->screen_base = (u8 __force __iomem *)vmem;
++ info->fbops = fbops;
++ info->fbdefio = fbdefio;
++
++ fbops->owner = dev->driver->owner;
++ fbops->fb_read = fb_sys_read;
++ fbops->fb_write = fbtft_fb_write;
++ fbops->fb_fillrect = fbtft_fb_fillrect;
++ fbops->fb_copyarea = fbtft_fb_copyarea;
++ fbops->fb_imageblit = fbtft_fb_imageblit;
++ fbops->fb_setcolreg = fbtft_fb_setcolreg;
++ fbops->fb_blank = fbtft_fb_blank;
++
++ fbdefio->delay = HZ/fps;
++ fbdefio->deferred_io = fbtft_deferred_io;
++ fb_deferred_io_init(info);
++
++ strncpy(info->fix.id, dev->driver->name, 16);
++ info->fix.type = FB_TYPE_PACKED_PIXELS;
++ info->fix.visual = FB_VISUAL_TRUECOLOR;
++ info->fix.xpanstep = 0;
++ info->fix.ypanstep = 0;
++ info->fix.ywrapstep = 0;
++ info->fix.line_length = width*bpp/8;
++ info->fix.accel = FB_ACCEL_NONE;
++ info->fix.smem_len = vmem_size;
++
++ info->var.rotate = pdata->rotate;
++ info->var.xres = width;
++ info->var.yres = height;
++ info->var.xres_virtual = info->var.xres;
++ info->var.yres_virtual = info->var.yres;
++ info->var.bits_per_pixel = bpp;
++ info->var.nonstd = 1;
++
++ /* RGB565 */
++ info->var.red.offset = 11;
++ info->var.red.length = 5;
++ info->var.green.offset = 5;
++ info->var.green.length = 6;
++ info->var.blue.offset = 0;
++ info->var.blue.length = 5;
++ info->var.transp.offset = 0;
++ info->var.transp.length = 0;
++
++ info->flags = FBINFO_FLAG_DEFAULT | FBINFO_VIRTFB;
++
++ par = info->par;
++ par->info = info;
++ par->pdata = dev->platform_data;
++ par->debug = display->debug;
++ par->buf = buf;
++ spin_lock_init(&par->dirty_lock);
++ par->bgr = pdata->bgr;
++ par->startbyte = pdata->startbyte;
++ par->init_sequence = init_sequence;
++ par->gamma.curves = gamma_curves;
++ par->gamma.num_curves = display->gamma_num;
++ par->gamma.num_values = display->gamma_len;
++ mutex_init(&par->gamma.lock);
++ info->pseudo_palette = par->pseudo_palette;
++
++ if (par->gamma.curves && gamma) {
++ if (fbtft_gamma_parse_str(par,
++ par->gamma.curves, gamma, strlen(gamma)))
++ goto alloc_fail;
++ }
++
++ /* Transmit buffer */
++ if (txbuflen == -1)
++ txbuflen = vmem_size + 2; /* add in case startbyte is used */
++
++#ifdef __LITTLE_ENDIAN
++ if ((!txbuflen) && (bpp > 8))
++ txbuflen = PAGE_SIZE; /* need buffer for byteswapping */
++#endif
++
++ if (txbuflen > 0) {
++ if (dma) {
++ dev->coherent_dma_mask = ~0;
++ txbuf = dmam_alloc_coherent(dev, txbuflen, &par->txbuf.dma, GFP_DMA);
++ } else {
++ txbuf = devm_kzalloc(par->info->device, txbuflen, GFP_KERNEL);
++ }
++ if (!txbuf)
++ goto alloc_fail;
++ par->txbuf.buf = txbuf;
++ par->txbuf.len = txbuflen;
++ }
++
++ /* Initialize gpios to disabled */
++ par->gpio.reset = -1;
++ par->gpio.dc = -1;
++ par->gpio.rd = -1;
++ par->gpio.wr = -1;
++ par->gpio.cs = -1;
++ par->gpio.latch = -1;
++ for (i = 0; i < 16; i++) {
++ par->gpio.db[i] = -1;
++ par->gpio.led[i] = -1;
++ par->gpio.aux[i] = -1;
++ }
++
++ /* default fbtft operations */
++ par->fbtftops.write = fbtft_write_spi;
++ par->fbtftops.read = fbtft_read_spi;
++ par->fbtftops.write_vmem = fbtft_write_vmem16_bus8;
++ par->fbtftops.write_register = fbtft_write_reg8_bus8;
++ par->fbtftops.set_addr_win = fbtft_set_addr_win;
++ par->fbtftops.reset = fbtft_reset;
++ par->fbtftops.mkdirty = fbtft_mkdirty;
++ par->fbtftops.update_display = fbtft_update_display;
++ par->fbtftops.request_gpios = fbtft_request_gpios;
++ if (display->backlight)
++ par->fbtftops.register_backlight = fbtft_register_backlight;
++
++ /* use driver provided functions */
++ fbtft_merge_fbtftops(&par->fbtftops, &display->fbtftops);
++
++ return info;
++
++alloc_fail:
++ vfree(vmem);
++
++ return NULL;
++}
++EXPORT_SYMBOL(fbtft_framebuffer_alloc);
++
++/**
++ * fbtft_framebuffer_release - frees up all memory used by the framebuffer
++ *
++ * @info: frame buffer info structure
++ *
++ */
++void fbtft_framebuffer_release(struct fb_info *info)
++{
++ fb_deferred_io_cleanup(info);
++ vfree(info->screen_base);
++ framebuffer_release(info);
++}
++EXPORT_SYMBOL(fbtft_framebuffer_release);
++
++/**
++ * fbtft_register_framebuffer - registers a tft frame buffer device
++ * @fb_info: frame buffer info structure
++ *
++ * Sets SPI driverdata if needed
++ * Requests needed gpios.
++ * Initializes display
++ * Updates display.
++ * Registers a frame buffer device @fb_info.
++ *
++ * Returns negative errno on error, or zero for success.
++ *
++ */
++int fbtft_register_framebuffer(struct fb_info *fb_info)
++{
++ int ret;
++ char text1[50] = "";
++ char text2[50] = "";
++ struct fbtft_par *par = fb_info->par;
++ struct spi_device *spi = par->spi;
++
++ /* sanity checks */
++ if (!par->fbtftops.init_display) {
++ dev_err(fb_info->device, "missing fbtftops.init_display()\n");
++ return -EINVAL;
++ }
++
++ if (spi)
++ spi_set_drvdata(spi, fb_info);
++ if (par->pdev)
++ platform_set_drvdata(par->pdev, fb_info);
++
++ ret = par->fbtftops.request_gpios(par);
++ if (ret < 0)
++ goto reg_fail;
++
++ if (par->fbtftops.verify_gpios) {
++ ret = par->fbtftops.verify_gpios(par);
++ if (ret < 0)
++ goto reg_fail;
++ }
++
++ ret = par->fbtftops.init_display(par);
++ if (ret < 0)
++ goto reg_fail;
++ if (par->fbtftops.set_var) {
++ ret = par->fbtftops.set_var(par);
++ if (ret < 0)
++ goto reg_fail;
++ }
++
++ /* update the entire display */
++ par->fbtftops.update_display(par, 0, par->info->var.yres - 1);
++
++ if (par->fbtftops.set_gamma && par->gamma.curves) {
++ ret = par->fbtftops.set_gamma(par, par->gamma.curves);
++ if (ret)
++ goto reg_fail;
++ }
++
++ if (par->fbtftops.register_backlight)
++ par->fbtftops.register_backlight(par);
++
++ ret = register_framebuffer(fb_info);
++ if (ret < 0)
++ goto reg_fail;
++
++ fbtft_sysfs_init(par);
++
++ if (par->txbuf.buf)
++ sprintf(text1, ", %d KiB %sbuffer memory",
++ par->txbuf.len >> 10, par->txbuf.dma ? "DMA " : "");
++ if (spi)
++ sprintf(text2, ", spi%d.%d at %d MHz", spi->master->bus_num,
++ spi->chip_select, spi->max_speed_hz/1000000);
++ dev_info(fb_info->dev,
++ "%s frame buffer, %dx%d, %d KiB video memory%s, fps=%lu%s\n",
++ fb_info->fix.id, fb_info->var.xres, fb_info->var.yres,
++ fb_info->fix.smem_len >> 10, text1,
++ HZ/fb_info->fbdefio->delay, text2);
++
++#ifdef CONFIG_FB_BACKLIGHT
++ /* Turn on backlight if available */
++ if (fb_info->bl_dev) {
++ fb_info->bl_dev->props.power = FB_BLANK_UNBLANK;
++ fb_info->bl_dev->ops->update_status(fb_info->bl_dev);
++ }
++#endif
++
++ return 0;
++
++reg_fail:
++ if (par->fbtftops.unregister_backlight)
++ par->fbtftops.unregister_backlight(par);
++ if (spi)
++ spi_set_drvdata(spi, NULL);
++ if (par->pdev)
++ platform_set_drvdata(par->pdev, NULL);
++
++ return ret;
++}
++EXPORT_SYMBOL(fbtft_register_framebuffer);
++
++/**
++ * fbtft_unregister_framebuffer - releases a tft frame buffer device
++ * @fb_info: frame buffer info structure
++ *
++ * Frees SPI driverdata if needed
++ * Frees gpios.
++ * Unregisters frame buffer device.
++ *
++ */
++int fbtft_unregister_framebuffer(struct fb_info *fb_info)
++{
++ struct fbtft_par *par = fb_info->par;
++ struct spi_device *spi = par->spi;
++ int ret;
++
++ if (spi)
++ spi_set_drvdata(spi, NULL);
++ if (par->pdev)
++ platform_set_drvdata(par->pdev, NULL);
++ if (par->fbtftops.unregister_backlight)
++ par->fbtftops.unregister_backlight(par);
++ fbtft_sysfs_exit(par);
++ ret = unregister_framebuffer(fb_info);
++ return ret;
++}
++EXPORT_SYMBOL(fbtft_unregister_framebuffer);
++
++#ifdef CONFIG_OF
++/**
++ * fbtft_init_display_dt() - Device Tree init_display() function
++ * @par: Driver data
++ *
++ * Return: 0 if successful, negative if error
++ */
++static int fbtft_init_display_dt(struct fbtft_par *par)
++{
++ struct device_node *node = par->info->device->of_node;
++ struct property *prop;
++ const __be32 *p;
++ u32 val;
++ int buf[64], i, j;
++ char msg[128];
++ char str[16];
++
++ fbtft_par_dbg(DEBUG_INIT_DISPLAY, par, "%s()\n", __func__);
++
++ if (!node)
++ return -EINVAL;
++
++ prop = of_find_property(node, "init", NULL);
++ p = of_prop_next_u32(prop, NULL, &val);
++ if (!p)
++ return -EINVAL;
++ while (p) {
++ if (val & FBTFT_OF_INIT_CMD) {
++ val &= 0xFFFF;
++ i = 0;
++ while (p && !(val & 0xFFFF0000)) {
++ if (i > 63) {
++ dev_err(par->info->device,
++ "%s: Maximum register values exceeded\n",
++ __func__);
++ return -EINVAL;
++ }
++ buf[i++] = val;
++ p = of_prop_next_u32(prop, p, &val);
++ }
++ /* make debug message */
++ msg[0] = '\0';
++ for (j = 0; j < i; j++) {
++ snprintf(str, 128, " %02X", buf[j]);
++ strcat(msg, str);
++ }
++ fbtft_par_dbg(DEBUG_INIT_DISPLAY, par,
++ "init: write_register:%s\n", msg);
++
++ par->fbtftops.write_register(par, i,
++ buf[0], buf[1], buf[2], buf[3],
++ buf[4], buf[5], buf[6], buf[7],
++ buf[8], buf[9], buf[10], buf[11],
++ buf[12], buf[13], buf[14], buf[15],
++ buf[16], buf[17], buf[18], buf[19],
++ buf[20], buf[21], buf[22], buf[23],
++ buf[24], buf[25], buf[26], buf[27],
++ buf[28], buf[29], buf[30], buf[31],
++ buf[32], buf[33], buf[34], buf[35],
++ buf[36], buf[37], buf[38], buf[39],
++ buf[40], buf[41], buf[42], buf[43],
++ buf[44], buf[45], buf[46], buf[47],
++ buf[48], buf[49], buf[50], buf[51],
++ buf[52], buf[53], buf[54], buf[55],
++ buf[56], buf[57], buf[58], buf[59],
++ buf[60], buf[61], buf[62], buf[63]);
++ } else if (val & FBTFT_OF_INIT_DELAY) {
++ fbtft_par_dbg(DEBUG_INIT_DISPLAY, par,
++ "init: msleep(%u)\n", val & 0xFFFF);
++ msleep(val & 0xFFFF);
++ p = of_prop_next_u32(prop, p, &val);
++ } else {
++ dev_err(par->info->device, "illegal init value 0x%X\n",
++ val);
++ return -EINVAL;
++ }
++ }
++
++ return 0;
++}
++#endif
++
++/**
++ * fbtft_init_display() - Generic init_display() function
++ * @par: Driver data
++ *
++ * Uses par->init_sequence to do the initialization
++ *
++ * Return: 0 if successful, negative if error
++ */
++int fbtft_init_display(struct fbtft_par *par)
++{
++ int buf[64];
++ char msg[128];
++ char str[16];
++ int i = 0;
++ int j;
++
++ fbtft_par_dbg(DEBUG_INIT_DISPLAY, par, "%s()\n", __func__);
++
++ /* sanity check */
++ if (!par->init_sequence) {
++ dev_err(par->info->device,
++ "error: init_sequence is not set\n");
++ return -EINVAL;
++ }
++
++ /* make sure stop marker exists */
++ for (i = 0; i < FBTFT_MAX_INIT_SEQUENCE; i++)
++ if (par->init_sequence[i] == -3)
++ break;
++ if (i == FBTFT_MAX_INIT_SEQUENCE) {
++ dev_err(par->info->device,
++ "missing stop marker at end of init sequence\n");
++ return -EINVAL;
++ }
++
++ par->fbtftops.reset(par);
++ if (par->gpio.cs != -1)
++ gpio_set_value(par->gpio.cs, 0); /* Activate chip */
++
++ i = 0;
++ while (i < FBTFT_MAX_INIT_SEQUENCE) {
++ if (par->init_sequence[i] == -3) {
++ /* done */
++ return 0;
++ }
++ if (par->init_sequence[i] >= 0) {
++ dev_err(par->info->device,
++ "missing delimiter at position %d\n", i);
++ return -EINVAL;
++ }
++ if (par->init_sequence[i+1] < 0) {
++ dev_err(par->info->device,
++ "missing value after delimiter %d at position %d\n",
++ par->init_sequence[i], i);
++ return -EINVAL;
++ }
++ switch (par->init_sequence[i]) {
++ case -1:
++ i++;
++ /* make debug message */
++ strcpy(msg, "");
++ j = i + 1;
++ while (par->init_sequence[j] >= 0) {
++ sprintf(str, "0x%02X ", par->init_sequence[j]);
++ strcat(msg, str);
++ j++;
++ }
++ fbtft_par_dbg(DEBUG_INIT_DISPLAY, par,
++ "init: write(0x%02X) %s\n",
++ par->init_sequence[i], msg);
++
++ /* Write */
++ j = 0;
++ while (par->init_sequence[i] >= 0) {
++ if (j > 63) {
++ dev_err(par->info->device,
++ "%s: Maximum register values exceeded\n",
++ __func__);
++ return -EINVAL;
++ }
++ buf[j++] = par->init_sequence[i++];
++ }
++ par->fbtftops.write_register(par, j,
++ buf[0], buf[1], buf[2], buf[3],
++ buf[4], buf[5], buf[6], buf[7],
++ buf[8], buf[9], buf[10], buf[11],
++ buf[12], buf[13], buf[14], buf[15],
++ buf[16], buf[17], buf[18], buf[19],
++ buf[20], buf[21], buf[22], buf[23],
++ buf[24], buf[25], buf[26], buf[27],
++ buf[28], buf[29], buf[30], buf[31],
++ buf[32], buf[33], buf[34], buf[35],
++ buf[36], buf[37], buf[38], buf[39],
++ buf[40], buf[41], buf[42], buf[43],
++ buf[44], buf[45], buf[46], buf[47],
++ buf[48], buf[49], buf[50], buf[51],
++ buf[52], buf[53], buf[54], buf[55],
++ buf[56], buf[57], buf[58], buf[59],
++ buf[60], buf[61], buf[62], buf[63]);
++ break;
++ case -2:
++ i++;
++ fbtft_par_dbg(DEBUG_INIT_DISPLAY, par,
++ "init: mdelay(%d)\n", par->init_sequence[i]);
++ mdelay(par->init_sequence[i++]);
++ break;
++ default:
++ dev_err(par->info->device,
++ "unknown delimiter %d at position %d\n",
++ par->init_sequence[i], i);
++ return -EINVAL;
++ }
++ }
++
++ dev_err(par->info->device,
++ "%s: something is wrong. Shouldn't get here.\n", __func__);
++ return -EINVAL;
++}
++EXPORT_SYMBOL(fbtft_init_display);
++
++/**
++ * fbtft_verify_gpios() - Generic verify_gpios() function
++ * @par: Driver data
++ *
++ * Uses @spi, @pdev and @buswidth to determine which GPIOs is needed
++ *
++ * Return: 0 if successful, negative if error
++ */
++static int fbtft_verify_gpios(struct fbtft_par *par)
++{
++ struct fbtft_platform_data *pdata;
++ int i;
++
++ fbtft_par_dbg(DEBUG_VERIFY_GPIOS, par, "%s()\n", __func__);
++
++ pdata = par->info->device->platform_data;
++ if (pdata->display.buswidth != 9 && par->startbyte == 0 && \
++ par->gpio.dc < 0) {
++ dev_err(par->info->device,
++ "Missing info about 'dc' gpio. Aborting.\n");
++ return -EINVAL;
++ }
++
++ if (!par->pdev)
++ return 0;
++
++ if (par->gpio.wr < 0) {
++ dev_err(par->info->device, "Missing 'wr' gpio. Aborting.\n");
++ return -EINVAL;
++ }
++ for (i = 0; i < pdata->display.buswidth; i++) {
++ if (par->gpio.db[i] < 0) {
++ dev_err(par->info->device,
++ "Missing 'db%02d' gpio. Aborting.\n", i);
++ return -EINVAL;
++ }
++ }
++
++ return 0;
++}
++
++#ifdef CONFIG_OF
++/* returns 0 if the property is not present */
++static u32 fbtft_of_value(struct device_node *node, const char *propname)
++{
++ int ret;
++ u32 val = 0;
++
++ ret = of_property_read_u32(node, propname, &val);
++ if (ret == 0)
++ pr_info("%s: %s = %u\n", __func__, propname, val);
++
++ return val;
++}
++
++static struct fbtft_platform_data *fbtft_probe_dt(struct device *dev)
++{
++ struct device_node *node = dev->of_node;
++ struct fbtft_platform_data *pdata;
++
++ if (!node) {
++ dev_err(dev, "Missing platform data or DT\n");
++ return ERR_PTR(-EINVAL);
++ }
++
++ pdata = devm_kzalloc(dev, sizeof(*pdata), GFP_KERNEL);
++ if (!pdata)
++ return ERR_PTR(-ENOMEM);
++
++ pdata->display.width = fbtft_of_value(node, "width");
++ pdata->display.height = fbtft_of_value(node, "height");
++ pdata->display.regwidth = fbtft_of_value(node, "regwidth");
++ pdata->display.buswidth = fbtft_of_value(node, "buswidth");
++ pdata->display.backlight = fbtft_of_value(node, "backlight");
++ pdata->display.bpp = fbtft_of_value(node, "bpp");
++ pdata->display.debug = fbtft_of_value(node, "debug");
++ pdata->rotate = fbtft_of_value(node, "rotate");
++ pdata->bgr = of_property_read_bool(node, "bgr");
++ pdata->fps = fbtft_of_value(node, "fps");
++ pdata->txbuflen = fbtft_of_value(node, "txbuflen");
++ pdata->startbyte = fbtft_of_value(node, "startbyte");
++ of_property_read_string(node, "gamma", (const char **)&pdata->gamma);
++
++ if (of_find_property(node, "led-gpios", NULL))
++ pdata->display.backlight = 1;
++ if (of_find_property(node, "init", NULL))
++ pdata->display.fbtftops.init_display = fbtft_init_display_dt;
++ pdata->display.fbtftops.request_gpios = fbtft_request_gpios_dt;
++
++ return pdata;
++}
++#else
++static struct fbtft_platform_data *fbtft_probe_dt(struct device *dev)
++{
++ dev_err(dev, "Missing platform data\n");
++ return ERR_PTR(-EINVAL);
++}
++#endif
++
++/**
++ * fbtft_probe_common() - Generic device probe() helper function
++ * @display: Display properties
++ * @sdev: SPI device
++ * @pdev: Platform device
++ *
++ * Allocates, initializes and registers a framebuffer
++ *
++ * Either @sdev or @pdev should be NULL
++ *
++ * Return: 0 if successful, negative if error
++ */
++int fbtft_probe_common(struct fbtft_display *display,
++ struct spi_device *sdev, struct platform_device *pdev)
++{
++ struct device *dev;
++ struct fb_info *info;
++ struct fbtft_par *par;
++ struct fbtft_platform_data *pdata;
++ int ret;
++
++ if (sdev)
++ dev = &sdev->dev;
++ else
++ dev = &pdev->dev;
++
++ if (unlikely(display->debug & DEBUG_DRIVER_INIT_FUNCTIONS))
++ dev_info(dev, "%s()\n", __func__);
++
++ pdata = dev->platform_data;
++ if (!pdata) {
++ pdata = fbtft_probe_dt(dev);
++ if (IS_ERR(pdata))
++ return PTR_ERR(pdata);
++ dev->platform_data = pdata;
++ }
++
++ info = fbtft_framebuffer_alloc(display, dev);
++ if (!info)
++ return -ENOMEM;
++
++ par = info->par;
++ par->spi = sdev;
++ par->pdev = pdev;
++
++ if (display->buswidth == 0) {
++ dev_err(dev, "buswidth is not set\n");
++ return -EINVAL;
++ }
++
++ /* write register functions */
++ if (display->regwidth == 8 && display->buswidth == 8) {
++ par->fbtftops.write_register = fbtft_write_reg8_bus8;
++ } else
++ if (display->regwidth == 8 && display->buswidth == 9 && par->spi) {
++ par->fbtftops.write_register = fbtft_write_reg8_bus9;
++ } else if (display->regwidth == 16 && display->buswidth == 8) {
++ par->fbtftops.write_register = fbtft_write_reg16_bus8;
++ } else if (display->regwidth == 16 && display->buswidth == 16) {
++ par->fbtftops.write_register = fbtft_write_reg16_bus16;
++ } else {
++ dev_warn(dev,
++ "no default functions for regwidth=%d and buswidth=%d\n",
++ display->regwidth, display->buswidth);
++ }
++
++ /* write_vmem() functions */
++ if (display->buswidth == 8)
++ par->fbtftops.write_vmem = fbtft_write_vmem16_bus8;
++ else if (display->buswidth == 9)
++ par->fbtftops.write_vmem = fbtft_write_vmem16_bus9;
++ else if (display->buswidth == 16)
++ par->fbtftops.write_vmem = fbtft_write_vmem16_bus16;
++
++ /* GPIO write() functions */
++ if (par->pdev) {
++ if (display->buswidth == 8)
++ par->fbtftops.write = fbtft_write_gpio8_wr;
++ else if (display->buswidth == 16)
++ par->fbtftops.write = fbtft_write_gpio16_wr;
++ }
++
++ /* 9-bit SPI setup */
++ if (par->spi && display->buswidth == 9) {
++ par->spi->bits_per_word = 9;
++ ret = par->spi->master->setup(par->spi);
++ if (ret) {
++ dev_warn(&par->spi->dev,
++ "9-bit SPI not available, emulating using 8-bit.\n");
++ par->spi->bits_per_word = 8;
++ ret = par->spi->master->setup(par->spi);
++ if (ret)
++ goto out_release;
++ /* allocate buffer with room for dc bits */
++ par->extra = devm_kzalloc(par->info->device,
++ par->txbuf.len + (par->txbuf.len / 8) + 8,
++ GFP_KERNEL);
++ if (!par->extra) {
++ ret = -ENOMEM;
++ goto out_release;
++ }
++ par->fbtftops.write = fbtft_write_spi_emulate_9;
++ }
++ }
++
++ if (!par->fbtftops.verify_gpios)
++ par->fbtftops.verify_gpios = fbtft_verify_gpios;
++
++ /* make sure we still use the driver provided functions */
++ fbtft_merge_fbtftops(&par->fbtftops, &display->fbtftops);
++
++ /* use init_sequence if provided */
++ if (par->init_sequence)
++ par->fbtftops.init_display = fbtft_init_display;
++
++ /* use platform_data provided functions above all */
++ fbtft_merge_fbtftops(&par->fbtftops, &pdata->display.fbtftops);
++
++ ret = fbtft_register_framebuffer(info);
++ if (ret < 0)
++ goto out_release;
++
++ return 0;
++
++out_release:
++ fbtft_framebuffer_release(info);
++
++ return ret;
++}
++EXPORT_SYMBOL(fbtft_probe_common);
++
++/**
++ * fbtft_remove_common() - Generic device remove() helper function
++ * @dev: Device
++ * @info: Framebuffer
++ *
++ * Unregisters and releases the framebuffer
++ *
++ * Return: 0 if successful, negative if error
++ */
++int fbtft_remove_common(struct device *dev, struct fb_info *info)
++{
++ struct fbtft_par *par;
++
++ if (!info)
++ return -EINVAL;
++ par = info->par;
++ if (par)
++ fbtft_par_dbg(DEBUG_DRIVER_INIT_FUNCTIONS, par,
++ "%s()\n", __func__);
++ fbtft_unregister_framebuffer(info);
++ fbtft_framebuffer_release(info);
++
++ return 0;
++}
++EXPORT_SYMBOL(fbtft_remove_common);
++
++MODULE_LICENSE("GPL");
+diff -Nur linux-3.18.8/drivers/staging/fbtft/fbtft_device.c linux-rpi/drivers/staging/fbtft/fbtft_device.c
+--- linux-3.18.8/drivers/staging/fbtft/fbtft_device.c 1970-01-01 01:00:00.000000000 +0100
++++ linux-rpi/drivers/staging/fbtft/fbtft_device.c 2015-03-05 14:40:16.345715808 +0100
+@@ -0,0 +1,1444 @@
++/*
++ *
++ * Copyright (C) 2013, Noralf Tronnes
++ *
++ * This program is free software; you can redistribute it and/or modify
++ * it under the terms of the GNU General Public License as published by
++ * the Free Software Foundation; either version 2 of the License, or
++ * (at your option) any later version.
++ *
++ * This program is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
++ * GNU General Public License for more details.
++ *
++ * 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., 675 Mass Ave, Cambridge, MA 02139, USA.
++ */
++
++#include <linux/module.h>
++#include <linux/kernel.h>
++#include <linux/init.h>
++#include <linux/gpio.h>
++#include <linux/spi/spi.h>
++
++#include "fbtft.h"
++
++#define DRVNAME "fbtft_device"
++
++#define MAX_GPIOS 32
++
++struct spi_device *spi_device;
++struct platform_device *p_device;
++
++static char *name;
++module_param(name, charp, 0);
++MODULE_PARM_DESC(name, "Devicename (required). " \
++"name=list => list all supported devices.");
++
++static unsigned rotate;
++module_param(rotate, uint, 0);
++MODULE_PARM_DESC(rotate,
++"Angle to rotate display counter clockwise: 0, 90, 180, 270");
++
++static unsigned busnum;
++module_param(busnum, uint, 0);
++MODULE_PARM_DESC(busnum, "SPI bus number (default=0)");
++
++static unsigned cs;
++module_param(cs, uint, 0);
++MODULE_PARM_DESC(cs, "SPI chip select (default=0)");
++
++static unsigned speed;
++module_param(speed, uint, 0);
++MODULE_PARM_DESC(speed, "SPI speed (override device default)");
++
++static int mode = -1;
++module_param(mode, int, 0);
++MODULE_PARM_DESC(mode, "SPI mode (override device default)");
++
++static char *gpios;
++module_param(gpios, charp, 0);
++MODULE_PARM_DESC(gpios,
++"List of gpios. Comma separated with the form: reset:23,dc:24 " \
++"(when overriding the default, all gpios must be specified)");
++
++static unsigned fps;
++module_param(fps, uint, 0);
++MODULE_PARM_DESC(fps, "Frames per second (override driver default)");
++
++static char *gamma;
++module_param(gamma, charp, 0);
++MODULE_PARM_DESC(gamma,
++"String representation of Gamma Curve(s). Driver specific.");
++
++static int txbuflen;
++module_param(txbuflen, int, 0);
++MODULE_PARM_DESC(txbuflen, "txbuflen (override driver default)");
++
++static int bgr = -1;
++module_param(bgr, int, 0);
++MODULE_PARM_DESC(bgr,
++"BGR bit (supported by some drivers).");
++
++static unsigned startbyte;
++module_param(startbyte, uint, 0);
++MODULE_PARM_DESC(startbyte, "Sets the Start byte used by some SPI displays.");
++
++static bool custom;
++module_param(custom, bool, 0);
++MODULE_PARM_DESC(custom, "Add a custom display device. " \
++"Use speed= argument to make it a SPI device, else platform_device");
++
++static unsigned width;
++module_param(width, uint, 0);
++MODULE_PARM_DESC(width, "Display width, used with the custom argument");
++
++static unsigned height;
++module_param(height, uint, 0);
++MODULE_PARM_DESC(height, "Display height, used with the custom argument");
++
++static unsigned buswidth = 8;
++module_param(buswidth, uint, 0);
++MODULE_PARM_DESC(buswidth, "Display bus width, used with the custom argument");
++
++static int init[FBTFT_MAX_INIT_SEQUENCE];
++static int init_num;
++module_param_array(init, int, &init_num, 0);
++MODULE_PARM_DESC(init, "Init sequence, used with the custom argument");
++
++static unsigned long debug;
++module_param(debug, ulong , 0);
++MODULE_PARM_DESC(debug,
++"level: 0-7 (the remaining 29 bits is for advanced usage)");
++
++static unsigned verbose = 3;
++module_param(verbose, uint, 0);
++MODULE_PARM_DESC(verbose,
++"0 silent, >0 show gpios, >1 show devices, >2 show devices before (default=3)");
++
++
++struct fbtft_device_display {
++ char *name;
++ struct spi_board_info *spi;
++ struct platform_device *pdev;
++};
++
++static void fbtft_device_pdev_release(struct device *dev);
++
++static int write_gpio16_wr_slow(struct fbtft_par *par, void *buf, size_t len);
++static void adafruit18_green_tab_set_addr_win(struct fbtft_par *par,
++ int xs, int ys, int xe, int ye);
++
++#define ADAFRUIT18_GAMMA \
++ "02 1c 07 12 37 32 29 2d 29 25 2B 39 00 01 03 10\n" \
++ "03 1d 07 06 2E 2C 29 2D 2E 2E 37 3F 00 00 02 10"
++
++static int hy28b_init_sequence[] = {
++ -1,0x00e7,0x0010,-1,0x0000,0x0001,-1,0x0001,0x0100,-1,0x0002,0x0700,
++ -1,0x0003,0x1030,-1,0x0004,0x0000,-1,0x0008,0x0207,-1,0x0009,0x0000,
++ -1,0x000a,0x0000,-1,0x000c,0x0001,-1,0x000d,0x0000,-1,0x000f,0x0000,
++ -1,0x0010,0x0000,-1,0x0011,0x0007,-1,0x0012,0x0000,-1,0x0013,0x0000,
++ -2,50,-1,0x0010,0x1590,-1,0x0011,0x0227,-2,50,-1,0x0012,0x009c,-2,50,
++ -1,0x0013,0x1900,-1,0x0029,0x0023,-1,0x002b,0x000e,-2,50,
++ -1,0x0020,0x0000,-1,0x0021,0x0000,-2,50,-1,0x0050,0x0000,
++ -1,0x0051,0x00ef,-1,0x0052,0x0000,-1,0x0053,0x013f,-1,0x0060,0xa700,
++ -1,0x0061,0x0001,-1,0x006a,0x0000,-1,0x0080,0x0000,-1,0x0081,0x0000,
++ -1,0x0082,0x0000,-1,0x0083,0x0000,-1,0x0084,0x0000,-1,0x0085,0x0000,
++ -1,0x0090,0x0010,-1,0x0092,0x0000,-1,0x0093,0x0003,-1,0x0095,0x0110,
++ -1,0x0097,0x0000,-1,0x0098,0x0000,-1,0x0007,0x0133,-1,0x0020,0x0000,
++ -1,0x0021,0x0000,-2,100,-3 };
++
++#define HY28B_GAMMA \
++ "04 1F 4 7 7 0 7 7 6 0\n" \
++ "0F 00 1 7 4 0 0 0 6 7"
++
++static int pitft_init_sequence[] = {
++ -1,0x01,-2,5,-1,0x28,-1,0xEF,0x03,0x80,0x02,-1,0xCF,0x00,0xC1,0x30,
++ -1,0xED,0x64,0x03,0x12,0x81,-1,0xE8,0x85,0x00,0x78,
++ -1,0xCB,0x39,0x2C,0x00,0x34,0x02,-1,0xF7,0x20,-1,0xEA,0x00,0x00,
++ -1,0xC0,0x23,-1,0xC1,0x10,-1,0xC5,0x3e,0x28,-1,0xC7,0x86,-1,0x3A,0x55,
++ -1,0xB1,0x00,0x18,-1,0xB6,0x08,0x82,0x27,-1,0xF2,0x00,-1,0x26,0x01,
++ -1,0xE0,0x0F,0x31,0x2B,0x0C,0x0E,0x08,0x4E,0xF1,0x37,0x07,0x10,0x03,
++ 0x0E,0x09,0x00,-1,0xE1,0x00,0x0E,0x14,0x03,0x11,0x07,0x31,0xC1,0x48,
++ 0x08,0x0F,0x0C,0x31,0x36,0x0F,-1,0x11,-2,100,-1,0x29,-2,20,-3 };
++
++static int waveshare32b_init_sequence[] = {
++ -1,0xCB,0x39,0x2C,0x00,0x34,0x02,-1,0xCF,0x00,0xC1,0x30,
++ -1,0xE8,0x85,0x00,0x78,-1,0xEA,0x00,0x00,-1,0xED,0x64,0x03,0x12,0x81,
++ -1,0xF7,0x20,-1,0xC0,0x23,-1,0xC1,0x10,-1,0xC5,0x3e,0x28,-1,0xC7,0x86,
++ -1,0x36,0x28,-1,0x3A,0x55,-1,0xB1,0x00,0x18,-1,0xB6,0x08,0x82,0x27,
++ -1,0xF2,0x00,-1,0x26,0x01,
++ -1,0xE0,0x0F,0x31,0x2B,0x0C,0x0E,0x08,0x4E,0xF1,0x37,0x07,0x10,0x03,0x0E,0x09,0x00,
++ -1,0xE1,0x00,0x0E,0x14,0x03,0x11,0x07,0x31,0xC1,0x48,0x08,0x0F,0x0C,0x31,0x36,0x0F,
++ -1,0x11,-2,120,-1,0x29,-1,0x2c,-3 };
++
++/* Supported displays in alphabetical order */
++static struct fbtft_device_display displays[] = {
++ {
++ .name = "adafruit18",
++ .spi = &(struct spi_board_info) {
++ .modalias = "fb_st7735r",
++ .max_speed_hz = 32000000,
++ .mode = SPI_MODE_0,
++ .platform_data = &(struct fbtft_platform_data) {
++ .display = {
++ .buswidth = 8,
++ .backlight = 1,
++ },
++ .gpios = (const struct fbtft_gpio []) {
++ { "reset", 25 },
++ { "dc", 24 },
++ { "led", 18 },
++ {},
++ },
++ .gamma = ADAFRUIT18_GAMMA,
++ }
++ }
++ }, {
++ .name = "adafruit18_green",
++ .spi = &(struct spi_board_info) {
++ .modalias = "fb_st7735r",
++ .max_speed_hz = 4000000,
++ .mode = SPI_MODE_0,
++ .platform_data = &(struct fbtft_platform_data) {
++ .display = {
++ .buswidth = 8,
++ .backlight = 1,
++ .fbtftops.set_addr_win = \
++ adafruit18_green_tab_set_addr_win,
++ },
++ .bgr = true,
++ .gpios = (const struct fbtft_gpio []) {
++ { "reset", 25 },
++ { "dc", 24 },
++ { "led", 18 },
++ {},
++ },
++ .gamma = ADAFRUIT18_GAMMA,
++ }
++ }
++ }, {
++ .name = "adafruit22",
++ .spi = &(struct spi_board_info) {
++ .modalias = "fb_hx8340bn",
++ .max_speed_hz = 32000000,
++ .mode = SPI_MODE_0,
++ .platform_data = &(struct fbtft_platform_data) {
++ .display = {
++ .buswidth = 9,
++ .backlight = 1,
++ },
++ .bgr = true,
++ .gpios = (const struct fbtft_gpio []) {
++ { "reset", 25 },
++ { "led", 23 },
++ {},
++ },
++ }
++ }
++ }, {
++ .name = "adafruit22a",
++ .spi = &(struct spi_board_info) {
++ .modalias = "fb_ili9340",
++ .max_speed_hz = 32000000,
++ .mode = SPI_MODE_0,
++ .platform_data = &(struct fbtft_platform_data) {
++ .display = {
++ .buswidth = 8,
++ .backlight = 1,
++ },
++ .bgr = true,
++ .gpios = (const struct fbtft_gpio []) {
++ { "reset", 25 },
++ { "dc", 24 },
++ { "led", 18 },
++ {},
++ },
++ }
++ }
++ }, {
++ .name = "adafruit28",
++ .spi = &(struct spi_board_info) {
++ .modalias = "fb_ili9341",
++ .max_speed_hz = 32000000,
++ .mode = SPI_MODE_0,
++ .platform_data = &(struct fbtft_platform_data) {
++ .display = {
++ .buswidth = 8,
++ .backlight = 1,
++ },
++ .bgr = true,
++ .gpios = (const struct fbtft_gpio []) {
++ { "reset", 25 },
++ { "dc", 24 },
++ { "led", 18 },
++ {},
++ },
++ }
++ }
++ }, {
++ .name = "adafruit13m",
++ .spi = &(struct spi_board_info) {
++ .modalias = "fb_ssd1306",
++ .max_speed_hz = 16000000,
++ .mode = SPI_MODE_0,
++ .platform_data = &(struct fbtft_platform_data) {
++ .display = {
++ .buswidth = 8,
++ },
++ .gpios = (const struct fbtft_gpio []) {
++ { "reset", 25 },
++ { "dc", 24 },
++ {},
++ },
++ }
++ }
++ }, {
++ .name = "agm1264k-fl",
++ .pdev = &(struct platform_device) {
++ .name = "fb_agm1264k-fl",
++ .id = 0,
++ .dev = {
++ .release = fbtft_device_pdev_release,
++ .platform_data = &(struct fbtft_platform_data) {
++ .display = {
++ .buswidth = 8,
++ .backlight = FBTFT_ONBOARD_BACKLIGHT,
++ },
++ .gpios = (const struct fbtft_gpio []) {
++ {},
++ },
++ },
++ }
++ }
++ }, {
++ .name = "dogs102",
++ .spi = &(struct spi_board_info) {
++ .modalias = "fb_uc1701",
++ .max_speed_hz = 8000000,
++ .mode = SPI_MODE_0,
++ .platform_data = &(struct fbtft_platform_data) {
++ .display = {
++ .buswidth = 8,
++ },
++ .bgr = true,
++ .gpios = (const struct fbtft_gpio []) {
++ { "reset", 13 },
++ { "dc", 6 },
++ {},
++ },
++ }
++ }
++ }, {
++ .name = "er_tftm050_2",
++ .spi = &(struct spi_board_info) {
++ .modalias = "fb_ra8875",
++ .max_speed_hz = 5000000,
++ .mode = SPI_MODE_3,
++ .platform_data = &(struct fbtft_platform_data) {
++ .display = {
++ .buswidth = 8,
++ .backlight = 1,
++ .width = 480,
++ .height = 272,
++ },
++ .bgr = true,
++ .gpios = (const struct fbtft_gpio []) {
++ { "reset", 25 },
++ { "dc", 24 },
++ {},
++ },
++ }
++ }
++ }, {
++ .name = "er_tftm070_5",
++ .spi = &(struct spi_board_info) {
++ .modalias = "fb_ra8875",
++ .max_speed_hz = 5000000,
++ .mode = SPI_MODE_3,
++ .platform_data = &(struct fbtft_platform_data) {
++ .display = {
++ .buswidth = 8,
++ .backlight = 1,
++ .width = 800,
++ .height = 480,
++ },
++ .bgr = true,
++ .gpios = (const struct fbtft_gpio []) {
++ { "reset", 25 },
++ { "dc", 24 },
++ {},
++ },
++ }
++ }
++ }, {
++ .name = "flexfb",
++ .spi = &(struct spi_board_info) {
++ .modalias = "flexfb",
++ .max_speed_hz = 32000000,
++ .mode = SPI_MODE_0,
++ .platform_data = &(struct fbtft_platform_data) {
++ .gpios = (const struct fbtft_gpio []) {
++ { "reset", 25 },
++ { "dc", 24 },
++ {},
++ },
++ }
++ }
++ }, {
++ .name = "flexpfb",
++ .pdev = &(struct platform_device) {
++ .name = "flexpfb",
++ .id = 0,
++ .dev = {
++ .release = fbtft_device_pdev_release,
++ .platform_data = &(struct fbtft_platform_data) {
++ .gpios = (const struct fbtft_gpio []) {
++ { "reset", 17 },
++ { "dc", 1 },
++ { "wr", 0 },
++ { "cs", 21 },
++ { "db00", 9 },
++ { "db01", 11 },
++ { "db02", 18 },
++ { "db03", 23 },
++ { "db04", 24 },
++ { "db05", 25 },
++ { "db06", 8 },
++ { "db07", 7 },
++ { "led", 4 },
++ {},
++ },
++ },
++ }
++ }
++ }, {
++ .name = "freetronicsoled128",
++ .spi = &(struct spi_board_info) {
++ .modalias = "fb_ssd1351",
++ .max_speed_hz = 20000000,
++ .mode = SPI_MODE_0,
++ .platform_data = &(struct fbtft_platform_data) {
++ .display = {
++ .buswidth = 8,
++ .backlight = FBTFT_ONBOARD_BACKLIGHT,
++ },
++ .bgr = true,
++ .gpios = (const struct fbtft_gpio []) {
++ { "reset", 24 },
++ { "dc", 25 },
++ {},
++ },
++ }
++ }
++ }, {
++ .name = "hx8353d",
++ .spi = &(struct spi_board_info) {
++ .modalias = "fb_hx8353d",
++ .max_speed_hz = 16000000,
++ .mode = SPI_MODE_0,
++ .platform_data = &(struct fbtft_platform_data) {
++ .display = {
++ .buswidth = 8,
++ .backlight = 1,
++ },
++ .gpios = (const struct fbtft_gpio []) {
++ { "reset", 25 },
++ { "dc", 24 },
++ { "led", 23 },
++ {},
++ },
++ }
++ }
++ }, {
++ .name = "hy28a",
++ .spi = &(struct spi_board_info) {
++ .modalias = "fb_ili9320",
++ .max_speed_hz = 32000000,
++ .mode = SPI_MODE_3,
++ .platform_data = &(struct fbtft_platform_data) {
++ .display = {
++ .buswidth = 8,
++ .backlight = 1,
++ },
++ .startbyte = 0b01110000,
++ .bgr = true,
++ .gpios = (const struct fbtft_gpio []) {
++ { "reset", 25 },
++ { "led", 18 },
++ {},
++ },
++ }
++ }
++ }, {
++ .name = "hy28b",
++ .spi = &(struct spi_board_info) {
++ .modalias = "fb_ili9325",
++ .max_speed_hz = 48000000,
++ .mode = SPI_MODE_3,
++ .platform_data = &(struct fbtft_platform_data) {
++ .display = {
++ .buswidth = 8,
++ .backlight = 1,
++ .init_sequence = hy28b_init_sequence,
++ },
++ .startbyte = 0b01110000,
++ .bgr = true,
++ .fps= 50,
++ .gpios = (const struct fbtft_gpio []) {
++ { "reset", 25 },
++ { "led", 18 },
++ {},
++ },
++ .gamma = HY28B_GAMMA,
++ }
++ }
++ }, {
++ .name = "ili9481",
++ .spi = &(struct spi_board_info) {
++ .modalias = "fb_ili9481",
++ .max_speed_hz = 32000000,
++ .mode = SPI_MODE_0,
++ .platform_data = &(struct fbtft_platform_data) {
++ .display = {
++ .regwidth = 16,
++ .buswidth = 8,
++ .backlight = 1,
++ },
++ .bgr = true,
++ .gpios = (const struct fbtft_gpio []) {
++ { "reset", 25 },
++ { "dc", 24 },
++ { "led", 22 },
++ {},
++ },
++ }
++ }
++ }, {
++ .name = "itdb24",
++ .pdev = &(struct platform_device) {
++ .name = "fb_s6d1121",
++ .id = 0,
++ .dev = {
++ .release = fbtft_device_pdev_release,
++ .platform_data = &(struct fbtft_platform_data) {
++ .display = {
++ .buswidth = 8,
++ .backlight = 1,
++ },
++ .bgr = false,
++ .gpios = (const struct fbtft_gpio []) {
++ /* Wiring for LCD adapter kit */
++ { "reset", 7 },
++ { "dc", 0 }, /* rev 2: 2 */
++ { "wr", 1 }, /* rev 2: 3 */
++ { "cs", 8 },
++ { "db00", 17 },
++ { "db01", 18 },
++ { "db02", 21 }, /* rev 2: 27 */
++ { "db03", 22 },
++ { "db04", 23 },
++ { "db05", 24 },
++ { "db06", 25 },
++ { "db07", 4 },
++ {}
++ },
++ },
++ }
++ }
++ }, {
++ .name = "itdb28",
++ .pdev = &(struct platform_device) {
++ .name = "fb_ili9325",
++ .id = 0,
++ .dev = {
++ .release = fbtft_device_pdev_release,
++ .platform_data = &(struct fbtft_platform_data) {
++ .display = {
++ .buswidth = 8,
++ .backlight = 1,
++ },
++ .bgr = true,
++ .gpios = (const struct fbtft_gpio []) {
++ {},
++ },
++ },
++ }
++ }
++ }, {
++ .name = "itdb28_spi",
++ .spi = &(struct spi_board_info) {
++ .modalias = "fb_ili9325",
++ .max_speed_hz = 32000000,
++ .mode = SPI_MODE_0,
++ .platform_data = &(struct fbtft_platform_data) {
++ .display = {
++ .buswidth = 8,
++ .backlight = 1,
++ },
++ .bgr = true,
++ .gpios = (const struct fbtft_gpio []) {
++ { "reset", 25 },
++ { "dc", 24 },
++ {},
++ },
++ }
++ }
++ }, {
++ .name = "mi0283qt-2",
++ .spi = &(struct spi_board_info) {
++ .modalias = "fb_hx8347d",
++ .max_speed_hz = 32000000,
++ .mode = SPI_MODE_0,
++ .platform_data = &(struct fbtft_platform_data) {
++ .display = {
++ .buswidth = 8,
++ .backlight = 1,
++ },
++ .startbyte = 0b01110000,
++ .bgr = true,
++ .gpios = (const struct fbtft_gpio []) {
++ { "reset", 25 },
++ { "dc", 24 },
++ { "led", 18 },
++ {},
++ },
++ }
++ }
++ }, {
++ .name = "mi0283qt-9a",
++ .spi = &(struct spi_board_info) {
++ .modalias = "fb_ili9341",
++ .max_speed_hz = 32000000,
++ .mode = SPI_MODE_0,
++ .platform_data = &(struct fbtft_platform_data) {
++ .display = {
++ .buswidth = 9,
++ .backlight = 1,
++ },
++ .bgr = true,
++ .gpios = (const struct fbtft_gpio []) {
++ { "reset", 25 },
++ { "led", 18 },
++ {},
++ },
++ }
++ }
++ }, {
++ .name = "mi0283qt-v2",
++ .spi = &(struct spi_board_info) {
++ .modalias = "fb_watterott",
++ .max_speed_hz = 4000000,
++ .mode = SPI_MODE_3,
++ .platform_data = &(struct fbtft_platform_data) {
++ .gpios = (const struct fbtft_gpio []) {
++ { "reset", 25 },
++ {},
++ },
++ }
++ }
++ }, {
++ .name = "nokia3310",
++ .spi = &(struct spi_board_info) {
++ .modalias = "fb_pcd8544",
++ .max_speed_hz = 400000,
++ .mode = SPI_MODE_0,
++ .platform_data = &(struct fbtft_platform_data) {
++ .display = {
++ .buswidth = 8,
++ },
++ .gpios = (const struct fbtft_gpio []) {
++ { "reset", 25 },
++ { "dc", 24 },
++ { "led", 23 },
++ {},
++ },
++ }
++ }
++ }, {
++ .name = "nokia3310a",
++ .spi = &(struct spi_board_info) {
++ .modalias = "fb_tls8204",
++ .max_speed_hz = 1000000,
++ .mode = SPI_MODE_0,
++ .platform_data = &(struct fbtft_platform_data) {
++ .display = {
++ .buswidth = 8,
++ },
++ .gpios = (const struct fbtft_gpio []) {
++ { "reset", 25 },
++ { "dc", 24 },
++ { "led", 23 },
++ {},
++ },
++ }
++ }
++ }, {
++ .name = "piscreen",
++ .spi = &(struct spi_board_info) {
++ .modalias = "fb_ili9486",
++ .max_speed_hz = 32000000,
++ .mode = SPI_MODE_0,
++ .platform_data = &(struct fbtft_platform_data) {
++ .display = {
++ .regwidth = 16,
++ .buswidth = 8,
++ .backlight = 1,
++ },
++ .bgr = true,
++ .gpios = (const struct fbtft_gpio []) {
++ { "reset", 25 },
++ { "dc", 24 },
++ { "led", 22 },
++ {},
++ },
++ }
++ }
++ }, {
++ .name = "pitft",
++ .spi = &(struct spi_board_info) {
++ .modalias = "fb_ili9340",
++ .max_speed_hz = 32000000,
++ .mode = SPI_MODE_0,
++ .chip_select = 0,
++ .platform_data = &(struct fbtft_platform_data) {
++ .display = {
++ .buswidth = 8,
++ .backlight = 1,
++ .init_sequence = pitft_init_sequence,
++ },
++ .bgr = true,
++ .gpios = (const struct fbtft_gpio []) {
++ { "dc", 25 },
++ {},
++ },
++ }
++ }
++ }, {
++ .name = "pioled",
++ .spi = &(struct spi_board_info) {
++ .modalias = "fb_ssd1351",
++ .max_speed_hz = 20000000,
++ .mode = SPI_MODE_0,
++ .platform_data = &(struct fbtft_platform_data) {
++ .display = {
++ .buswidth = 8,
++ },
++ .bgr = true,
++ .gpios = (const struct fbtft_gpio []) {
++ { "reset", 24 },
++ { "dc", 25 },
++ {},
++ },
++ .gamma = "0 2 2 2 2 2 2 2 " \
++ "2 2 2 2 2 2 2 2 " \
++ "2 2 2 2 2 2 2 2 " \
++ "2 2 2 2 2 2 2 3 " \
++ "3 3 3 3 3 3 3 3 " \
++ "3 3 3 3 3 3 3 3 " \
++ "3 3 3 4 4 4 4 4 " \
++ "4 4 4 4 4 4 4"
++ }
++ }
++ }, {
++ .name = "rpi-display",
++ .spi = &(struct spi_board_info) {
++ .modalias = "fb_ili9341",
++ .max_speed_hz = 32000000,
++ .mode = SPI_MODE_0,
++ .platform_data = &(struct fbtft_platform_data) {
++ .display = {
++ .buswidth = 8,
++ .backlight = 1,
++ },
++ .bgr = true,
++ .gpios = (const struct fbtft_gpio []) {
++ { "reset", 23 },
++ { "dc", 24 },
++ { "led", 18 },
++ {},
++ },
++ }
++ }
++ }, {
++ .name = "s6d02a1",
++ .spi = &(struct spi_board_info) {
++ .modalias = "fb_s6d02a1",
++ .max_speed_hz = 32000000,
++ .mode = SPI_MODE_0,
++ .platform_data = &(struct fbtft_platform_data) {
++ .display = {
++ .buswidth = 8,
++ .backlight = 1,
++ },
++ .bgr = true,
++ .gpios = (const struct fbtft_gpio []) {
++ { "reset", 25 },
++ { "dc", 24 },
++ { "led", 23 },
++ {},
++ },
++ }
++ }
++ }, {
++ .name = "sainsmart18",
++ .spi = &(struct spi_board_info) {
++ .modalias = "fb_st7735r",
++ .max_speed_hz = 32000000,
++ .mode = SPI_MODE_0,
++ .platform_data = &(struct fbtft_platform_data) {
++ .display = {
++ .buswidth = 8,
++ },
++ .gpios = (const struct fbtft_gpio []) {
++ { "reset", 25 },
++ { "dc", 24 },
++ {},
++ },
++ }
++ }
++ }, {
++ .name = "sainsmart32",
++ .pdev = &(struct platform_device) {
++ .name = "fb_ssd1289",
++ .id = 0,
++ .dev = {
++ .release = fbtft_device_pdev_release,
++ .platform_data = &(struct fbtft_platform_data) {
++ .display = {
++ .buswidth = 16,
++ .txbuflen = -2, /* disable buffer */
++ .backlight = 1,
++ .fbtftops.write = write_gpio16_wr_slow,
++ },
++ .bgr = true,
++ .gpios = (const struct fbtft_gpio []) {
++ {},
++ },
++ },
++ },
++ }
++ }, {
++ .name = "sainsmart32_fast",
++ .pdev = &(struct platform_device) {
++ .name = "fb_ssd1289",
++ .id = 0,
++ .dev = {
++ .release = fbtft_device_pdev_release,
++ .platform_data = &(struct fbtft_platform_data) {
++ .display = {
++ .buswidth = 16,
++ .txbuflen = -2, /* disable buffer */
++ .backlight = 1,
++ },
++ .bgr = true,
++ .gpios = (const struct fbtft_gpio []) {
++ {},
++ },
++ },
++ },
++ }
++ }, {
++ .name = "sainsmart32_latched",
++ .pdev = &(struct platform_device) {
++ .name = "fb_ssd1289",
++ .id = 0,
++ .dev = {
++ .release = fbtft_device_pdev_release,
++ .platform_data = &(struct fbtft_platform_data) {
++ .display = {
++ .buswidth = 16,
++ .txbuflen = -2, /* disable buffer */
++ .backlight = 1,
++ .fbtftops.write = \
++ fbtft_write_gpio16_wr_latched,
++ },
++ .bgr = true,
++ .gpios = (const struct fbtft_gpio []) {
++ {},
++ },
++ },
++ },
++ }
++ }, {
++ .name = "sainsmart32_spi",
++ .spi = &(struct spi_board_info) {
++ .modalias = "fb_ssd1289",
++ .max_speed_hz = 16000000,
++ .mode = SPI_MODE_0,
++ .platform_data = &(struct fbtft_platform_data) {
++ .display = {
++ .buswidth = 8,
++ .backlight = 1,
++ },
++ .bgr = true,
++ .gpios = (const struct fbtft_gpio []) {
++ { "reset", 25 },
++ { "dc", 24 },
++ {},
++ },
++ }
++ }
++ }, {
++ .name = "spidev",
++ .spi = &(struct spi_board_info) {
++ .modalias = "spidev",
++ .max_speed_hz = 500000,
++ .bus_num = 0,
++ .chip_select = 0,
++ .mode = SPI_MODE_0,
++ .platform_data = &(struct fbtft_platform_data) {
++ .gpios = (const struct fbtft_gpio []) {
++ {},
++ },
++ }
++ }
++ }, {
++ .name = "ssd1331",
++ .spi = &(struct spi_board_info) {
++ .modalias = "fb_ssd1331",
++ .max_speed_hz = 20000000,
++ .mode = SPI_MODE_3,
++ .platform_data = &(struct fbtft_platform_data) {
++ .display = {
++ .buswidth = 8,
++ },
++ .gpios = (const struct fbtft_gpio []) {
++ { "reset", 24 },
++ { "dc", 25 },
++ {},
++ },
++ }
++ }
++ }, {
++ .name = "tinylcd35",
++ .spi = &(struct spi_board_info) {
++ .modalias = "fb_tinylcd",
++ .max_speed_hz = 32000000,
++ .mode = SPI_MODE_0,
++ .platform_data = &(struct fbtft_platform_data) {
++ .display = {
++ .buswidth = 8,
++ .backlight = 1,
++ },
++ .bgr = true,
++ .gpios = (const struct fbtft_gpio []) {
++ { "reset", 25 },
++ { "dc", 24 },
++ { "led", 18 },
++ {},
++ },
++ }
++ }
++ }, {
++ .name = "tm022hdh26",
++ .spi = &(struct spi_board_info) {
++ .modalias = "fb_ili9341",
++ .max_speed_hz = 32000000,
++ .mode = SPI_MODE_0,
++ .platform_data = &(struct fbtft_platform_data) {
++ .display = {
++ .buswidth = 8,
++ .backlight = 1,
++ },
++ .bgr = true,
++ .gpios = (const struct fbtft_gpio []) {
++ { "reset", 25 },
++ { "dc", 24 },
++ { "led", 18 },
++ {},
++ },
++ }
++ }
++ }, {
++ .name = "tontec35_9481", /* boards before 02 July 2014 */
++ .spi = &(struct spi_board_info) {
++ .modalias = "fb_ili9481",
++ .max_speed_hz = 128000000,
++ .mode = SPI_MODE_3,
++ .platform_data = &(struct fbtft_platform_data) {
++ .display = {
++ .buswidth = 8,
++ .backlight = 1,
++ },
++ .bgr = true,
++ .gpios = (const struct fbtft_gpio []) {
++ { "reset", 15 },
++ { "dc", 25 },
++ { "led_", 18 },
++ {},
++ },
++ }
++ }
++ }, {
++ .name = "tontec35_9486", /* boards after 02 July 2014 */
++ .spi = &(struct spi_board_info) {
++ .modalias = "fb_ili9486",
++ .max_speed_hz = 128000000,
++ .mode = SPI_MODE_3,
++ .platform_data = &(struct fbtft_platform_data) {
++ .display = {
++ .buswidth = 8,
++ .backlight = 1,
++ },
++ .bgr = true,
++ .gpios = (const struct fbtft_gpio []) {
++ { "reset", 15 },
++ { "dc", 25 },
++ { "led_", 18 },
++ {},
++ },
++ }
++ }
++ }, {
++ .name = "upd161704",
++ .spi = &(struct spi_board_info) {
++ .modalias = "fb_upd161704",
++ .max_speed_hz = 32000000,
++ .mode = SPI_MODE_0,
++ .platform_data = &(struct fbtft_platform_data) {
++ .display = {
++ .buswidth = 8,
++ },
++ .gpios = (const struct fbtft_gpio []) {
++ { "reset", 24 },
++ { "dc", 25 },
++ {},
++ },
++ }
++ }
++ }, {
++ .name = "waveshare32b",
++ .spi = &(struct spi_board_info) {
++ .modalias = "fb_ili9340",
++ .max_speed_hz = 48000000,
++ .mode = SPI_MODE_0,
++ .platform_data = &(struct fbtft_platform_data) {
++ .display = {
++ .buswidth = 8,
++ .backlight = 1,
++ .init_sequence = waveshare32b_init_sequence,
++ },
++ .bgr = true,
++ .gpios = (const struct fbtft_gpio []) {
++ { "reset", 27 },
++ { "dc", 22 },
++ {},
++ },
++ }
++ }
++ }, {
++ .name = "waveshare22",
++ .spi = &(struct spi_board_info) {
++ .modalias = "fb_bd663474",
++ .max_speed_hz = 32000000,
++ .mode = SPI_MODE_3,
++ .platform_data = &(struct fbtft_platform_data) {
++ .display = {
++ .buswidth = 8,
++ },
++ .gpios = (const struct fbtft_gpio []) {
++ { "reset", 24 },
++ { "dc", 25 },
++ {},
++ },
++ }
++ }
++ }, {
++ /* This should be the last item.
++ Used with the custom argument */
++ .name = "",
++ .spi = &(struct spi_board_info) {
++ .modalias = "",
++ .max_speed_hz = 0,
++ .mode = SPI_MODE_0,
++ .platform_data = &(struct fbtft_platform_data) {
++ .gpios = (const struct fbtft_gpio []) {
++ {},
++ },
++ }
++ },
++ .pdev = &(struct platform_device) {
++ .name = "",
++ .id = 0,
++ .dev = {
++ .release = fbtft_device_pdev_release,
++ .platform_data = &(struct fbtft_platform_data) {
++ .gpios = (const struct fbtft_gpio []) {
++ {},
++ },
++ },
++ },
++ },
++ }
++};
++
++static int write_gpio16_wr_slow(struct fbtft_par *par, void *buf, size_t len)
++{
++ u16 data;
++ int i;
++#ifndef DO_NOT_OPTIMIZE_FBTFT_WRITE_GPIO
++ static u16 prev_data;
++#endif
++
++ fbtft_par_dbg_hex(DEBUG_WRITE, par, par->info->device, u8, buf, len,
++ "%s(len=%d): ", __func__, len);
++
++ while (len) {
++ data = *(u16 *) buf;
++
++ /* Start writing by pulling down /WR */
++ gpio_set_value(par->gpio.wr, 0);
++
++ /* Set data */
++#ifndef DO_NOT_OPTIMIZE_FBTFT_WRITE_GPIO
++ if (data == prev_data) {
++ gpio_set_value(par->gpio.wr, 0); /* used as delay */
++ } else {
++ for (i = 0; i < 16; i++) {
++ if ((data & 1) != (prev_data & 1))
++ gpio_set_value(par->gpio.db[i],
++ (data & 1));
++ data >>= 1;
++ prev_data >>= 1;
++ }
++ }
++#else
++ for (i = 0; i < 16; i++) {
++ gpio_set_value(par->gpio.db[i], (data & 1));
++ data >>= 1;
++ }
++#endif
++
++ /* Pullup /WR */
++ gpio_set_value(par->gpio.wr, 1);
++
++#ifndef DO_NOT_OPTIMIZE_FBTFT_WRITE_GPIO
++ prev_data = *(u16 *) buf;
++#endif
++ buf += 2;
++ len -= 2;
++ }
++
++ return 0;
++}
++
++static void adafruit18_green_tab_set_addr_win(struct fbtft_par *par,
++ int xs, int ys, int xe, int ye)
++{
++ fbtft_par_dbg(DEBUG_SET_ADDR_WIN, par,
++ "%s(xs=%d, ys=%d, xe=%d, ye=%d)\n", __func__, xs, ys, xe, ye);
++ write_reg(par, 0x2A, 0, xs + 2, 0, xe + 2);
++ write_reg(par, 0x2B, 0, ys + 1, 0, ye + 1);
++ write_reg(par, 0x2C);
++}
++
++/* used if gpios parameter is present */
++static struct fbtft_gpio fbtft_device_param_gpios[MAX_GPIOS+1] = { };
++
++static void fbtft_device_pdev_release(struct device *dev)
++{
++/* Needed to silence this message:
++Device 'xxx' does not have a release() function, it is broken and must be fixed
++*/
++}
++
++static int spi_device_found(struct device *dev, void *data)
++{
++ struct spi_device *spi = container_of(dev, struct spi_device, dev);
++
++ pr_info(DRVNAME": %s %s %dkHz %d bits mode=0x%02X\n",
++ spi->modalias, dev_name(dev), spi->max_speed_hz/1000,
++ spi->bits_per_word, spi->mode);
++
++ return 0;
++}
++
++static void pr_spi_devices(void)
++{
++ pr_info(DRVNAME": SPI devices registered:\n");
++ bus_for_each_dev(&spi_bus_type, NULL, NULL, spi_device_found);
++}
++
++static int p_device_found(struct device *dev, void *data)
++{
++ struct platform_device
++ *pdev = container_of(dev, struct platform_device, dev);
++
++ if (strstr(pdev->name, "fb"))
++ pr_info(DRVNAME": %s id=%d pdata? %s\n",
++ pdev->name, pdev->id,
++ pdev->dev.platform_data ? "yes" : "no");
++
++ return 0;
++}
++
++static void pr_p_devices(void)
++{
++ pr_info(DRVNAME": 'fb' Platform devices registered:\n");
++ bus_for_each_dev(&platform_bus_type, NULL, NULL, p_device_found);
++}
++
++#ifdef MODULE
++static void fbtft_device_spi_delete(struct spi_master *master, unsigned cs)
++{
++ struct device *dev;
++ char str[32];
++
++ snprintf(str, sizeof(str), "%s.%u", dev_name(&master->dev), cs);
++
++ dev = bus_find_device_by_name(&spi_bus_type, NULL, str);
++ if (dev) {
++ if (verbose)
++ pr_info(DRVNAME": Deleting %s\n", str);
++ device_del(dev);
++ }
++}
++
++static int fbtft_device_spi_device_register(struct spi_board_info *spi)
++{
++ struct spi_master *master;
++
++ master = spi_busnum_to_master(spi->bus_num);
++ if (!master) {
++ pr_err(DRVNAME ": spi_busnum_to_master(%d) returned NULL\n",
++ spi->bus_num);
++ return -EINVAL;
++ }
++ /* make sure it's available */
++ fbtft_device_spi_delete(master, spi->chip_select);
++ spi_device = spi_new_device(master, spi);
++ put_device(&master->dev);
++ if (!spi_device) {
++ pr_err(DRVNAME ": spi_new_device() returned NULL\n");
++ return -EPERM;
++ }
++ return 0;
++}
++#else
++static int fbtft_device_spi_device_register(struct spi_board_info *spi)
++{
++ return spi_register_board_info(spi, 1);
++}
++#endif
++
++static int __init fbtft_device_init(void)
++{
++ struct spi_board_info *spi = NULL;
++ struct fbtft_platform_data *pdata;
++ const struct fbtft_gpio *gpio = NULL;
++ char *p_gpio, *p_name, *p_num;
++ bool found = false;
++ int i = 0;
++ long val;
++ int ret = 0;
++
++ pr_debug("\n\n"DRVNAME": init\n");
++
++ if (name == NULL) {
++#ifdef MODULE
++ pr_err(DRVNAME": missing module parameter: 'name'\n");
++ return -EINVAL;
++#else
++ return 0;
++#endif
++ }
++
++ if (init_num > FBTFT_MAX_INIT_SEQUENCE) {
++ pr_err(DRVNAME \
++ ": init parameter: exceeded max array size: %d\n",
++ FBTFT_MAX_INIT_SEQUENCE);
++ return -EINVAL;
++ }
++
++ /* parse module parameter: gpios */
++ while ((p_gpio = strsep(&gpios, ","))) {
++ if (strchr(p_gpio, ':') == NULL) {
++ pr_err(DRVNAME \
++ ": error: missing ':' in gpios parameter: %s\n",
++ p_gpio);
++ return -EINVAL;
++ }
++ p_num = p_gpio;
++ p_name = strsep(&p_num, ":");
++ if (p_name == NULL || p_num == NULL) {
++ pr_err(DRVNAME \
++ ": something bad happened parsing gpios parameter: %s\n",
++ p_gpio);
++ return -EINVAL;
++ }
++ ret = kstrtol(p_num, 10, &val);
++ if (ret) {
++ pr_err(DRVNAME \
++ ": could not parse number in gpios parameter: %s:%s\n",
++ p_name, p_num);
++ return -EINVAL;
++ }
++ strcpy(fbtft_device_param_gpios[i].name, p_name);
++ fbtft_device_param_gpios[i++].gpio = (int) val;
++ if (i == MAX_GPIOS) {
++ pr_err(DRVNAME \
++ ": gpios parameter: exceeded max array size: %d\n",
++ MAX_GPIOS);
++ return -EINVAL;
++ }
++ }
++ if (fbtft_device_param_gpios[0].name[0])
++ gpio = fbtft_device_param_gpios;
++
++ if (verbose > 2)
++ pr_spi_devices(); /* print list of registered SPI devices */
++
++ if (verbose > 2)
++ pr_p_devices(); /* print list of 'fb' platform devices */
++
++ pr_debug(DRVNAME": name='%s', busnum=%d, cs=%d\n", name, busnum, cs);
++
++ if (rotate > 0 && rotate < 4) {
++ rotate = (4 - rotate) * 90;
++ pr_warn("argument 'rotate' should be an angle. Values 1-3 is deprecated. Setting it to %d.\n",
++ rotate);
++ }
++ if (rotate != 0 && rotate != 90 && rotate != 180 && rotate != 270) {
++ pr_warn("argument 'rotate' illegal value: %d. Setting it to 0.\n",
++ rotate);
++ rotate = 0;
++ }
++
++ /* name=list lists all supported displays */
++ if (strncmp(name, "list", 32) == 0) {
++ pr_info(DRVNAME": Supported displays:\n");
++
++ for (i = 0; i < ARRAY_SIZE(displays); i++)
++ pr_info(DRVNAME": %s\n", displays[i].name);
++ return -ECANCELED;
++ }
++
++ if (custom) {
++ i = ARRAY_SIZE(displays) - 1;
++ displays[i].name = name;
++ if (speed == 0) {
++ displays[i].pdev->name = name;
++ displays[i].spi = NULL;
++ } else {
++ strncpy(displays[i].spi->modalias, name, SPI_NAME_SIZE);
++ displays[i].pdev = NULL;
++ }
++ }
++
++ for (i = 0; i < ARRAY_SIZE(displays); i++) {
++ if (strncmp(name, displays[i].name, 32) == 0) {
++ if (displays[i].spi) {
++ spi = displays[i].spi;
++ spi->chip_select = cs;
++ spi->bus_num = busnum;
++ if (speed)
++ spi->max_speed_hz = speed;
++ if (mode != -1)
++ spi->mode = mode;
++ pdata = (void *)spi->platform_data;
++ } else if (displays[i].pdev) {
++ p_device = displays[i].pdev;
++ pdata = p_device->dev.platform_data;
++ } else {
++ pr_err(DRVNAME": broken displays array\n");
++ return -EINVAL;
++ }
++
++ pdata->rotate = rotate;
++ if (bgr == 0)
++ pdata->bgr = false;
++ else if (bgr == 1)
++ pdata->bgr = true;
++ if (startbyte)
++ pdata->startbyte = startbyte;
++ if (gamma)
++ pdata->gamma = gamma;
++ pdata->display.debug = debug;
++ if (fps)
++ pdata->fps = fps;
++ if (txbuflen)
++ pdata->txbuflen = txbuflen;
++ if (init_num)
++ pdata->display.init_sequence = init;
++ if (gpio)
++ pdata->gpios = gpio;
++ if (custom) {
++ pdata->display.width = width;
++ pdata->display.height = height;
++ pdata->display.buswidth = buswidth;
++ pdata->display.backlight = 1;
++ }
++
++ if (displays[i].spi) {
++ ret = fbtft_device_spi_device_register(spi);
++ if (ret) {
++ pr_err(DRVNAME \
++ ": failed to register SPI device\n");
++ return ret;
++ }
++ found = true;
++ break;
++ } else {
++ ret = platform_device_register(p_device);
++ if (ret < 0) {
++ pr_err(DRVNAME \
++ ": platform_device_register() returned %d\n",
++ ret);
++ return ret;
++ }
++ found = true;
++ break;
++ }
++ }
++ }
++
++ if (!found) {
++ pr_err(DRVNAME": display not supported: '%s'\n", name);
++ return -EINVAL;
++ }
++
++ if (verbose && pdata && pdata->gpios) {
++ gpio = pdata->gpios;
++ pr_info(DRVNAME": GPIOS used by '%s':\n", name);
++ found = false;
++ while (verbose && gpio->name[0]) {
++ pr_info(DRVNAME": '%s' = GPIO%d\n",
++ gpio->name, gpio->gpio);
++ gpio++;
++ found = true;
++ }
++ if (!found)
++ pr_info(DRVNAME": (none)\n");
++ }
++
++ if (spi_device && (verbose > 1))
++ pr_spi_devices();
++ if (p_device && (verbose > 1))
++ pr_p_devices();
++
++ return 0;
++}
++
++static void __exit fbtft_device_exit(void)
++{
++ pr_debug(DRVNAME" - exit\n");
++
++ if (spi_device) {
++ device_del(&spi_device->dev);
++ kfree(spi_device);
++ }
++
++ if (p_device)
++ platform_device_unregister(p_device);
++
++}
++
++arch_initcall(fbtft_device_init);
++module_exit(fbtft_device_exit);
++
++MODULE_DESCRIPTION("Add a FBTFT device.");
++MODULE_AUTHOR("Noralf Tronnes");
++MODULE_LICENSE("GPL");
+diff -Nur linux-3.18.8/drivers/staging/fbtft/fbtft.h linux-rpi/drivers/staging/fbtft/fbtft.h
+--- linux-3.18.8/drivers/staging/fbtft/fbtft.h 1970-01-01 01:00:00.000000000 +0100
++++ linux-rpi/drivers/staging/fbtft/fbtft.h 2015-03-05 14:40:16.345715808 +0100
+@@ -0,0 +1,447 @@
++/*
++ * Copyright (C) 2013 Noralf Tronnes
++ *
++ * This program is free software; you can redistribute it and/or modify
++ * it under the terms of the GNU General Public License as published by
++ * the Free Software Foundation; either version 2 of the License, or
++ * (at your option) any later version.
++ *
++ * This program is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
++ * GNU General Public License for more details.
++ *
++ * 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., 675 Mass Ave, Cambridge, MA 02139, USA.
++ */
++
++#ifndef __LINUX_FBTFT_H
++#define __LINUX_FBTFT_H
++
++#include <linux/fb.h>
++#include <linux/spinlock.h>
++#include <linux/spi/spi.h>
++#include <linux/platform_device.h>
++
++
++#define FBTFT_NOP 0x00
++#define FBTFT_SWRESET 0x01
++#define FBTFT_RDDID 0x04
++#define FBTFT_RDDST 0x09
++#define FBTFT_CASET 0x2A
++#define FBTFT_RASET 0x2B
++#define FBTFT_RAMWR 0x2C
++
++#define FBTFT_ONBOARD_BACKLIGHT 2
++
++#define FBTFT_GPIO_NO_MATCH 0xFFFF
++#define FBTFT_GPIO_NAME_SIZE 32
++#define FBTFT_MAX_INIT_SEQUENCE 512
++#define FBTFT_GAMMA_MAX_VALUES_TOTAL 128
++
++#define FBTFT_OF_INIT_CMD BIT(24)
++#define FBTFT_OF_INIT_DELAY BIT(25)
++
++/**
++ * struct fbtft_gpio - Structure that holds one pinname to gpio mapping
++ * @name: pinname (reset, dc, etc.)
++ * @gpio: GPIO number
++ *
++ */
++struct fbtft_gpio {
++ char name[FBTFT_GPIO_NAME_SIZE];
++ unsigned gpio;
++};
++
++struct fbtft_par;
++
++/**
++ * struct fbtft_ops - FBTFT operations structure
++ * @write: Writes to interface bus
++ * @read: Reads from interface bus
++ * @write_vmem: Writes video memory to display
++ * @write_reg: Writes to controller register
++ * @set_addr_win: Set the GRAM update window
++ * @reset: Reset the LCD controller
++ * @mkdirty: Marks display lines for update
++ * @update_display: Updates the display
++ * @init_display: Initializes the display
++ * @blank: Blank the display (optional)
++ * @request_gpios_match: Do pinname to gpio matching
++ * @request_gpios: Request gpios from the kernel
++ * @free_gpios: Free previously requested gpios
++ * @verify_gpios: Verify that necessary gpios is present (optional)
++ * @register_backlight: Used to register backlight device (optional)
++ * @unregister_backlight: Unregister backlight device (optional)
++ * @set_var: Configure LCD with values from variables like @rotate and @bgr
++ * (optional)
++ * @set_gamma: Set Gamma curve (optional)
++ *
++ * Most of these operations have default functions assigned to them in
++ * fbtft_framebuffer_alloc()
++ */
++struct fbtft_ops {
++ int (*write)(struct fbtft_par *par, void *buf, size_t len);
++ int (*read)(struct fbtft_par *par, void *buf, size_t len);
++ int (*write_vmem)(struct fbtft_par *par, size_t offset, size_t len);
++ void (*write_register)(struct fbtft_par *par, int len, ...);
++
++ void (*set_addr_win)(struct fbtft_par *par,
++ int xs, int ys, int xe, int ye);
++ void (*reset)(struct fbtft_par *par);
++ void (*mkdirty)(struct fb_info *info, int from, int to);
++ void (*update_display)(struct fbtft_par *par,
++ unsigned start_line, unsigned end_line);
++ int (*init_display)(struct fbtft_par *par);
++ int (*blank)(struct fbtft_par *par, bool on);
++
++ unsigned long (*request_gpios_match)(struct fbtft_par *par,
++ const struct fbtft_gpio *gpio);
++ int (*request_gpios)(struct fbtft_par *par);
++ int (*verify_gpios)(struct fbtft_par *par);
++
++ void (*register_backlight)(struct fbtft_par *par);
++ void (*unregister_backlight)(struct fbtft_par *par);
++
++ int (*set_var)(struct fbtft_par *par);
++ int (*set_gamma)(struct fbtft_par *par, unsigned long *curves);
++};
++
++/**
++ * struct fbtft_display - Describes the display properties
++ * @width: Width of display in pixels
++ * @height: Height of display in pixels
++ * @regwidth: LCD Controller Register width in bits
++ * @buswidth: Display interface bus width in bits
++ * @backlight: Backlight type.
++ * @fbtftops: FBTFT operations provided by driver or device (platform_data)
++ * @bpp: Bits per pixel
++ * @fps: Frames per second
++ * @txbuflen: Size of transmit buffer
++ * @init_sequence: Pointer to LCD initialization array
++ * @gamma: String representation of Gamma curve(s)
++ * @gamma_num: Number of Gamma curves
++ * @gamma_len: Number of values per Gamma curve
++ * @debug: Initial debug value
++ *
++ * This structure is not stored by FBTFT except for init_sequence.
++ */
++struct fbtft_display {
++ unsigned width;
++ unsigned height;
++ unsigned regwidth;
++ unsigned buswidth;
++ unsigned backlight;
++ struct fbtft_ops fbtftops;
++ unsigned bpp;
++ unsigned fps;
++ int txbuflen;
++ int *init_sequence;
++ char *gamma;
++ int gamma_num;
++ int gamma_len;
++ unsigned long debug;
++};
++
++/**
++ * struct fbtft_platform_data - Passes display specific data to the driver
++ * @display: Display properties
++ * @gpios: Pointer to an array of piname to gpio mappings
++ * @rotate: Display rotation angle
++ * @bgr: LCD Controller BGR bit
++ * @fps: Frames per second (this will go away, use @fps in @fbtft_display)
++ * @txbuflen: Size of transmit buffer
++ * @startbyte: When set, enables use of Startbyte in transfers
++ * @gamma: String representation of Gamma curve(s)
++ * @extra: A way to pass extra info
++ */
++struct fbtft_platform_data {
++ struct fbtft_display display;
++ const struct fbtft_gpio *gpios;
++ unsigned rotate;
++ bool bgr;
++ unsigned fps;
++ int txbuflen;
++ u8 startbyte;
++ char *gamma;
++ void *extra;
++};
++
++/**
++ * struct fbtft_par - Main FBTFT data structure
++ *
++ * This structure holds all relevant data to operate the display
++ *
++ * See sourcefile for documentation since nested structs is not
++ * supported by kernel-doc.
++ *
++ */
++/* @spi: Set if it is a SPI device
++ * @pdev: Set if it is a platform device
++ * @info: Pointer to framebuffer fb_info structure
++ * @pdata: Pointer to platform data
++ * @ssbuf: Not used
++ * @pseudo_palette: Used by fb_set_colreg()
++ * @txbuf.buf: Transmit buffer
++ * @txbuf.len: Transmit buffer length
++ * @buf: Small buffer used when writing init data over SPI
++ * @startbyte: Used by some controllers when in SPI mode.
++ * Format: 6 bit Device id + RS bit + RW bit
++ * @fbtftops: FBTFT operations provided by driver or device (platform_data)
++ * @dirty_lock: Protects dirty_lines_start and dirty_lines_end
++ * @dirty_lines_start: Where to begin updating display
++ * @dirty_lines_end: Where to end updating display
++ * @gpio.reset: GPIO used to reset display
++ * @gpio.dc: Data/Command signal, also known as RS
++ * @gpio.rd: Read latching signal
++ * @gpio.wr: Write latching signal
++ * @gpio.latch: Bus latch signal, eg. 16->8 bit bus latch
++ * @gpio.cs: LCD Chip Select with parallel interface bus
++ * @gpio.db[16]: Parallel databus
++ * @gpio.led[16]: Led control signals
++ * @gpio.aux[16]: Auxillary signals, not used by core
++ * @init_sequence: Pointer to LCD initialization array
++ * @gamma.lock: Mutex for Gamma curve locking
++ * @gamma.curves: Pointer to Gamma curve array
++ * @gamma.num_values: Number of values per Gamma curve
++ * @gamma.num_curves: Number of Gamma curves
++ * @debug: Pointer to debug value
++ * @current_debug:
++ * @first_update_done: Used to only time the first display update
++ * @update_time: Used to calculate 'fps' in debug output
++ * @bgr: BGR mode/\n
++ * @extra: Extra info needed by driver
++ */
++struct fbtft_par {
++ struct spi_device *spi;
++ struct platform_device *pdev;
++ struct fb_info *info;
++ struct fbtft_platform_data *pdata;
++ u16 *ssbuf;
++ u32 pseudo_palette[16];
++ struct {
++ void *buf;
++ dma_addr_t dma;
++ size_t len;
++ } txbuf;
++ u8 *buf;
++ u8 startbyte;
++ struct fbtft_ops fbtftops;
++ spinlock_t dirty_lock;
++ unsigned dirty_lines_start;
++ unsigned dirty_lines_end;
++ struct {
++ int reset;
++ int dc;
++ int rd;
++ int wr;
++ int latch;
++ int cs;
++ int db[16];
++ int led[16];
++ int aux[16];
++ } gpio;
++ int *init_sequence;
++ struct {
++ struct mutex lock;
++ unsigned long *curves;
++ int num_values;
++ int num_curves;
++ } gamma;
++ unsigned long debug;
++ bool first_update_done;
++ struct timespec update_time;
++ bool bgr;
++ void *extra;
++};
++
++#define NUMARGS(...) (sizeof((int[]){__VA_ARGS__})/sizeof(int))
++
++#define write_reg(par, ...) \
++do { \
++ par->fbtftops.write_register(par, NUMARGS(__VA_ARGS__), __VA_ARGS__); \
++} while (0)
++
++/* fbtft-core.c */
++extern void fbtft_dbg_hex(const struct device *dev,
++ int groupsize, void *buf, size_t len, const char *fmt, ...);
++extern struct fb_info *fbtft_framebuffer_alloc(struct fbtft_display *display,
++ struct device *dev);
++extern void fbtft_framebuffer_release(struct fb_info *info);
++extern int fbtft_register_framebuffer(struct fb_info *fb_info);
++extern int fbtft_unregister_framebuffer(struct fb_info *fb_info);
++extern void fbtft_register_backlight(struct fbtft_par *par);
++extern void fbtft_unregister_backlight(struct fbtft_par *par);
++extern int fbtft_init_display(struct fbtft_par *par);
++extern int fbtft_probe_common(struct fbtft_display *display,
++ struct spi_device *sdev, struct platform_device *pdev);
++extern int fbtft_remove_common(struct device *dev, struct fb_info *info);
++
++/* fbtft-io.c */
++extern int fbtft_write_spi(struct fbtft_par *par, void *buf, size_t len);
++extern int fbtft_write_spi_emulate_9(struct fbtft_par *par,
++ void *buf, size_t len);
++extern int fbtft_read_spi(struct fbtft_par *par, void *buf, size_t len);
++extern int fbtft_write_gpio8_wr(struct fbtft_par *par, void *buf, size_t len);
++extern int fbtft_write_gpio16_wr(struct fbtft_par *par, void *buf, size_t len);
++extern int fbtft_write_gpio16_wr_latched(struct fbtft_par *par,
++ void *buf, size_t len);
++
++/* fbtft-bus.c */
++extern int fbtft_write_vmem8_bus8(struct fbtft_par *par, size_t offset, size_t len);
++extern int fbtft_write_vmem16_bus16(struct fbtft_par *par, size_t offset, size_t len);
++extern int fbtft_write_vmem16_bus8(struct fbtft_par *par, size_t offset, size_t len);
++extern int fbtft_write_vmem16_bus9(struct fbtft_par *par, size_t offset, size_t len);
++extern void fbtft_write_reg8_bus8(struct fbtft_par *par, int len, ...);
++extern void fbtft_write_reg8_bus9(struct fbtft_par *par, int len, ...);
++extern void fbtft_write_reg16_bus8(struct fbtft_par *par, int len, ...);
++extern void fbtft_write_reg16_bus16(struct fbtft_par *par, int len, ...);
++
++
++#define FBTFT_REGISTER_DRIVER(_name, _compatible, _display) \
++ \
++static int fbtft_driver_probe_spi(struct spi_device *spi) \
++{ \
++ return fbtft_probe_common(_display, spi, NULL); \
++} \
++ \
++static int fbtft_driver_remove_spi(struct spi_device *spi) \
++{ \
++ struct fb_info *info = spi_get_drvdata(spi); \
++ \
++ return fbtft_remove_common(&spi->dev, info); \
++} \
++ \
++static int fbtft_driver_probe_pdev(struct platform_device *pdev) \
++{ \
++ return fbtft_probe_common(_display, NULL, pdev); \
++} \
++ \
++static int fbtft_driver_remove_pdev(struct platform_device *pdev) \
++{ \
++ struct fb_info *info = platform_get_drvdata(pdev); \
++ \
++ return fbtft_remove_common(&pdev->dev, info); \
++} \
++ \
++static const struct of_device_id dt_ids[] = { \
++ { .compatible = _compatible }, \
++ {}, \
++}; \
++ \
++MODULE_DEVICE_TABLE(of, dt_ids); \
++ \
++ \
++static struct spi_driver fbtft_driver_spi_driver = { \
++ .driver = { \
++ .name = _name, \
++ .owner = THIS_MODULE, \
++ .of_match_table = of_match_ptr(dt_ids), \
++ }, \
++ .probe = fbtft_driver_probe_spi, \
++ .remove = fbtft_driver_remove_spi, \
++}; \
++ \
++static struct platform_driver fbtft_driver_platform_driver = { \
++ .driver = { \
++ .name = _name, \
++ .owner = THIS_MODULE, \
++ .of_match_table = of_match_ptr(dt_ids), \
++ }, \
++ .probe = fbtft_driver_probe_pdev, \
++ .remove = fbtft_driver_remove_pdev, \
++}; \
++ \
++static int __init fbtft_driver_module_init(void) \
++{ \
++ int ret; \
++ \
++ ret = spi_register_driver(&fbtft_driver_spi_driver); \
++ if (ret < 0) \
++ return ret; \
++ return platform_driver_register(&fbtft_driver_platform_driver); \
++} \
++ \
++static void __exit fbtft_driver_module_exit(void) \
++{ \
++ spi_unregister_driver(&fbtft_driver_spi_driver); \
++ platform_driver_unregister(&fbtft_driver_platform_driver); \
++} \
++ \
++module_init(fbtft_driver_module_init); \
++module_exit(fbtft_driver_module_exit);
++
++
++/* Debug macros */
++
++/* shorthand debug levels */
++#define DEBUG_LEVEL_1 DEBUG_REQUEST_GPIOS
++#define DEBUG_LEVEL_2 (DEBUG_LEVEL_1 | DEBUG_DRIVER_INIT_FUNCTIONS | DEBUG_TIME_FIRST_UPDATE)
++#define DEBUG_LEVEL_3 (DEBUG_LEVEL_2 | DEBUG_RESET | DEBUG_INIT_DISPLAY | DEBUG_BLANK | DEBUG_REQUEST_GPIOS | DEBUG_FREE_GPIOS | DEBUG_VERIFY_GPIOS | DEBUG_BACKLIGHT | DEBUG_SYSFS)
++#define DEBUG_LEVEL_4 (DEBUG_LEVEL_2 | DEBUG_FB_READ | DEBUG_FB_WRITE | DEBUG_FB_FILLRECT | DEBUG_FB_COPYAREA | DEBUG_FB_IMAGEBLIT | DEBUG_FB_BLANK)
++#define DEBUG_LEVEL_5 (DEBUG_LEVEL_3 | DEBUG_UPDATE_DISPLAY)
++#define DEBUG_LEVEL_6 (DEBUG_LEVEL_4 | DEBUG_LEVEL_5)
++#define DEBUG_LEVEL_7 0xFFFFFFFF
++
++#define DEBUG_DRIVER_INIT_FUNCTIONS (1<<3)
++#define DEBUG_TIME_FIRST_UPDATE (1<<4)
++#define DEBUG_TIME_EACH_UPDATE (1<<5)
++#define DEBUG_DEFERRED_IO (1<<6)
++#define DEBUG_FBTFT_INIT_FUNCTIONS (1<<7)
++
++/* fbops */
++#define DEBUG_FB_READ (1<<8)
++#define DEBUG_FB_WRITE (1<<9)
++#define DEBUG_FB_FILLRECT (1<<10)
++#define DEBUG_FB_COPYAREA (1<<11)
++#define DEBUG_FB_IMAGEBLIT (1<<12)
++#define DEBUG_FB_SETCOLREG (1<<13)
++#define DEBUG_FB_BLANK (1<<14)
++
++#define DEBUG_SYSFS (1<<16)
++
++/* fbtftops */
++#define DEBUG_BACKLIGHT (1<<17)
++#define DEBUG_READ (1<<18)
++#define DEBUG_WRITE (1<<19)
++#define DEBUG_WRITE_VMEM (1<<20)
++#define DEBUG_WRITE_REGISTER (1<<21)
++#define DEBUG_SET_ADDR_WIN (1<<22)
++#define DEBUG_RESET (1<<23)
++#define DEBUG_MKDIRTY (1<<24)
++#define DEBUG_UPDATE_DISPLAY (1<<25)
++#define DEBUG_INIT_DISPLAY (1<<26)
++#define DEBUG_BLANK (1<<27)
++#define DEBUG_REQUEST_GPIOS (1<<28)
++#define DEBUG_FREE_GPIOS (1<<29)
++#define DEBUG_REQUEST_GPIOS_MATCH (1<<30)
++#define DEBUG_VERIFY_GPIOS (1<<31)
++
++
++#define fbtft_init_dbg(dev, format, arg...) \
++do { \
++ if (unlikely((dev)->platform_data && \
++ (((struct fbtft_platform_data *)(dev)->platform_data)->display.debug & DEBUG_DRIVER_INIT_FUNCTIONS))) \
++ dev_info(dev, format, ##arg); \
++} while (0)
++
++#define fbtft_par_dbg(level, par, format, arg...) \
++do { \
++ if (unlikely(par->debug & level)) \
++ dev_info(par->info->device, format, ##arg); \
++} while (0)
++
++#define fbtft_dev_dbg(level, par, dev, format, arg...) \
++do { \
++ if (unlikely(par->debug & level)) \
++ dev_info(dev, format, ##arg); \
++} while (0)
++
++#define fbtft_par_dbg_hex(level, par, dev, type, buf, num, format, arg...) \
++do { \
++ if (unlikely(par->debug & level)) \
++ fbtft_dbg_hex(dev, sizeof(type), buf, num * sizeof(type), format, ##arg); \
++} while (0)
++
++#endif /* __LINUX_FBTFT_H */
+diff -Nur linux-3.18.8/drivers/staging/fbtft/fbtft-io.c linux-rpi/drivers/staging/fbtft/fbtft-io.c
+--- linux-3.18.8/drivers/staging/fbtft/fbtft-io.c 1970-01-01 01:00:00.000000000 +0100
++++ linux-rpi/drivers/staging/fbtft/fbtft-io.c 2015-03-05 14:40:16.345715808 +0100
+@@ -0,0 +1,239 @@
++#include <linux/export.h>
++#include <linux/errno.h>
++#include <linux/gpio.h>
++#include <linux/spi/spi.h>
++#include "fbtft.h"
++
++int fbtft_write_spi(struct fbtft_par *par, void *buf, size_t len)
++{
++ struct spi_transfer t = {
++ .tx_buf = buf,
++ .len = len,
++ };
++ struct spi_message m;
++
++ fbtft_par_dbg_hex(DEBUG_WRITE, par, par->info->device, u8, buf, len,
++ "%s(len=%d): ", __func__, len);
++
++ if (!par->spi) {
++ dev_err(par->info->device,
++ "%s: par->spi is unexpectedly NULL\n", __func__);
++ return -1;
++ }
++
++ spi_message_init(&m);
++ if (par->txbuf.dma && buf == par->txbuf.buf) {
++ t.tx_dma = par->txbuf.dma;
++ m.is_dma_mapped = 1;
++ }
++ spi_message_add_tail(&t, &m);
++ return spi_sync(par->spi, &m);
++}
++EXPORT_SYMBOL(fbtft_write_spi);
++
++/**
++ * fbtft_write_spi_emulate_9() - write SPI emulating 9-bit
++ * @par: Driver data
++ * @buf: Buffer to write
++ * @len: Length of buffer (must be divisible by 8)
++ *
++ * When 9-bit SPI is not available, this function can be used to emulate that.
++ * par->extra must hold a transformation buffer used for transfer.
++ */
++int fbtft_write_spi_emulate_9(struct fbtft_par *par, void *buf, size_t len)
++{
++ u16 *src = buf;
++ u8 *dst = par->extra;
++ size_t size = len / 2;
++ size_t added = 0;
++ int bits, i, j;
++ u64 val, dc, tmp;
++
++ fbtft_par_dbg_hex(DEBUG_WRITE, par, par->info->device, u8, buf, len,
++ "%s(len=%d): ", __func__, len);
++
++ if (!par->extra) {
++ dev_err(par->info->device, "%s: error: par->extra is NULL\n",
++ __func__);
++ return -EINVAL;
++ }
++ if ((len % 8) != 0) {
++ dev_err(par->info->device,
++ "%s: error: len=%d must be divisible by 8\n",
++ __func__, len);
++ return -EINVAL;
++ }
++
++ for (i = 0; i < size; i += 8) {
++ tmp = 0;
++ bits = 63;
++ for (j = 0; j < 7; j++) {
++ dc = (*src & 0x0100) ? 1 : 0;
++ val = *src & 0x00FF;
++ tmp |= dc << bits;
++ bits -= 8;
++ tmp |= val << bits--;
++ src++;
++ }
++ tmp |= ((*src & 0x0100) ? 1 : 0);
++ *(u64 *)dst = cpu_to_be64(tmp);
++ dst += 8;
++ *dst++ = (u8)(*src++ & 0x00FF);
++ added++;
++ }
++
++ return spi_write(par->spi, par->extra, size + added);
++}
++EXPORT_SYMBOL(fbtft_write_spi_emulate_9);
++
++int fbtft_read_spi(struct fbtft_par *par, void *buf, size_t len)
++{
++ int ret;
++ u8 txbuf[32] = { 0, };
++ struct spi_transfer t = {
++ .speed_hz = 2000000,
++ .rx_buf = buf,
++ .len = len,
++ };
++ struct spi_message m;
++
++ if (!par->spi) {
++ dev_err(par->info->device,
++ "%s: par->spi is unexpectedly NULL\n", __func__);
++ return -ENODEV;
++ }
++
++ if (par->startbyte) {
++ if (len > 32) {
++ dev_err(par->info->device,
++ "%s: len=%d can't be larger than 32 when using 'startbyte'\n",
++ __func__, len);
++ return -EINVAL;
++ }
++ txbuf[0] = par->startbyte | 0x3;
++ t.tx_buf = txbuf;
++ fbtft_par_dbg_hex(DEBUG_READ, par, par->info->device, u8,
++ txbuf, len, "%s(len=%d) txbuf => ", __func__, len);
++ }
++
++ spi_message_init(&m);
++ spi_message_add_tail(&t, &m);
++ ret = spi_sync(par->spi, &m);
++ fbtft_par_dbg_hex(DEBUG_READ, par, par->info->device, u8, buf, len,
++ "%s(len=%d) buf <= ", __func__, len);
++
++ return ret;
++}
++EXPORT_SYMBOL(fbtft_read_spi);
++
++/*
++ * Optimized use of gpiolib is twice as fast as no optimization
++ * only one driver can use the optimized version at a time
++ */
++int fbtft_write_gpio8_wr(struct fbtft_par *par, void *buf, size_t len)
++{
++ u8 data;
++ int i;
++#ifndef DO_NOT_OPTIMIZE_FBTFT_WRITE_GPIO
++ static u8 prev_data;
++#endif
++
++ fbtft_par_dbg_hex(DEBUG_WRITE, par, par->info->device, u8, buf, len,
++ "%s(len=%d): ", __func__, len);
++
++ while (len--) {
++ data = *(u8 *) buf;
++
++ /* Start writing by pulling down /WR */
++ gpio_set_value(par->gpio.wr, 0);
++
++ /* Set data */
++#ifndef DO_NOT_OPTIMIZE_FBTFT_WRITE_GPIO
++ if (data == prev_data) {
++ gpio_set_value(par->gpio.wr, 0); /* used as delay */
++ } else {
++ for (i = 0; i < 8; i++) {
++ if ((data & 1) != (prev_data & 1))
++ gpio_set_value(par->gpio.db[i],
++ (data & 1));
++ data >>= 1;
++ prev_data >>= 1;
++ }
++ }
++#else
++ for (i = 0; i < 8; i++) {
++ gpio_set_value(par->gpio.db[i], (data & 1));
++ data >>= 1;
++ }
++#endif
++
++ /* Pullup /WR */
++ gpio_set_value(par->gpio.wr, 1);
++
++#ifndef DO_NOT_OPTIMIZE_FBTFT_WRITE_GPIO
++ prev_data = *(u8 *) buf;
++#endif
++ buf++;
++ }
++
++ return 0;
++}
++EXPORT_SYMBOL(fbtft_write_gpio8_wr);
++
++int fbtft_write_gpio16_wr(struct fbtft_par *par, void *buf, size_t len)
++{
++ u16 data;
++ int i;
++#ifndef DO_NOT_OPTIMIZE_FBTFT_WRITE_GPIO
++ static u16 prev_data;
++#endif
++
++ fbtft_par_dbg_hex(DEBUG_WRITE, par, par->info->device, u8, buf, len,
++ "%s(len=%d): ", __func__, len);
++
++ while (len) {
++ data = *(u16 *) buf;
++
++ /* Start writing by pulling down /WR */
++ gpio_set_value(par->gpio.wr, 0);
++
++ /* Set data */
++#ifndef DO_NOT_OPTIMIZE_FBTFT_WRITE_GPIO
++ if (data == prev_data) {
++ gpio_set_value(par->gpio.wr, 0); /* used as delay */
++ } else {
++ for (i = 0; i < 16; i++) {
++ if ((data & 1) != (prev_data & 1))
++ gpio_set_value(par->gpio.db[i],
++ (data & 1));
++ data >>= 1;
++ prev_data >>= 1;
++ }
++ }
++#else
++ for (i = 0; i < 16; i++) {
++ gpio_set_value(par->gpio.db[i], (data & 1));
++ data >>= 1;
++ }
++#endif
++
++ /* Pullup /WR */
++ gpio_set_value(par->gpio.wr, 1);
++
++#ifndef DO_NOT_OPTIMIZE_FBTFT_WRITE_GPIO
++ prev_data = *(u16 *) buf;
++#endif
++ buf += 2;
++ len -= 2;
++ }
++
++ return 0;
++}
++EXPORT_SYMBOL(fbtft_write_gpio16_wr);
++
++int fbtft_write_gpio16_wr_latched(struct fbtft_par *par, void *buf, size_t len)
++{
++ dev_err(par->info->device, "%s: function not implemented\n", __func__);
++ return -1;
++}
++EXPORT_SYMBOL(fbtft_write_gpio16_wr_latched);
+diff -Nur linux-3.18.8/drivers/staging/fbtft/fbtft-sysfs.c linux-rpi/drivers/staging/fbtft/fbtft-sysfs.c
+--- linux-3.18.8/drivers/staging/fbtft/fbtft-sysfs.c 1970-01-01 01:00:00.000000000 +0100
++++ linux-rpi/drivers/staging/fbtft/fbtft-sysfs.c 2015-03-05 14:40:16.345715808 +0100
+@@ -0,0 +1,222 @@
++#include "fbtft.h"
++
++
++static int get_next_ulong(char **str_p, unsigned long *val, char *sep, int base)
++{
++ char *p_val;
++ int ret;
++
++ if (!str_p || !(*str_p))
++ return -EINVAL;
++
++ p_val = strsep(str_p, sep);
++
++ if (!p_val)
++ return -EINVAL;
++
++ ret = kstrtoul(p_val, base, val);
++ if (ret)
++ return -EINVAL;
++
++ return 0;
++}
++
++int fbtft_gamma_parse_str(struct fbtft_par *par, unsigned long *curves,
++ const char *str, int size)
++{
++ char *str_p, *curve_p = NULL;
++ char *tmp;
++ unsigned long val = 0;
++ int ret = 0;
++ int curve_counter, value_counter;
++
++ fbtft_par_dbg(DEBUG_SYSFS, par, "%s() str=\n", __func__);
++
++ if (!str || !curves)
++ return -EINVAL;
++
++ fbtft_par_dbg(DEBUG_SYSFS, par, "%s\n", str);
++
++ tmp = kmalloc(size+1, GFP_KERNEL);
++ if (!tmp)
++ return -ENOMEM;
++ memcpy(tmp, str, size+1);
++
++ /* replace optional separators */
++ str_p = tmp;
++ while (*str_p) {
++ if (*str_p == ',')
++ *str_p = ' ';
++ if (*str_p == ';')
++ *str_p = '\n';
++ str_p++;
++ }
++
++ str_p = strim(tmp);
++
++ curve_counter = 0;
++ while (str_p) {
++ if (curve_counter == par->gamma.num_curves) {
++ dev_err(par->info->device, "Gamma: Too many curves\n");
++ ret = -EINVAL;
++ goto out;
++ }
++ curve_p = strsep(&str_p, "\n");
++ value_counter = 0;
++ while (curve_p) {
++ if (value_counter == par->gamma.num_values) {
++ dev_err(par->info->device,
++ "Gamma: Too many values\n");
++ ret = -EINVAL;
++ goto out;
++ }
++ ret = get_next_ulong(&curve_p, &val, " ", 16);
++ if (ret)
++ goto out;
++ curves[curve_counter * par->gamma.num_values + value_counter] = val;
++ value_counter++;
++ }
++ if (value_counter != par->gamma.num_values) {
++ dev_err(par->info->device, "Gamma: Too few values\n");
++ ret = -EINVAL;
++ goto out;
++ }
++ curve_counter++;
++ }
++ if (curve_counter != par->gamma.num_curves) {
++ dev_err(par->info->device, "Gamma: Too few curves\n");
++ ret = -EINVAL;
++ goto out;
++ }
++
++out:
++ kfree(tmp);
++ return ret;
++}
++
++static ssize_t
++sprintf_gamma(struct fbtft_par *par, unsigned long *curves, char *buf)
++{
++ ssize_t len = 0;
++ unsigned int i, j;
++
++ mutex_lock(&par->gamma.lock);
++ for (i = 0; i < par->gamma.num_curves; i++) {
++ for (j = 0; j < par->gamma.num_values; j++)
++ len += scnprintf(&buf[len], PAGE_SIZE,
++ "%04lx ", curves[i*par->gamma.num_values + j]);
++ buf[len-1] = '\n';
++ }
++ mutex_unlock(&par->gamma.lock);
++
++ return len;
++}
++
++static ssize_t store_gamma_curve(struct device *device,
++ struct device_attribute *attr,
++ const char *buf, size_t count)
++{
++ struct fb_info *fb_info = dev_get_drvdata(device);
++ struct fbtft_par *par = fb_info->par;
++ unsigned long tmp_curves[FBTFT_GAMMA_MAX_VALUES_TOTAL];
++ int ret;
++
++ ret = fbtft_gamma_parse_str(par, tmp_curves, buf, count);
++ if (ret)
++ return ret;
++
++ ret = par->fbtftops.set_gamma(par, tmp_curves);
++ if (ret)
++ return ret;
++
++ mutex_lock(&par->gamma.lock);
++ memcpy(par->gamma.curves, tmp_curves,
++ par->gamma.num_curves * par->gamma.num_values * sizeof(tmp_curves[0]));
++ mutex_unlock(&par->gamma.lock);
++
++ return count;
++}
++
++static ssize_t show_gamma_curve(struct device *device,
++ struct device_attribute *attr, char *buf)
++{
++ struct fb_info *fb_info = dev_get_drvdata(device);
++ struct fbtft_par *par = fb_info->par;
++
++ return sprintf_gamma(par, par->gamma.curves, buf);
++}
++
++static struct device_attribute gamma_device_attrs[] = {
++ __ATTR(gamma, 0660, show_gamma_curve, store_gamma_curve),
++};
++
++
++void fbtft_expand_debug_value(unsigned long *debug)
++{
++ switch (*debug & 0b111) {
++ case 1:
++ *debug |= DEBUG_LEVEL_1;
++ break;
++ case 2:
++ *debug |= DEBUG_LEVEL_2;
++ break;
++ case 3:
++ *debug |= DEBUG_LEVEL_3;
++ break;
++ case 4:
++ *debug |= DEBUG_LEVEL_4;
++ break;
++ case 5:
++ *debug |= DEBUG_LEVEL_5;
++ break;
++ case 6:
++ *debug |= DEBUG_LEVEL_6;
++ break;
++ case 7:
++ *debug = 0xFFFFFFFF;
++ break;
++ }
++}
++
++static ssize_t store_debug(struct device *device,
++ struct device_attribute *attr,
++ const char *buf, size_t count)
++{
++ struct fb_info *fb_info = dev_get_drvdata(device);
++ struct fbtft_par *par = fb_info->par;
++ int ret;
++
++ ret = kstrtoul(buf, 10, &par->debug);
++ if (ret)
++ return ret;
++ fbtft_expand_debug_value(&par->debug);
++
++ return count;
++}
++
++static ssize_t show_debug(struct device *device,
++ struct device_attribute *attr, char *buf)
++{
++ struct fb_info *fb_info = dev_get_drvdata(device);
++ struct fbtft_par *par = fb_info->par;
++
++ return snprintf(buf, PAGE_SIZE, "%lu\n", par->debug);
++}
++
++static struct device_attribute debug_device_attr = \
++ __ATTR(debug, 0660, show_debug, store_debug);
++
++
++void fbtft_sysfs_init(struct fbtft_par *par)
++{
++ device_create_file(par->info->dev, &debug_device_attr);
++ if (par->gamma.curves && par->fbtftops.set_gamma)
++ device_create_file(par->info->dev, &gamma_device_attrs[0]);
++}
++
++void fbtft_sysfs_exit(struct fbtft_par *par)
++{
++ device_remove_file(par->info->dev, &debug_device_attr);
++ if (par->gamma.curves && par->fbtftops.set_gamma)
++ device_remove_file(par->info->dev, &gamma_device_attrs[0]);
++}
+diff -Nur linux-3.18.8/drivers/staging/fbtft/fb_tinylcd.c linux-rpi/drivers/staging/fbtft/fb_tinylcd.c
+--- linux-3.18.8/drivers/staging/fbtft/fb_tinylcd.c 1970-01-01 01:00:00.000000000 +0100
++++ linux-rpi/drivers/staging/fbtft/fb_tinylcd.c 2015-03-05 14:40:16.345715808 +0100
+@@ -0,0 +1,124 @@
++/*
++ * Custom FB driver for tinylcd.com display
++ *
++ * Copyright (C) 2013 Noralf Tronnes
++ *
++ * This program is free software; you can redistribute it and/or modify
++ * it under the terms of the GNU General Public License as published by
++ * the Free Software Foundation; either version 2 of the License, or
++ * (at your option) any later version.
++ *
++ * This program is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
++ * GNU General Public License for more details.
++ *
++ * 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., 675 Mass Ave, Cambridge, MA 02139, USA.
++ */
++
++#include <linux/module.h>
++#include <linux/kernel.h>
++#include <linux/init.h>
++#include <linux/delay.h>
++
++#include "fbtft.h"
++
++#define DRVNAME "fb_tinylcd"
++#define WIDTH 320
++#define HEIGHT 480
++
++
++static int init_display(struct fbtft_par *par)
++{
++ fbtft_par_dbg(DEBUG_INIT_DISPLAY, par, "%s()\n", __func__);
++
++ par->fbtftops.reset(par);
++
++ write_reg(par, 0xB0, 0x80);
++ write_reg(par, 0xC0, 0x0A, 0x0A);
++ write_reg(par, 0xC1, 0x45, 0x07);
++ write_reg(par, 0xC2, 0x33);
++ write_reg(par, 0xC5, 0x00, 0x42, 0x80);
++ write_reg(par, 0xB1, 0xD0, 0x11);
++ write_reg(par, 0xB4, 0x02);
++ write_reg(par, 0xB6, 0x00, 0x22, 0x3B);
++ write_reg(par, 0xB7, 0x07);
++ write_reg(par, 0x36, 0x58);
++ write_reg(par, 0xF0, 0x36, 0xA5, 0xD3);
++ write_reg(par, 0xE5, 0x80);
++ write_reg(par, 0xE5, 0x01);
++ write_reg(par, 0xB3, 0x00);
++ write_reg(par, 0xE5, 0x00);
++ write_reg(par, 0xF0, 0x36, 0xA5, 0x53);
++ write_reg(par, 0xE0, 0x00, 0x35, 0x33, 0x00, 0x00, 0x00,
++ 0x00, 0x35, 0x33, 0x00, 0x00, 0x00);
++ write_reg(par, 0x3A, 0x55);
++ write_reg(par, 0x11);
++ udelay(250);
++ write_reg(par, 0x29);
++
++ return 0;
++}
++
++static void set_addr_win(struct fbtft_par *par, int xs, int ys, int xe, int ye)
++{
++ fbtft_par_dbg(DEBUG_SET_ADDR_WIN, par,
++ "%s(xs=%d, ys=%d, xe=%d, ye=%d)\n", __func__, xs, ys, xe, ye);
++
++ /* Column address */
++ write_reg(par, 0x2A, xs >> 8, xs & 0xFF, xe >> 8, xe & 0xFF);
++
++ /* Row adress */
++ write_reg(par, 0x2B, ys >> 8, ys & 0xFF, ye >> 8, ye & 0xFF);
++
++ /* Memory write */
++ write_reg(par, 0x2C);
++}
++
++static int set_var(struct fbtft_par *par)
++{
++ fbtft_par_dbg(DEBUG_INIT_DISPLAY, par, "%s()\n", __func__);
++
++ switch (par->info->var.rotate) {
++ case 270:
++ write_reg(par, 0xB6, 0x00, 0x02, 0x3B);
++ write_reg(par, 0x36, 0x28);
++ break;
++ case 180:
++ write_reg(par, 0xB6, 0x00, 0x22, 0x3B);
++ write_reg(par, 0x36, 0x58);
++ break;
++ case 90:
++ write_reg(par, 0xB6, 0x00, 0x22, 0x3B);
++ write_reg(par, 0x36, 0x38);
++ break;
++ default:
++ write_reg(par, 0xB6, 0x00, 0x22, 0x3B);
++ write_reg(par, 0x36, 0x08);
++ break;
++ }
++
++ return 0;
++}
++
++
++static struct fbtft_display display = {
++ .regwidth = 8,
++ .width = WIDTH,
++ .height = HEIGHT,
++ .fbtftops = {
++ .init_display = init_display,
++ .set_addr_win = set_addr_win,
++ .set_var = set_var,
++ },
++};
++FBTFT_REGISTER_DRIVER(DRVNAME, "neosec,tinylcd", &display);
++
++MODULE_ALIAS("spi:" DRVNAME);
++MODULE_ALIAS("spi:tinylcd");
++
++MODULE_DESCRIPTION("Custom FB driver for tinylcd.com display");
++MODULE_AUTHOR("Noralf Tronnes");
++MODULE_LICENSE("GPL");
+diff -Nur linux-3.18.8/drivers/staging/fbtft/fb_tls8204.c linux-rpi/drivers/staging/fbtft/fb_tls8204.c
+--- linux-3.18.8/drivers/staging/fbtft/fb_tls8204.c 1970-01-01 01:00:00.000000000 +0100
++++ linux-rpi/drivers/staging/fbtft/fb_tls8204.c 2015-03-05 14:40:16.345715808 +0100
+@@ -0,0 +1,176 @@
++/*
++ * FB driver for the TLS8204 LCD Controller
++ *
++ * The display is monochrome and the video memory is RGB565.
++ * Any pixel value except 0 turns the pixel on.
++ *
++ * Copyright (C) 2013 Noralf Tronnes
++ * Copyright (C) 2014 Michael Hope (adapted for the TLS8204)
++ *
++ * This program is free software; you can redistribute it and/or modify
++ * it under the terms of the GNU General Public License as published by
++ * the Free Software Foundation; either version 2 of the License, or
++ * (at your option) any later version.
++ *
++ * This program is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
++ * GNU General Public License for more details.
++ *
++ * 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., 675 Mass Ave, Cambridge, MA 02139, USA.
++ */
++
++#include <linux/module.h>
++#include <linux/kernel.h>
++#include <linux/init.h>
++#include <linux/gpio.h>
++#include <linux/spi/spi.h>
++#include <linux/delay.h>
++
++#include "fbtft.h"
++
++#define DRVNAME "fb_tls8204"
++#define WIDTH 84
++#define HEIGHT 48
++#define TXBUFLEN WIDTH
++#define DEFAULT_GAMMA "40" /* gamma is used to control contrast in this driver */
++
++static unsigned bs = 4;
++module_param(bs, uint, 0);
++MODULE_PARM_DESC(bs, "BS[2:0] Bias voltage level: 0-7 (default: 4)");
++
++static int init_display(struct fbtft_par *par)
++{
++ fbtft_par_dbg(DEBUG_INIT_DISPLAY, par, "%s()\n", __func__);
++
++ par->fbtftops.reset(par);
++
++ /* Enter extended command mode */
++ write_reg(par, 0x21); /* 5:1 1
++ 2:0 PD - Powerdown control: chip is active
++ 1:0 V - Entry mode: horizontal addressing
++ 0:1 H - Extended instruction set control: extended
++ */
++
++ /* H=1 Bias system */
++ write_reg(par, 0x10 | (bs & 0x7)); /*
++ 4:1 1
++ 3:0 0
++ 2:x BS2 - Bias System
++ 1:x BS1
++ 0:x BS0
++ */
++
++ /* Set the address of the first display line. */
++ write_reg(par, 0x04 | (64 >> 6));
++ write_reg(par, 0x40 | (64 & 0x3F));
++
++ /* Enter H=0 standard command mode */
++ write_reg(par, 0x20);
++
++ /* H=0 Display control */
++ write_reg(par, 0x08 | 4); /*
++ 3:1 1
++ 2:1 D - DE: 10=normal mode
++ 1:0 0
++ 0:0 E
++ */
++
++ return 0;
++}
++
++static void set_addr_win(struct fbtft_par *par, int xs, int ys, int xe, int ye)
++{
++ fbtft_par_dbg(DEBUG_SET_ADDR_WIN, par, "%s(xs=%d, ys=%d, xe=%d, ye=%d)\n", __func__, xs, ys, xe, ye);
++
++ /* H=0 Set X address of RAM */
++ write_reg(par, 0x80); /* 7:1 1
++ 6-0: X[6:0] - 0x00
++ */
++
++ /* H=0 Set Y address of RAM */
++ write_reg(par, 0x40); /* 7:0 0
++ 6:1 1
++ 2-0: Y[2:0] - 0x0
++ */
++}
++
++static int write_vmem(struct fbtft_par *par, size_t offset, size_t len)
++{
++ u16 *vmem16 = (u16 *)par->info->screen_base;
++ int x, y, i;
++ int ret = 0;
++
++ fbtft_par_dbg(DEBUG_WRITE_VMEM, par, "%s()\n", __func__);
++
++ for (y = 0; y < HEIGHT/8; y++) {
++ u8 *buf = par->txbuf.buf;
++ /* The display is 102x68 but the LCD is 84x48. Set
++ the write pointer at the start of each row. */
++ gpio_set_value(par->gpio.dc, 0);
++ write_reg(par, 0x80 | 0);
++ write_reg(par, 0x40 | y);
++
++ for (x = 0; x < WIDTH; x++) {
++ u8 ch = 0;
++ for (i = 0; i < 8*WIDTH; i += WIDTH) {
++ ch >>= 1;
++ if (vmem16[(y*8*WIDTH)+i+x])
++ ch |= 0x80;
++ }
++ *buf++ = ch;
++ }
++ /* Write the row */
++ gpio_set_value(par->gpio.dc, 1);
++ ret = par->fbtftops.write(par, par->txbuf.buf, WIDTH);
++ if (ret < 0) {
++ dev_err(par->info->device,
++ "%s: write failed and returned: %d\n", __func__, ret);
++ break;
++ }
++ }
++
++ return ret;
++}
++
++static int set_gamma(struct fbtft_par *par, unsigned long *curves)
++{
++ fbtft_par_dbg(DEBUG_INIT_DISPLAY, par, "%s()\n", __func__);
++
++ /* apply mask */
++ curves[0] &= 0x7F;
++
++ write_reg(par, 0x21); /* turn on extended instruction set */
++ write_reg(par, 0x80 | curves[0]);
++ write_reg(par, 0x20); /* turn off extended instruction set */
++
++ return 0;
++}
++
++
++static struct fbtft_display display = {
++ .regwidth = 8,
++ .width = WIDTH,
++ .height = HEIGHT,
++ .txbuflen = TXBUFLEN,
++ .gamma_num = 1,
++ .gamma_len = 1,
++ .gamma = DEFAULT_GAMMA,
++ .fbtftops = {
++ .init_display = init_display,
++ .set_addr_win = set_addr_win,
++ .write_vmem = write_vmem,
++ .set_gamma = set_gamma,
++ },
++ .backlight = 1,
++};
++FBTFT_REGISTER_DRIVER(DRVNAME, "teralane,tls8204", &display);
++
++MODULE_ALIAS("spi:" DRVNAME);
++MODULE_ALIAS("spi:tls8204");
++
++MODULE_DESCRIPTION("FB driver for the TLS8204 LCD Controller");
++MODULE_AUTHOR("Michael Hope");
++MODULE_LICENSE("GPL");
+diff -Nur linux-3.18.8/drivers/staging/fbtft/fb_uc1701.c linux-rpi/drivers/staging/fbtft/fb_uc1701.c
+--- linux-3.18.8/drivers/staging/fbtft/fb_uc1701.c 1970-01-01 01:00:00.000000000 +0100
++++ linux-rpi/drivers/staging/fbtft/fb_uc1701.c 2015-03-05 14:40:16.345715808 +0100
+@@ -0,0 +1,210 @@
++/*
++ * FB driver for the UC1701 LCD Controller
++ *
++ * The display is monochrome and the video memory is RGB565.
++ * Any pixel value except 0 turns the pixel on.
++ *
++ * Copyright (C) 2014 Juergen Holzmann
++ *
++ * This program is free software; you can redistribute it and/or modify
++ * it under the terms of the GNU General Public License as published by
++ * the Free Software Foundation; either version 2 of the License, or
++ * (at your option) any later version.
++ *
++ * This program is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
++ * GNU General Public License for more details.
++ *
++ * 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., 675 Mass Ave, Cambridge, MA 02139, USA.
++ */
++
++#include <linux/module.h>
++#include <linux/kernel.h>
++#include <linux/init.h>
++#include <linux/gpio.h>
++#include <linux/spi/spi.h>
++#include <linux/delay.h>
++
++#include "fbtft.h"
++
++#define DRVNAME "fb_uc1701"
++#define WIDTH 102
++#define HEIGHT 64
++#define PAGES (HEIGHT/8)
++
++/* 1: Display on/off */
++#define LCD_DISPLAY_ENABLE 0xAE
++/* 2: display start line set */
++#define LCD_START_LINE 0x40
++/* 3: Page address set (lower 4 bits select one of the pages) */
++#define LCD_PAGE_ADDRESS 0xB0
++/* 4: column address */
++#define LCD_COL_ADDRESS 0x10
++/* 8: select orientation */
++#define LCD_BOTTOMVIEW 0xA0
++/* 9: inverted display */
++#define LCD_DISPLAY_INVERT 0xA6
++/* 10: show memory content or switch all pixels on */
++#define LCD_ALL_PIXEL 0xA4
++/* 11: lcd bias set */
++#define LCD_BIAS 0xA2
++/* 14: Reset Controller */
++#define LCD_RESET_CMD 0xE2
++/* 15: output mode select (turns display upside-down) */
++#define LCD_SCAN_DIR 0xC0
++/* 16: power control set */
++#define LCD_POWER_CONTROL 0x28
++/* 17: voltage regulator resistor ratio set */
++#define LCD_VOLTAGE 0x20
++/* 18: Volume mode set */
++#define LCD_VOLUME_MODE 0x81
++/* 22: NOP command */
++#define LCD_NO_OP 0xE3
++/* 25: advanced program control */
++#define LCD_ADV_PROG_CTRL 0xFA
++/* 25: advanced program control2 */
++#define LCD_ADV_PROG_CTRL2 0x10
++#define LCD_TEMPCOMP_HIGH 0x80
++/* column offset for normal orientation */
++#define SHIFT_ADDR_NORMAL 0
++/* column offset for bottom view orientation */
++#define SHIFT_ADDR_TOPVIEW 30
++
++
++static int init_display(struct fbtft_par *par)
++{
++ fbtft_par_dbg(DEBUG_INIT_DISPLAY, par, "%s()\n", __func__);
++
++ par->fbtftops.reset(par);
++
++ /* softreset of LCD */
++ write_reg(par, LCD_RESET_CMD);
++ mdelay(10);
++
++ /* set startpoint */
++ /* LCD_START_LINE | (pos & 0x3F) */
++ write_reg(par, LCD_START_LINE);
++
++ /* select orientation BOTTOMVIEW */
++ write_reg(par, LCD_BOTTOMVIEW | 1);
++ /* output mode select (turns display upside-down) */
++ write_reg(par, LCD_SCAN_DIR | 0x00);
++
++ /* Normal Pixel mode */
++ write_reg(par, LCD_ALL_PIXEL | 0);
++
++ /* positive display */
++ write_reg(par, LCD_DISPLAY_INVERT | 0);
++
++ /* bias 1/9 */
++ write_reg(par, LCD_BIAS | 0);
++
++ /* power control mode: all features on */
++ /* LCD_POWER_CONTROL | (val&0x07) */
++ write_reg(par, LCD_POWER_CONTROL | 0x07);
++
++ /* set voltage regulator R/R */
++ /* LCD_VOLTAGE | (val&0x07) */
++ write_reg(par, LCD_VOLTAGE | 0x07);
++
++ /* volume mode set */
++ /* LCD_VOLUME_MODE,val&0x3f,LCD_NO_OP */
++ write_reg(par, LCD_VOLUME_MODE);
++ /* LCD_VOLUME_MODE,val&0x3f,LCD_NO_OP */
++ write_reg(par, 0x09);
++ /* ???? */
++ /* LCD_VOLUME_MODE,val&0x3f,LCD_NO_OP */
++ write_reg(par, LCD_NO_OP);
++
++ /* advanced program control */
++ write_reg(par, LCD_ADV_PROG_CTRL);
++ write_reg(par, LCD_ADV_PROG_CTRL2|LCD_TEMPCOMP_HIGH);
++
++ /* enable display */
++ write_reg(par, LCD_DISPLAY_ENABLE | 1);
++
++ return 0;
++}
++
++static void set_addr_win(struct fbtft_par *par, int xs, int ys, int xe, int ye)
++{
++ fbtft_par_dbg(DEBUG_SET_ADDR_WIN, par, "%s(xs=%d, ys=%d, xe=%d, ye=%d)\n", __func__, xs, ys, xe, ye);
++
++ /* goto address */
++ /* LCD_PAGE_ADDRESS | ((page) & 0x1F),
++ (((col)+SHIFT_ADDR_NORMAL) & 0x0F),
++ LCD_COL_ADDRESS | ((((col)+SHIFT_ADDR_NORMAL)>>4) & 0x0F) */
++ write_reg(par, LCD_PAGE_ADDRESS);
++ /* LCD_PAGE_ADDRESS | ((page) & 0x1F),
++ (((col)+SHIFT_ADDR_NORMAL) & 0x0F),
++ LCD_COL_ADDRESS | ((((col)+SHIFT_ADDR_NORMAL)>>4) & 0x0F) */
++ write_reg(par, 0x00);
++ /* LCD_PAGE_ADDRESS | ((page) & 0x1F),
++ (((col)+SHIFT_ADDR_NORMAL) & 0x0F),
++ LCD_COL_ADDRESS | ((((col)+SHIFT_ADDR_NORMAL)>>4) & 0x0F) */
++ write_reg(par, LCD_COL_ADDRESS);
++}
++
++static int write_vmem(struct fbtft_par *par, size_t offset, size_t len)
++{
++ u16 *vmem16 = (u16 *)par->info->screen_base;
++ u8 *buf = par->txbuf.buf;
++ int x, y, i;
++ int ret = 0;
++
++ fbtft_par_dbg(DEBUG_WRITE_VMEM, par, "%s()\n", __func__);
++
++ for (y = 0; y < PAGES; y++) {
++ buf = par->txbuf.buf;
++ for (x = 0; x < WIDTH; x++) {
++ *buf = 0x00;
++ for (i = 0; i < 8; i++)
++ *buf |= (vmem16[((y*8*WIDTH)+(i*WIDTH))+x] ? 1 : 0) << i;
++ buf++;
++ }
++ /* LCD_PAGE_ADDRESS | ((page) & 0x1F),
++ (((col)+SHIFT_ADDR_NORMAL) & 0x0F),
++ LCD_COL_ADDRESS | ((((col)+SHIFT_ADDR_NORMAL)>>4) & 0x0F) */
++ write_reg(par, LCD_PAGE_ADDRESS|(u8)y);
++ /* LCD_PAGE_ADDRESS | ((page) & 0x1F),
++ (((col)+SHIFT_ADDR_NORMAL) & 0x0F),
++ LCD_COL_ADDRESS | ((((col)+SHIFT_ADDR_NORMAL)>>4) & 0x0F) */
++ write_reg(par, 0x00);
++ /* LCD_PAGE_ADDRESS | ((page) & 0x1F),
++ (((col)+SHIFT_ADDR_NORMAL) & 0x0F),
++ LCD_COL_ADDRESS | ((((col)+SHIFT_ADDR_NORMAL)>>4) & 0x0F) */
++ write_reg(par, LCD_COL_ADDRESS);
++ gpio_set_value(par->gpio.dc, 1);
++ ret = par->fbtftops.write(par, par->txbuf.buf, WIDTH);
++ gpio_set_value(par->gpio.dc, 0);
++ }
++
++ if (ret < 0)
++ dev_err(par->info->device, "%s: write failed and returned: %d\n", __func__, ret);
++
++ return ret;
++}
++
++
++static struct fbtft_display display = {
++ .regwidth = 8,
++ .width = WIDTH,
++ .height = HEIGHT,
++ .fbtftops = {
++ .init_display = init_display,
++ .set_addr_win = set_addr_win,
++ .write_vmem = write_vmem,
++ },
++ .backlight = 1,
++};
++FBTFT_REGISTER_DRIVER(DRVNAME, "UltraChip,uc1701", &display);
++
++MODULE_ALIAS("spi:" DRVNAME);
++MODULE_ALIAS("spi:uc1701");
++
++MODULE_DESCRIPTION("FB driver for the UC1701 LCD Controller");
++MODULE_AUTHOR("Juergen Holzmann");
++MODULE_LICENSE("GPL");
+diff -Nur linux-3.18.8/drivers/staging/fbtft/fb_upd161704.c linux-rpi/drivers/staging/fbtft/fb_upd161704.c
+--- linux-3.18.8/drivers/staging/fbtft/fb_upd161704.c 1970-01-01 01:00:00.000000000 +0100
++++ linux-rpi/drivers/staging/fbtft/fb_upd161704.c 2015-03-05 14:40:16.345715808 +0100
+@@ -0,0 +1,206 @@
++/*
++ * FB driver for the uPD161704 LCD Controller
++ *
++ * Copyright (C) 2014 Seong-Woo Kim
++ *
++ * Based on fb_ili9325.c by Noralf Tronnes
++ * Based on ili9325.c by Jeroen Domburg
++ * Init code from UTFT library by Henning Karlsen
++ *
++ * This program is free software; you can redistribute it and/or modify
++ * it under the terms of the GNU General Public License as published by
++ * the Free Software Foundation; either version 2 of the License, or
++ * (at your option) any later version.
++ *
++ * This program is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
++ * GNU General Public License for more details.
++ *
++ * 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., 675 Mass Ave, Cambridge, MA 02139, USA.
++ */
++
++#include <linux/module.h>
++#include <linux/kernel.h>
++#include <linux/init.h>
++#include <linux/gpio.h>
++#include <linux/delay.h>
++
++#include "fbtft.h"
++
++#define DRVNAME "fb_upd161704"
++#define WIDTH 240
++#define HEIGHT 320
++#define BPP 16
++
++static int init_display(struct fbtft_par *par)
++{
++ fbtft_par_dbg(DEBUG_INIT_DISPLAY, par, "%s()\n", __func__);
++
++ par->fbtftops.reset(par);
++
++ if (par->gpio.cs != -1)
++ gpio_set_value(par->gpio.cs, 0); /* Activate chip */
++
++ /* Initialization sequence from Lib_UTFT */
++
++ /* register reset */
++ write_reg(par, 0x0003,0x0001); /* Soft reset */
++
++ /* oscillator start */
++ write_reg(par, 0x003A,0x0001); /*Oscillator 0: stop, 1: operation */
++ udelay(100);
++
++ /* y-setting */
++ write_reg(par, 0x0024,0x007B); /* amplitude setting */
++ udelay(10);
++ write_reg(par, 0x0025,0x003B); /* amplitude setting */
++ write_reg(par, 0x0026,0x0034); /* amplitude setting */
++ udelay(10);
++ write_reg(par, 0x0027,0x0004); /* amplitude setting */
++ write_reg(par, 0x0052,0x0025); /* circuit setting 1 */
++ udelay(10);
++ write_reg(par, 0x0053,0x0033); /* circuit setting 2 */
++ write_reg(par, 0x0061,0x001C); /* adjustment V10 positive polarity */
++ udelay(10);
++ write_reg(par, 0x0062,0x002C); /* adjustment V9 negative polarity */
++ write_reg(par, 0x0063,0x0022); /* adjustment V34 positive polarity */
++ udelay(10);
++ write_reg(par, 0x0064,0x0027); /* adjustment V31 negative polarity */
++ udelay(10);
++ write_reg(par, 0x0065,0x0014); /* adjustment V61 negative polarity */
++ udelay(10);
++ write_reg(par, 0x0066,0x0010); /* adjustment V61 negative polarity */
++
++ /* Basical clock for 1 line (BASECOUNT[7:0]) number specified */
++ write_reg(par, 0x002E,0x002D);
++
++ /* Power supply setting */
++ write_reg(par, 0x0019,0x0000); /* DC/DC output setting */
++ udelay(200);
++ write_reg(par, 0x001A,0x1000); /* DC/DC frequency setting */
++ write_reg(par, 0x001B,0x0023); /* DC/DC rising setting */
++ write_reg(par, 0x001C,0x0C01); /* Regulator voltage setting */
++ write_reg(par, 0x001D,0x0000); /* Regulator current setting */
++ write_reg(par, 0x001E,0x0009); /* VCOM output setting */
++ write_reg(par, 0x001F,0x0035); /* VCOM amplitude setting */
++ write_reg(par, 0x0020,0x0015); /* VCOMM cencter setting */
++ write_reg(par, 0x0018,0x1E7B); /* DC/DC operation setting */
++
++ /* windows setting */
++ write_reg(par, 0x0008,0x0000); /* Minimum X address */
++ write_reg(par, 0x0009,0x00EF); /* Maximum X address */
++ write_reg(par, 0x000a,0x0000); /* Minimum Y address */
++ write_reg(par, 0x000b,0x013F); /* Maximum Y address */
++
++ /* LCD display area setting */
++ write_reg(par, 0x0029,0x0000); /* [LCDSIZE] X MIN. size set */
++ write_reg(par, 0x002A,0x0000); /* [LCDSIZE] Y MIN. size set */
++ write_reg(par, 0x002B,0x00EF); /* [LCDSIZE] X MAX. size set */
++ write_reg(par, 0x002C,0x013F); /* [LCDSIZE] Y MAX. size set */
++
++ /* Gate scan setting */
++ write_reg(par, 0x0032,0x0002);
++
++ /* n line inversion line number */
++ write_reg(par, 0x0033,0x0000);
++
++ /* Line inversion/frame inversion/interlace setting */
++ write_reg(par, 0x0037,0x0000);
++
++ /* Gate scan operation setting register */
++ write_reg(par, 0x003B,0x0001);
++
++ /* Color mode */
++ /*GS = 0: 260-k color (64 gray scale), GS = 1: 8 color (2 gray scale) */
++ write_reg(par, 0x0004,0x0000);
++
++ /* RAM control register */
++ write_reg(par, 0x0005,0x0000); /*Window access 00:Normal, 10:Window */
++
++ /* Display setting register 2 */
++ write_reg(par, 0x0001,0x0000);
++
++ /* display setting */
++ write_reg(par, 0x0000,0x0000); /* display on */
++
++ return 0;
++}
++
++static void set_addr_win(struct fbtft_par *par, int xs, int ys, int xe, int ye)
++{
++ fbtft_par_dbg(DEBUG_SET_ADDR_WIN, par,
++ "%s(xs=%d, ys=%d, xe=%d, ye=%d)\n", __func__, xs, ys, xe, ye);
++ switch (par->info->var.rotate) {
++ /* R20h = Horizontal GRAM Start Address */
++ /* R21h = Vertical GRAM Start Address */
++ case 0:
++ write_reg(par, 0x0006, xs);
++ write_reg(par, 0x0007, ys);
++ break;
++ case 180:
++ write_reg(par, 0x0006, WIDTH - 1 - xs);
++ write_reg(par, 0x0007, HEIGHT - 1 - ys);
++ break;
++ case 270:
++ write_reg(par, 0x0006, WIDTH - 1 - ys);
++ write_reg(par, 0x0007, xs);
++ break;
++ case 90:
++ write_reg(par, 0x0006, ys);
++ write_reg(par, 0x0007, HEIGHT - 1 - xs);
++ break;
++ }
++
++ write_reg(par, 0x0e); /* Write Data to GRAM */
++}
++
++static int set_var(struct fbtft_par *par)
++{
++ fbtft_par_dbg(DEBUG_INIT_DISPLAY, par, "%s()\n", __func__);
++
++ switch (par->info->var.rotate) {
++ /* AM: GRAM update direction */
++ case 0:
++ write_reg(par, 0x01, 0x0000);
++ write_reg(par, 0x05, 0x0000);
++ break;
++ case 180:
++ write_reg(par, 0x01, 0x00C0);
++ write_reg(par, 0x05, 0x0000);
++ break;
++ case 270:
++ write_reg(par, 0x01, 0x0080);
++ write_reg(par, 0x05, 0x0001);
++ break;
++ case 90:
++ write_reg(par, 0x01, 0x0040);
++ write_reg(par, 0x05, 0x0001);
++ break;
++ }
++
++ return 0;
++}
++
++static struct fbtft_display display = {
++ .regwidth = 16,
++ .width = WIDTH,
++ .height = HEIGHT,
++ .fbtftops = {
++ .init_display = init_display,
++ .set_addr_win = set_addr_win,
++ .set_var = set_var,
++ },
++};
++FBTFT_REGISTER_DRIVER(DRVNAME, "nec,upd161704", &display);
++
++MODULE_ALIAS("spi:" DRVNAME);
++MODULE_ALIAS("platform:" DRVNAME);
++MODULE_ALIAS("spi:upd161704");
++MODULE_ALIAS("platform:upd161704");
++
++MODULE_DESCRIPTION("FB driver for the uPD161704 LCD Controller");
++MODULE_AUTHOR("Seong-Woo Kim");
++MODULE_LICENSE("GPL");
+diff -Nur linux-3.18.8/drivers/staging/fbtft/fb_watterott.c linux-rpi/drivers/staging/fbtft/fb_watterott.c
+--- linux-3.18.8/drivers/staging/fbtft/fb_watterott.c 1970-01-01 01:00:00.000000000 +0100
++++ linux-rpi/drivers/staging/fbtft/fb_watterott.c 2015-03-05 14:40:16.345715808 +0100
+@@ -0,0 +1,324 @@
++/*
++ * FB driver for the Watterott LCD Controller
++ *
++ * Copyright (C) 2013 Noralf Tronnes
++ *
++ * This program is free software; you can redistribute it and/or modify
++ * it under the terms of the GNU General Public License as published by
++ * the Free Software Foundation; either version 2 of the License, or
++ * (at your option) any later version.
++ *
++ * This program is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
++ * GNU General Public License for more details.
++ *
++ * 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., 675 Mass Ave, Cambridge, MA 02139, USA.
++ */
++
++#include <linux/module.h>
++#include <linux/kernel.h>
++#include <linux/init.h>
++#include <linux/gpio.h>
++#include <linux/delay.h>
++
++#include "fbtft.h"
++
++#define DRVNAME "fb_watterott"
++#define WIDTH 320
++#define HEIGHT 240
++#define FPS 5
++#define TXBUFLEN 1024
++#define DEFAULT_BRIGHTNESS 50
++
++#define CMD_VERSION 0x01
++#define CMD_LCD_LED 0x10
++#define CMD_LCD_RESET 0x11
++#define CMD_LCD_ORIENTATION 0x20
++#define CMD_LCD_DRAWIMAGE 0x27
++#define COLOR_RGB323 8
++#define COLOR_RGB332 9
++#define COLOR_RGB233 10
++#define COLOR_RGB565 16
++
++
++static short mode = 565;
++module_param(mode, short, 0);
++MODULE_PARM_DESC(mode, "RGB color transfer mode: 332, 565 (default)");
++
++static void write_reg8_bus8(struct fbtft_par *par, int len, ...)
++{
++ va_list args;
++ int i, ret;
++ u8 *buf = par->buf;
++
++ va_start(args, len);
++ for (i = 0; i < len; i++)
++ *buf++ = (u8)va_arg(args, unsigned int);
++ va_end(args);
++
++ fbtft_par_dbg_hex(DEBUG_WRITE_REGISTER, par,
++ par->info->device, u8, par->buf, len, "%s: ", __func__);
++
++ ret = par->fbtftops.write(par, par->buf, len);
++ if (ret < 0) {
++ dev_err(par->info->device,
++ "%s: write() failed and returned %d\n", __func__, ret);
++ return;
++ }
++}
++
++static int write_vmem(struct fbtft_par *par, size_t offset, size_t len)
++{
++ unsigned start_line, end_line;
++ u16 *vmem16 = (u16 *)(par->info->screen_base + offset);
++ u16 *pos = par->txbuf.buf + 1;
++ u16 *buf16 = par->txbuf.buf + 10;
++ int i, j;
++ int ret = 0;
++
++ fbtft_par_dbg(DEBUG_WRITE_VMEM, par, "%s()\n", __func__);
++
++ start_line = offset / par->info->fix.line_length;
++ end_line = start_line + (len / par->info->fix.line_length) - 1;
++
++ /* Set command header. pos: x, y, w, h */
++ ((u8 *)par->txbuf.buf)[0] = CMD_LCD_DRAWIMAGE;
++ pos[0] = 0;
++ pos[2] = cpu_to_be16(par->info->var.xres);
++ pos[3] = cpu_to_be16(1);
++ ((u8 *)par->txbuf.buf)[9] = COLOR_RGB565;
++
++ for (i = start_line; i <= end_line; i++) {
++ pos[1] = cpu_to_be16(i);
++ for (j = 0; j < par->info->var.xres; j++)
++ buf16[j] = cpu_to_be16(*vmem16++);
++ ret = par->fbtftops.write(par,
++ par->txbuf.buf, 10 + par->info->fix.line_length);
++ if (ret < 0)
++ return ret;
++ udelay(300);
++ }
++
++ return 0;
++}
++
++#define RGB565toRGB323(c) (((c&0xE000)>>8) | ((c&0600)>>6) | ((c&0x001C)>>2))
++#define RGB565toRGB332(c) (((c&0xE000)>>8) | ((c&0700)>>6) | ((c&0x0018)>>3))
++#define RGB565toRGB233(c) (((c&0xC000)>>8) | ((c&0700)>>5) | ((c&0x001C)>>2))
++
++static int write_vmem_8bit(struct fbtft_par *par, size_t offset, size_t len)
++{
++ unsigned start_line, end_line;
++ u16 *vmem16 = (u16 *)(par->info->screen_base + offset);
++ u16 *pos = par->txbuf.buf + 1;
++ u8 *buf8 = par->txbuf.buf + 10;
++ int i, j;
++ int ret = 0;
++
++ fbtft_par_dbg(DEBUG_WRITE_VMEM, par, "%s()\n", __func__);
++
++ start_line = offset / par->info->fix.line_length;
++ end_line = start_line + (len / par->info->fix.line_length) - 1;
++
++ /* Set command header. pos: x, y, w, h */
++ ((u8 *)par->txbuf.buf)[0] = CMD_LCD_DRAWIMAGE;
++ pos[0] = 0;
++ pos[2] = cpu_to_be16(par->info->var.xres);
++ pos[3] = cpu_to_be16(1);
++ ((u8 *)par->txbuf.buf)[9] = COLOR_RGB332;
++
++ for (i = start_line; i <= end_line; i++) {
++ pos[1] = cpu_to_be16(i);
++ for (j = 0; j < par->info->var.xres; j++) {
++ buf8[j] = RGB565toRGB332(*vmem16);
++ vmem16++;
++ }
++ ret = par->fbtftops.write(par,
++ par->txbuf.buf, 10 + par->info->var.xres);
++ if (ret < 0)
++ return ret;
++ udelay(700);
++ }
++
++ return 0;
++}
++
++static unsigned firmware_version(struct fbtft_par *par)
++{
++ u8 rxbuf[4] = {0, };
++
++ write_reg(par, CMD_VERSION);
++ par->fbtftops.read(par, rxbuf, 4);
++ if (rxbuf[1] != '.')
++ return 0;
++
++ return (rxbuf[0] - '0') << 8 | (rxbuf[2] - '0') << 4 | (rxbuf[3] - '0');
++}
++
++static int init_display(struct fbtft_par *par)
++{
++ int ret;
++ unsigned version;
++ u8 save_mode;
++
++ fbtft_par_dbg(DEBUG_INIT_DISPLAY, par, "%s()\n", __func__);
++
++ /* enable SPI interface by having CS and MOSI low during reset */
++ save_mode = par->spi->mode;
++ par->spi->mode |= SPI_CS_HIGH;
++ ret = par->spi->master->setup(par->spi); /* set CS inactive low */
++ if (ret) {
++ dev_err(par->info->device, "Could not set SPI_CS_HIGH\n");
++ return ret;
++ }
++ write_reg(par, 0x00); /* make sure mode is set */
++
++ mdelay(50);
++ par->fbtftops.reset(par);
++ mdelay(1000);
++ par->spi->mode = save_mode;
++ ret = par->spi->master->setup(par->spi);
++ if (ret) {
++ dev_err(par->info->device, "Could not restore SPI mode\n");
++ return ret;
++ }
++ write_reg(par, 0x00);
++
++ version = firmware_version(par);
++ fbtft_par_dbg(DEBUG_INIT_DISPLAY, par, "Firmware version: %x.%02x\n",
++ version >> 8, version & 0xFF);
++
++ if (mode == 332)
++ par->fbtftops.write_vmem = write_vmem_8bit;
++ return 0;
++}
++
++static void set_addr_win(struct fbtft_par *par, int xs, int ys, int xe, int ye)
++{
++ /* not used on this controller */
++}
++
++static int set_var(struct fbtft_par *par)
++{
++ u8 rotate;
++
++ fbtft_par_dbg(DEBUG_INIT_DISPLAY, par, "%s()\n", __func__);
++
++ /* this controller rotates clock wise */
++ switch (par->info->var.rotate) {
++ case 90:
++ rotate = 27;
++ break;
++ case 180:
++ rotate = 18;
++ break;
++ case 270:
++ rotate = 9;
++ break;
++ default:
++ rotate = 0;
++ }
++ write_reg(par, CMD_LCD_ORIENTATION, rotate);
++
++ return 0;
++}
++
++static int verify_gpios(struct fbtft_par *par)
++{
++ if (par->gpio.reset < 0) {
++ dev_err(par->info->device, "Missing 'reset' gpio. Aborting.\n");
++ return -EINVAL;
++ }
++ return 0;
++}
++
++#ifdef CONFIG_FB_BACKLIGHT
++static int backlight_chip_update_status(struct backlight_device *bd)
++{
++ struct fbtft_par *par = bl_get_data(bd);
++ int brightness = bd->props.brightness;
++
++ fbtft_par_dbg(DEBUG_BACKLIGHT, par,
++ "%s: brightness=%d, power=%d, fb_blank=%d\n",
++ __func__, bd->props.brightness, bd->props.power,
++ bd->props.fb_blank);
++
++ if (bd->props.power != FB_BLANK_UNBLANK)
++ brightness = 0;
++
++ if (bd->props.fb_blank != FB_BLANK_UNBLANK)
++ brightness = 0;
++
++ write_reg(par, CMD_LCD_LED, brightness);
++
++ return 0;
++}
++
++static void register_chip_backlight(struct fbtft_par *par)
++{
++ struct backlight_device *bd;
++ struct backlight_properties bl_props = { 0, };
++ struct backlight_ops *bl_ops;
++
++ fbtft_par_dbg(DEBUG_BACKLIGHT, par, "%s()\n", __func__);
++
++ bl_ops = devm_kzalloc(par->info->device, sizeof(struct backlight_ops),
++ GFP_KERNEL);
++ if (!bl_ops) {
++ dev_err(par->info->device,
++ "%s: could not allocate memory for backlight operations.\n",
++ __func__);
++ return;
++ }
++
++ bl_ops->update_status = backlight_chip_update_status;
++ bl_props.type = BACKLIGHT_RAW;
++ bl_props.power = FB_BLANK_POWERDOWN;
++ bl_props.max_brightness = 100;
++ bl_props.brightness = DEFAULT_BRIGHTNESS;
++
++ bd = backlight_device_register(dev_driver_string(par->info->device),
++ par->info->device, par, bl_ops, &bl_props);
++ if (IS_ERR(bd)) {
++ dev_err(par->info->device,
++ "cannot register backlight device (%ld)\n",
++ PTR_ERR(bd));
++ return;
++ }
++ par->info->bl_dev = bd;
++
++ if (!par->fbtftops.unregister_backlight)
++ par->fbtftops.unregister_backlight = fbtft_unregister_backlight;
++}
++#else
++#define register_chip_backlight NULL
++#endif
++
++
++static struct fbtft_display display = {
++ .regwidth = 8,
++ .buswidth = 8,
++ .width = WIDTH,
++ .height = HEIGHT,
++ .fps = FPS,
++ .txbuflen = TXBUFLEN,
++ .fbtftops = {
++ .write_register = write_reg8_bus8,
++ .write_vmem = write_vmem,
++ .init_display = init_display,
++ .set_addr_win = set_addr_win,
++ .set_var = set_var,
++ .verify_gpios = verify_gpios,
++ .register_backlight = register_chip_backlight,
++ },
++};
++FBTFT_REGISTER_DRIVER(DRVNAME, "watterott,openlcd", &display);
++
++MODULE_ALIAS("spi:" DRVNAME);
++
++MODULE_DESCRIPTION("FB driver for the Watterott LCD Controller");
++MODULE_AUTHOR("Noralf Tronnes");
++MODULE_LICENSE("GPL");
+diff -Nur linux-3.18.8/drivers/staging/fbtft/flexfb.c linux-rpi/drivers/staging/fbtft/flexfb.c
+--- linux-3.18.8/drivers/staging/fbtft/flexfb.c 1970-01-01 01:00:00.000000000 +0100
++++ linux-rpi/drivers/staging/fbtft/flexfb.c 2015-03-05 14:40:16.345715808 +0100
+@@ -0,0 +1,592 @@
++/*
++ * Generic FB driver for TFT LCD displays
++ *
++ * Copyright (C) 2013 Noralf Tronnes
++ *
++ * This program is free software; you can redistribute it and/or modify
++ * it under the terms of the GNU General Public License as published by
++ * the Free Software Foundation; either version 2 of the License, or
++ * (at your option) any later version.
++ *
++ * This program is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
++ * GNU General Public License for more details.
++ *
++ * 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., 675 Mass Ave, Cambridge, MA 02139, USA.
++ */
++
++#include <linux/module.h>
++#include <linux/kernel.h>
++#include <linux/init.h>
++#include <linux/vmalloc.h>
++#include <linux/gpio.h>
++#include <linux/spi/spi.h>
++#include <linux/delay.h>
++
++#include "fbtft.h"
++
++#define DRVNAME "flexfb"
++
++
++static char *chip;
++module_param(chip, charp, 0);
++MODULE_PARM_DESC(chip, "LCD controller");
++
++static unsigned int width;
++module_param(width, uint, 0);
++MODULE_PARM_DESC(width, "Display width");
++
++static unsigned int height;
++module_param(height, uint, 0);
++MODULE_PARM_DESC(height, "Display height");
++
++static int init[512];
++static int init_num;
++module_param_array(init, int, &init_num, 0);
++MODULE_PARM_DESC(init, "Init sequence");
++
++static unsigned int setaddrwin;
++module_param(setaddrwin, uint, 0);
++MODULE_PARM_DESC(setaddrwin, "Which set_addr_win() implementation to use");
++
++static unsigned int buswidth = 8;
++module_param(buswidth, uint, 0);
++MODULE_PARM_DESC(buswidth, "Width of databus (default: 8)");
++
++static unsigned int regwidth = 8;
++module_param(regwidth, uint, 0);
++MODULE_PARM_DESC(regwidth, "Width of controller register (default: 8)");
++
++static bool nobacklight;
++module_param(nobacklight, bool, 0);
++MODULE_PARM_DESC(nobacklight, "Turn off backlight functionality.");
++
++static bool latched;
++module_param(latched, bool, 0);
++MODULE_PARM_DESC(latched, "Use with latched 16-bit databus");
++
++
++static int *initp;
++static int initp_num;
++
++/* default init sequences */
++static int st7735r_init[] = { \
++-1,0x01,-2,150,-1,0x11,-2,500,-1,0xB1,0x01,0x2C,0x2D,-1,0xB2,0x01,0x2C,0x2D,-1,0xB3,0x01,0x2C,0x2D,0x01,0x2C,0x2D, \
++-1,0xB4,0x07,-1,0xC0,0xA2,0x02,0x84,-1,0xC1,0xC5,-1,0xC2,0x0A,0x00,-1,0xC3,0x8A,0x2A,-1,0xC4,0x8A,0xEE,-1,0xC5,0x0E, \
++-1,0x20,-1,0x36,0xC0,-1,0x3A,0x05,-1,0xE0,0x0f,0x1a,0x0f,0x18,0x2f,0x28,0x20,0x22,0x1f,0x1b,0x23,0x37,0x00,0x07,0x02,0x10, \
++-1,0xE1,0x0f,0x1b,0x0f,0x17,0x33,0x2c,0x29,0x2e,0x30,0x30,0x39,0x3f,0x00,0x07,0x03,0x10,-1,0x29,-2,100,-1,0x13,-2,10,-3 };
++
++static int ssd1289_init[] = { \
++-1,0x00,0x0001,-1,0x03,0xA8A4,-1,0x0C,0x0000,-1,0x0D,0x080C,-1,0x0E,0x2B00,-1,0x1E,0x00B7,-1,0x01,0x2B3F,-1,0x02,0x0600, \
++-1,0x10,0x0000,-1,0x11,0x6070,-1,0x05,0x0000,-1,0x06,0x0000,-1,0x16,0xEF1C,-1,0x17,0x0003,-1,0x07,0x0233,-1,0x0B,0x0000, \
++-1,0x0F,0x0000,-1,0x41,0x0000,-1,0x42,0x0000,-1,0x48,0x0000,-1,0x49,0x013F,-1,0x4A,0x0000,-1,0x4B,0x0000,-1,0x44,0xEF00, \
++-1,0x45,0x0000,-1,0x46,0x013F,-1,0x30,0x0707,-1,0x31,0x0204,-1,0x32,0x0204,-1,0x33,0x0502,-1,0x34,0x0507,-1,0x35,0x0204, \
++-1,0x36,0x0204,-1,0x37,0x0502,-1,0x3A,0x0302,-1,0x3B,0x0302,-1,0x23,0x0000,-1,0x24,0x0000,-1,0x25,0x8000,-1,0x4f,0x0000, \
++-1,0x4e,0x0000,-1,0x22,-3 };
++
++static int hx8340bn_init[] = { \
++-1,0xC1,0xFF,0x83,0x40,-1,0x11,-2,150,-1,0xCA,0x70,0x00,0xD9,-1,0xB0,0x01,0x11, \
++-1,0xC9,0x90,0x49,0x10,0x28,0x28,0x10,0x00,0x06,-2,20,-1,0xC2,0x60,0x71,0x01,0x0E,0x05,0x02,0x09,0x31,0x0A, \
++-1,0xC3,0x67,0x30,0x61,0x17,0x48,0x07,0x05,0x33,-2,10,-1,0xB5,0x35,0x20,0x45,-1,0xB4,0x33,0x25,0x4C,-2,10, \
++-1,0x3A,0x05,-1,0x29,-2,10,-3 };
++
++static int ili9225_init[] = { \
++-1,0x0001,0x011C,-1,0x0002,0x0100,-1,0x0003,0x1030,-1,0x0008,0x0808,-1,0x000C,0x0000,-1,0x000F,0x0A01,-1,0x0020,0x0000, \
++-1,0x0021,0x0000,-2,50,-1,0x0010,0x0A00,-1,0x0011,0x1038,-2,50,-1,0x0012,0x1121,-1,0x0013,0x004E,-1,0x0014,0x676F, \
++-1,0x0030,0x0000,-1,0x0031,0x00DB,-1,0x0032,0x0000,-1,0x0033,0x0000,-1,0x0034,0x00DB,-1,0x0035,0x0000,-1,0x0036,0x00AF, \
++-1,0x0037,0x0000,-1,0x0038,0x00DB,-1,0x0039,0x0000,-1,0x0050,0x0000,-1,0x0051,0x060A,-1,0x0052,0x0D0A,-1,0x0053,0x0303, \
++-1,0x0054,0x0A0D,-1,0x0055,0x0A06,-1,0x0056,0x0000,-1,0x0057,0x0303,-1,0x0058,0x0000,-1,0x0059,0x0000,-2,50, \
++-1,0x0007,0x1017,-2,50,-3 };
++
++static int ili9320_init[] = { \
++-1,0x00E5,0x8000,-1,0x0000,0x0001,-1,0x0001,0x0100,-1,0x0002,0x0700,-1,0x0003,0x1030,-1,0x0004,0x0000,-1,0x0008,0x0202, \
++-1,0x0009,0x0000,-1,0x000A,0x0000,-1,0x000C,0x0000,-1,0x000D,0x0000,-1,0x000F,0x0000,-1,0x0010,0x0000,-1,0x0011,0x0007, \
++-1,0x0012,0x0000,-1,0x0013,0x0000,-2,200,-1,0x0010,0x17B0,-1,0x0011,0x0031,-2,50,-1,0x0012,0x0138,-2,50,-1,0x0013,0x1800, \
++-1,0x0029,0x0008,-2,50,-1,0x0020,0x0000,-1,0x0021,0x0000,-1,0x0030,0x0000,-1,0x0031,0x0505,-1,0x0032,0x0004, \
++-1,0x0035,0x0006,-1,0x0036,0x0707,-1,0x0037,0x0105,-1,0x0038,0x0002,-1,0x0039,0x0707,-1,0x003C,0x0704,-1,0x003D,0x0807, \
++-1,0x0050,0x0000,-1,0x0051,0x00EF,-1,0x0052,0x0000,-1,0x0053,0x013F,-1,0x0060,0x2700,-1,0x0061,0x0001,-1,0x006A,0x0000, \
++-1,0x0080,0x0000,-1,0x0081,0x0000,-1,0x0082,0x0000,-1,0x0083,0x0000,-1,0x0084,0x0000,-1,0x0085,0x0000,-1,0x0090,0x0010, \
++-1,0x0092,0x0000,-1,0x0093,0x0003,-1,0x0095,0x0110,-1,0x0097,0x0000,-1,0x0098,0x0000,-1,0x0007,0x0173,-3 };
++
++static int ili9325_init[] = { \
++-1,0x00E3,0x3008,-1,0x00E7,0x0012,-1,0x00EF,0x1231,-1,0x0001,0x0100,-1,0x0002,0x0700,-1,0x0003,0x1030,-1,0x0004,0x0000, \
++-1,0x0008,0x0207,-1,0x0009,0x0000,-1,0x000A,0x0000,-1,0x000C,0x0000,-1,0x000D,0x0000,-1,0x000F,0x0000,-1,0x0010,0x0000, \
++-1,0x0011,0x0007,-1,0x0012,0x0000,-1,0x0013,0x0000,-2,200,-1,0x0010,0x1690,-1,0x0011,0x0223,-2,50,-1,0x0012,0x000D,-2,50, \
++-1,0x0013,0x1200,-1,0x0029,0x000A,-1,0x002B,0x000C,-2,50,-1,0x0020,0x0000,-1,0x0021,0x0000,-1,0x0030,0x0000, \
++-1,0x0031,0x0506,-1,0x0032,0x0104,-1,0x0035,0x0207,-1,0x0036,0x000F,-1,0x0037,0x0306,-1,0x0038,0x0102,-1,0x0039,0x0707, \
++-1,0x003C,0x0702,-1,0x003D,0x1604,-1,0x0050,0x0000,-1,0x0051,0x00EF,-1,0x0052,0x0000,-1,0x0053,0x013F,-1,0x0060,0xA700, \
++-1,0x0061,0x0001,-1,0x006A,0x0000,-1,0x0080,0x0000,-1,0x0081,0x0000,-1,0x0082,0x0000,-1,0x0083,0x0000,-1,0x0084,0x0000, \
++-1,0x0085,0x0000,-1,0x0090,0x0010,-1,0x0092,0x0600,-1,0x0007,0x0133,-3 };
++
++static int ili9341_init[] = { \
++-1,0x28,-2,20,-1,0xCF,0x00,0x83,0x30,-1,0xED,0x64,0x03,0x12,0x81,-1,0xE8,0x85,0x01,0x79, \
++-1,0xCB,0x39,0x2c,0x00,0x34,0x02,-1,0xF7,0x20,-1,0xEA,0x00,0x00,-1,0xC0,0x26,-1,0xC1,0x11, \
++-1,0xC5,0x35,0x3E,-1,0xC7,0xBE,-1,0xB1,0x00,0x1B,-1,0xB6,0x0a,0x82,0x27,0x00,-1,0xB7,0x07, \
++-1,0x3A,0x55,-1,0x36,0x48,-1,0x11,-2,120,-1,0x29,-2,20,-3 };
++
++static int ssd1351_init[] = { -1,0xfd,0x12,-1,0xfd,0xb1,-1,0xae,-1,0xb3,0xf1,-1,0xca,0x7f,-1,0xa0,0x74, \
++ -1,0x15,0x00,0x7f,-1,0x75,0x00,0x7f,-1,0xa1,0x00,-1,0xa2,0x00,-1,0xb5,0x00, \
++ -1,0xab,0x01,-1,0xb1,0x32,-1,0xb4,0xa0,0xb5,0x55,-1,0xbb,0x17,-1,0xbe,0x05, \
++ -1,0xc1,0xc8,0x80,0xc8,-1,0xc7,0x0f,-1,0xb6,0x01,-1,0xa6,-1,0xaf,-3 };
++
++
++/* ili9320, ili9325 */
++static void flexfb_set_addr_win_1(struct fbtft_par *par, int xs, int ys, int xe, int ye)
++{
++ fbtft_par_dbg(DEBUG_SET_ADDR_WIN, par, "%s(xs=%d, ys=%d, xe=%d, ye=%d)\n", __func__, xs, ys, xe, ye);
++ switch (par->info->var.rotate) {
++ /* R20h = Horizontal GRAM Start Address */
++ /* R21h = Vertical GRAM Start Address */
++ case 0:
++ write_reg(par, 0x0020, xs);
++ write_reg(par, 0x0021, ys);
++ break;
++ case 180:
++ write_reg(par, 0x0020, width - 1 - xs);
++ write_reg(par, 0x0021, height - 1 - ys);
++ break;
++ case 270:
++ write_reg(par, 0x0020, width - 1 - ys);
++ write_reg(par, 0x0021, xs);
++ break;
++ case 90:
++ write_reg(par, 0x0020, ys);
++ write_reg(par, 0x0021, height - 1 - xs);
++ break;
++ }
++ write_reg(par, 0x0022); /* Write Data to GRAM */
++}
++
++/* ssd1289 */
++static void flexfb_set_addr_win_2(struct fbtft_par *par, int xs, int ys, int xe, int ye)
++{
++ fbtft_par_dbg(DEBUG_SET_ADDR_WIN, par, "%s(xs=%d, ys=%d, xe=%d, ye=%d)\n", __func__, xs, ys, xe, ye);
++
++ switch (par->info->var.rotate) {
++ /* R4Eh - Set GDDRAM X address counter */
++ /* R4Fh - Set GDDRAM Y address counter */
++ case 0:
++ write_reg(par, 0x4e, xs);
++ write_reg(par, 0x4f, ys);
++ break;
++ case 180:
++ write_reg(par, 0x4e, par->info->var.xres - 1 - xs);
++ write_reg(par, 0x4f, par->info->var.yres - 1 - ys);
++ break;
++ case 270:
++ write_reg(par, 0x4e, par->info->var.yres - 1 - ys);
++ write_reg(par, 0x4f, xs);
++ break;
++ case 90:
++ write_reg(par, 0x4e, ys);
++ write_reg(par, 0x4f, par->info->var.xres - 1 - xs);
++ break;
++ }
++
++ /* R22h - RAM data write */
++ write_reg(par, 0x22, 0);
++}
++
++/* ssd1351 */
++static void set_addr_win_3(struct fbtft_par *par, int xs, int ys, int xe, int ye)
++{
++ fbtft_par_dbg(DEBUG_SET_ADDR_WIN, par, "%s(xs=%d, ys=%d, xe=%d, ye=%d)\n", __func__, xs, ys, xe, ye);
++
++ write_reg(par, 0x15, xs, xe);
++ write_reg(par, 0x75, ys, ye);
++ write_reg(par, 0x5C);
++}
++
++static int flexfb_verify_gpios_dc(struct fbtft_par *par)
++{
++ fbtft_par_dbg(DEBUG_VERIFY_GPIOS, par, "%s()\n", __func__);
++
++ if (par->gpio.dc < 0) {
++ dev_err(par->info->device, "Missing info about 'dc' gpio. Aborting.\n");
++ return -EINVAL;
++ }
++
++ return 0;
++}
++
++static int flexfb_verify_gpios_db(struct fbtft_par *par)
++{
++ int i;
++ int num_db = buswidth;
++
++ fbtft_par_dbg(DEBUG_VERIFY_GPIOS, par, "%s()\n", __func__);
++
++ if (par->gpio.dc < 0) {
++ dev_err(par->info->device, "Missing info about 'dc' gpio. Aborting.\n");
++ return -EINVAL;
++ }
++ if (par->gpio.wr < 0) {
++ dev_err(par->info->device, "Missing info about 'wr' gpio. Aborting.\n");
++ return -EINVAL;
++ }
++ if (latched && (par->gpio.latch < 0)) {
++ dev_err(par->info->device, "Missing info about 'latch' gpio. Aborting.\n");
++ return -EINVAL;
++ }
++ if (latched)
++ num_db=buswidth/2;
++ for (i=0;i < num_db;i++) {
++ if (par->gpio.db[i] < 0) {
++ dev_err(par->info->device, "Missing info about 'db%02d' gpio. Aborting.\n", i);
++ return -EINVAL;
++ }
++ }
++
++ return 0;
++}
++
++static struct fbtft_display flex_display = { };
++
++static int flexfb_probe_common(struct spi_device *sdev, struct platform_device *pdev)
++{
++ struct device *dev;
++ struct fb_info *info;
++ struct fbtft_par *par;
++ int ret;
++
++ initp = init;
++ initp_num = init_num;
++
++ if (sdev)
++ dev = &sdev->dev;
++ else
++ dev = &pdev->dev;
++
++ fbtft_init_dbg(dev, "%s(%s)\n", __func__, sdev ? "'SPI device'" : "'Platform device'");
++
++ if (chip) {
++
++ if (!strcmp(chip, "st7735r")) {
++ if (!width)
++ width = 128;
++ if (!height)
++ height = 160;
++ if (init_num == 0) {
++ initp = st7735r_init;
++ initp_num = ARRAY_SIZE(st7735r_init);
++ }
++
++
++ } else if (!strcmp(chip, "hx8340bn")) {
++ if (!width)
++ width = 176;
++ if (!height)
++ height = 220;
++ setaddrwin = 0;
++ if (init_num == 0) {
++ initp = hx8340bn_init;
++ initp_num = ARRAY_SIZE(hx8340bn_init);
++ }
++
++
++ } else if (!strcmp(chip, "ili9225")) {
++ if (!width)
++ width = 176;
++ if (!height)
++ height = 220;
++ setaddrwin = 0;
++ regwidth = 16;
++ if (init_num == 0) {
++ initp = ili9225_init;
++ initp_num = ARRAY_SIZE(ili9225_init);
++ }
++
++
++
++ } else if (!strcmp(chip, "ili9320")) {
++ if (!width)
++ width = 240;
++ if (!height)
++ height = 320;
++ setaddrwin = 1;
++ regwidth = 16;
++ if (init_num == 0) {
++ initp = ili9320_init;
++ initp_num = ARRAY_SIZE(ili9320_init);
++ }
++
++
++ } else if (!strcmp(chip, "ili9325")) {
++ if (!width)
++ width = 240;
++ if (!height)
++ height = 320;
++ setaddrwin = 1;
++ regwidth = 16;
++ if (init_num == 0) {
++ initp = ili9325_init;
++ initp_num = ARRAY_SIZE(ili9325_init);
++ }
++
++ } else if (!strcmp(chip, "ili9341")) {
++ if (!width)
++ width = 240;
++ if (!height)
++ height = 320;
++ setaddrwin = 0;
++ regwidth = 8;
++ if (init_num == 0) {
++ initp = ili9341_init;
++ initp_num = ARRAY_SIZE(ili9341_init);
++ }
++
++
++ } else if (!strcmp(chip, "ssd1289")) {
++ if (!width)
++ width = 240;
++ if (!height)
++ height = 320;
++ setaddrwin = 2;
++ regwidth = 16;
++ if (init_num == 0) {
++ initp = ssd1289_init;
++ initp_num = ARRAY_SIZE(ssd1289_init);
++ }
++
++
++
++ } else if (!strcmp(chip, "ssd1351")) {
++ if (!width)
++ width = 128;
++ if (!height)
++ height = 128;
++ setaddrwin = 3;
++ if (init_num == 0) {
++ initp = ssd1351_init;
++ initp_num = ARRAY_SIZE(ssd1351_init);
++ }
++ } else {
++ dev_err(dev, "chip=%s is not supported\n", chip);
++ return -EINVAL;
++ }
++ }
++
++ if (width == 0 || height == 0) {
++ dev_err(dev, "argument(s) missing: width and height has to be set.\n");
++ return -EINVAL;
++ }
++ flex_display.width = width;
++ flex_display.height = height;
++ fbtft_init_dbg(dev, "Display resolution: %dx%d\n", width, height);
++ fbtft_init_dbg(dev, "chip = %s\n", chip ? chip : "not set");
++ fbtft_init_dbg(dev, "setaddrwin = %d\n", setaddrwin);
++ fbtft_init_dbg(dev, "regwidth = %d\n", regwidth);
++ fbtft_init_dbg(dev, "buswidth = %d\n", buswidth);
++
++ info = fbtft_framebuffer_alloc(&flex_display, dev);
++ if (!info)
++ return -ENOMEM;
++
++ par = info->par;
++ if (sdev)
++ par->spi = sdev;
++ else
++ par->pdev = pdev;
++ if (!par->init_sequence)
++ par->init_sequence = initp;
++ par->fbtftops.init_display = fbtft_init_display;
++
++ /* registerwrite functions */
++ switch (regwidth) {
++ case 8:
++ par->fbtftops.write_register = fbtft_write_reg8_bus8;
++ break;
++ case 16:
++ par->fbtftops.write_register = fbtft_write_reg16_bus8;
++ break;
++ default:
++ dev_err(dev, "argument 'regwidth': %d is not supported.\n", regwidth);
++ return -EINVAL;
++ }
++
++ /* bus functions */
++ if (sdev) {
++ par->fbtftops.write = fbtft_write_spi;
++ switch (buswidth) {
++ case 8:
++ par->fbtftops.write_vmem = fbtft_write_vmem16_bus8;
++ if (!par->startbyte)
++ par->fbtftops.verify_gpios = flexfb_verify_gpios_dc;
++ break;
++ case 9:
++ if (regwidth == 16) {
++ dev_err(dev, "argument 'regwidth': %d is not supported with buswidth=%d and SPI.\n", regwidth, buswidth);
++ return -EINVAL;
++ }
++ par->fbtftops.write_register = fbtft_write_reg8_bus9;
++ par->fbtftops.write_vmem = fbtft_write_vmem16_bus9;
++ sdev->bits_per_word=9;
++ ret = sdev->master->setup(sdev);
++ if (ret) {
++ dev_warn(dev,
++ "9-bit SPI not available, emulating using 8-bit.\n");
++ sdev->bits_per_word = 8;
++ ret = sdev->master->setup(sdev);
++ if (ret)
++ goto out_release;
++ /* allocate buffer with room for dc bits */
++ par->extra = devm_kzalloc(par->info->device,
++ par->txbuf.len + (par->txbuf.len / 8) + 8,
++ GFP_KERNEL);
++ if (!par->extra) {
++ ret = -ENOMEM;
++ goto out_release;
++ }
++ par->fbtftops.write = fbtft_write_spi_emulate_9;
++ }
++ break;
++ default:
++ dev_err(dev, "argument 'buswidth': %d is not supported with SPI.\n", buswidth);
++ return -EINVAL;
++ }
++ } else {
++ par->fbtftops.verify_gpios = flexfb_verify_gpios_db;
++ switch (buswidth) {
++ case 8:
++ par->fbtftops.write = fbtft_write_gpio8_wr;
++ par->fbtftops.write_vmem = fbtft_write_vmem16_bus8;
++ break;
++ case 16:
++ par->fbtftops.write_register = fbtft_write_reg16_bus16;
++ if (latched)
++ par->fbtftops.write = fbtft_write_gpio16_wr_latched;
++ else
++ par->fbtftops.write = fbtft_write_gpio16_wr;
++ par->fbtftops.write_vmem = fbtft_write_vmem16_bus16;
++ break;
++ default:
++ dev_err(dev, "argument 'buswidth': %d is not supported with parallel.\n", buswidth);
++ return -EINVAL;
++ }
++ }
++
++ /* set_addr_win function */
++ switch (setaddrwin) {
++ case 0:
++ /* use default */
++ break;
++ case 1:
++ par->fbtftops.set_addr_win = flexfb_set_addr_win_1;
++ break;
++ case 2:
++ par->fbtftops.set_addr_win = flexfb_set_addr_win_2;
++ break;
++ case 3:
++ par->fbtftops.set_addr_win = set_addr_win_3;
++ break;
++ default:
++ dev_err(dev, "argument 'setaddrwin': unknown value %d.\n", setaddrwin);
++ return -EINVAL;
++ }
++
++ if (!nobacklight)
++ par->fbtftops.register_backlight = fbtft_register_backlight;
++
++ ret = fbtft_register_framebuffer(info);
++ if (ret < 0)
++ goto out_release;
++
++ return 0;
++
++out_release:
++ fbtft_framebuffer_release(info);
++
++ return ret;
++}
++
++static int flexfb_remove_common(struct device *dev, struct fb_info *info)
++{
++ struct fbtft_par *par;
++
++ if (!info)
++ return -EINVAL;
++ par = info->par;
++ if (par)
++ fbtft_par_dbg(DEBUG_DRIVER_INIT_FUNCTIONS, par,
++ "%s()\n", __func__);
++ fbtft_unregister_framebuffer(info);
++ fbtft_framebuffer_release(info);
++
++ return 0;
++}
++
++static int flexfb_probe_spi(struct spi_device *spi)
++{
++ return flexfb_probe_common(spi, NULL);
++}
++
++static int flexfb_remove_spi(struct spi_device *spi)
++{
++ struct fb_info *info = spi_get_drvdata(spi);
++
++ return flexfb_remove_common(&spi->dev, info);
++}
++
++static int flexfb_probe_pdev(struct platform_device *pdev)
++{
++ return flexfb_probe_common(NULL, pdev);
++}
++
++static int flexfb_remove_pdev(struct platform_device *pdev)
++{
++ struct fb_info *info = platform_get_drvdata(pdev);
++
++ return flexfb_remove_common(&pdev->dev, info);
++}
++
++static struct spi_driver flexfb_spi_driver = {
++ .driver = {
++ .name = DRVNAME,
++ .owner = THIS_MODULE,
++ },
++ .probe = flexfb_probe_spi,
++ .remove = flexfb_remove_spi,
++};
++
++static const struct platform_device_id flexfb_platform_ids[] = {
++ { "flexpfb", 0 },
++ { },
++};
++
++static struct platform_driver flexfb_platform_driver = {
++ .driver = {
++ .name = DRVNAME,
++ },
++ .id_table = flexfb_platform_ids,
++ .probe = flexfb_probe_pdev,
++ .remove = flexfb_remove_pdev,
++};
++
++static int __init flexfb_init(void)
++{
++ int ret, ret2;
++
++ ret = spi_register_driver(&flexfb_spi_driver);
++ ret2 = platform_driver_register(&flexfb_platform_driver);
++ if (ret < 0)
++ return ret;
++ return ret2;
++}
++
++static void __exit flexfb_exit(void)
++{
++ spi_unregister_driver(&flexfb_spi_driver);
++ platform_driver_unregister(&flexfb_platform_driver);
++}
++
++/* ------------------------------------------------------------------------- */
++
++module_init(flexfb_init);
++module_exit(flexfb_exit);
++
++MODULE_DESCRIPTION("Generic FB driver for TFT LCD displays");
++MODULE_AUTHOR("Noralf Tronnes");
++MODULE_LICENSE("GPL");
+diff -Nur linux-3.18.8/drivers/staging/fbtft/Kconfig linux-rpi/drivers/staging/fbtft/Kconfig
+--- linux-3.18.8/drivers/staging/fbtft/Kconfig 1970-01-01 01:00:00.000000000 +0100
++++ linux-rpi/drivers/staging/fbtft/Kconfig 2015-03-05 14:40:16.341715808 +0100
+@@ -0,0 +1,169 @@
++menuconfig FB_TFT
++ tristate "Support for small TFT LCD display modules"
++ depends on FB && SPI && GPIOLIB
++ select FB_SYS_FILLRECT
++ select FB_SYS_COPYAREA
++ select FB_SYS_IMAGEBLIT
++ select FB_SYS_FOPS
++ select FB_DEFERRED_IO
++ select FB_BACKLIGHT
++
++config FB_TFT_AGM1264K_FL
++ tristate "FB driver for the AGM1264K-FL LCD display"
++ depends on FB_TFT
++ help
++ Framebuffer support for the AGM1264K-FL LCD display (two Samsung KS0108 compatable chips)
++
++config FB_TFT_BD663474
++ tristate "FB driver for the BD663474 LCD Controller"
++ depends on FB_TFT
++ help
++ Generic Framebuffer support for BD663474
++
++config FB_TFT_HX8340BN
++ tristate "FB driver for the HX8340BN LCD Controller"
++ depends on FB_TFT
++ help
++ Generic Framebuffer support for HX8340BN
++
++config FB_TFT_HX8347D
++ tristate "FB driver for the HX8347D LCD Controller"
++ depends on FB_TFT
++ help
++ Generic Framebuffer support for HX8347D
++
++config FB_TFT_HX8353D
++ tristate "FB driver for the HX8353D LCD Controller"
++ depends on FB_TFT
++ help
++ Generic Framebuffer support for HX8353D
++
++config FB_TFT_ILI9320
++ tristate "FB driver for the ILI9320 LCD Controller"
++ depends on FB_TFT
++ help
++ Generic Framebuffer support for ILI9320
++
++config FB_TFT_ILI9325
++ tristate "FB driver for the ILI9325 LCD Controller"
++ depends on FB_TFT
++ help
++ Generic Framebuffer support for ILI9325
++
++config FB_TFT_ILI9340
++ tristate "FB driver for the ILI9340 LCD Controller"
++ depends on FB_TFT
++ help
++ Generic Framebuffer support for ILI9340
++
++config FB_TFT_ILI9341
++ tristate "FB driver for the ILI9341 LCD Controller"
++ depends on FB_TFT
++ help
++ Generic Framebuffer support for ILI9341
++
++config FB_TFT_ILI9481
++ tristate "FB driver for the ILI9481 LCD Controller"
++ depends on FB_TFT
++ help
++ Generic Framebuffer support for ILI9481
++
++config FB_TFT_ILI9486
++ tristate "FB driver for the ILI9486 LCD Controller"
++ depends on FB_TFT
++ help
++ Generic Framebuffer support for ILI9486
++
++config FB_TFT_PCD8544
++ tristate "FB driver for the PCD8544 LCD Controller"
++ depends on FB_TFT
++ help
++ Generic Framebuffer support for PCD8544
++
++config FB_TFT_RA8875
++ tristate "FB driver for the RA8875 LCD Controller"
++ depends on FB_TFT
++ help
++ Generic Framebuffer support for RA8875
++
++config FB_TFT_S6D02A1
++ tristate "FB driver for the S6D02A1 LCD Controller"
++ depends on FB_TFT
++ help
++ Generic Framebuffer support for S6D02A1
++
++config FB_TFT_S6D1121
++ tristate "FB driver for the S6D1211 LCD Controller"
++ depends on FB_TFT
++ help
++ Generic Framebuffer support for S6D1121
++
++config FB_TFT_SSD1289
++ tristate "FB driver for the SSD1289 LCD Controller"
++ depends on FB_TFT
++ help
++ Framebuffer support for SSD1289
++
++config FB_TFT_SSD1306
++ tristate "FB driver for the SSD1306 OLED Controller"
++ depends on FB_TFT
++ help
++ Framebuffer support for SSD1306
++
++config FB_TFT_SSD1331
++ tristate "FB driver for the SSD1331 LCD Controller"
++ depends on FB_TFT
++ help
++ Framebuffer support for SSD1331
++
++config FB_TFT_SSD1351
++ tristate "FB driver for the SSD1351 LCD Controller"
++ depends on FB_TFT
++ help
++ Framebuffer support for SSD1351
++
++config FB_TFT_ST7735R
++ tristate "FB driver for the ST7735R LCD Controller"
++ depends on FB_TFT
++ help
++ Generic Framebuffer support for ST7735R
++
++config FB_TFT_TINYLCD
++ tristate "FB driver for tinylcd.com display"
++ depends on FB_TFT
++ help
++ Custom Framebuffer support for tinylcd.com display
++
++config FB_TFT_TLS8204
++ tristate "FB driver for the TLS8204 LCD Controller"
++ depends on FB_TFT
++ help
++ Generic Framebuffer support for TLS8204
++
++config FB_TFT_UC1701
++ tristate "FB driver for the UC1701 LCD Controller"
++ depends on FB_TFT
++ help
++ Generic Framebuffer support for UC1701
++
++config FB_TFT_UPD161704
++ tristate "FB driver for the uPD161704 LCD Controller"
++ depends on FB_TFT
++ help
++ Generic Framebuffer support for uPD161704
++
++config FB_TFT_WATTEROTT
++ tristate "FB driver for the WATTEROTT LCD Controller"
++ depends on FB_TFT
++ help
++ Generic Framebuffer support for WATTEROTT
++
++config FB_FLEX
++ tristate "Generic FB driver for TFT LCD displays"
++ depends on FB_TFT
++ help
++ Generic Framebuffer support for TFT LCD displays.
++
++config FB_TFT_FBTFT_DEVICE
++ tristate "Module to for adding FBTFT devices"
++ depends on FB_TFT
+diff -Nur linux-3.18.8/drivers/staging/fbtft/Makefile linux-rpi/drivers/staging/fbtft/Makefile
+--- linux-3.18.8/drivers/staging/fbtft/Makefile 1970-01-01 01:00:00.000000000 +0100
++++ linux-rpi/drivers/staging/fbtft/Makefile 2015-03-05 14:40:16.341715808 +0100
+@@ -0,0 +1,34 @@
++# Core module
++obj-$(CONFIG_FB_TFT) += fbtft.o
++fbtft-y += fbtft-core.o fbtft-sysfs.o fbtft-bus.o fbtft-io.o
++
++# drivers
++obj-$(CONFIG_FB_TFT_AGM1264K_FL) += fb_agm1264k-fl.o
++obj-$(CONFIG_FB_TFT_BD663474) += fb_bd663474.o
++obj-$(CONFIG_FB_TFT_HX8340BN) += fb_hx8340bn.o
++obj-$(CONFIG_FB_TFT_HX8347D) += fb_hx8347d.o
++obj-$(CONFIG_FB_TFT_HX8353D) += fb_hx8353d.o
++obj-$(CONFIG_FB_TFT_ILI9320) += fb_ili9320.o
++obj-$(CONFIG_FB_TFT_ILI9325) += fb_ili9325.o
++obj-$(CONFIG_FB_TFT_ILI9340) += fb_ili9340.o
++obj-$(CONFIG_FB_TFT_ILI9341) += fb_ili9341.o
++obj-$(CONFIG_FB_TFT_ILI9481) += fb_ili9481.o
++obj-$(CONFIG_FB_TFT_ILI9486) += fb_ili9486.o
++obj-$(CONFIG_FB_TFT_PCD8544) += fb_pcd8544.o
++obj-$(CONFIG_FB_TFT_RA8875) += fb_ra8875.o
++obj-$(CONFIG_FB_TFT_S6D02A1) += fb_s6d02a1.o
++obj-$(CONFIG_FB_TFT_S6D1121) += fb_s6d1121.o
++obj-$(CONFIG_FB_TFT_SSD1289) += fb_ssd1289.o
++obj-$(CONFIG_FB_TFT_SSD1306) += fb_ssd1306.o
++obj-$(CONFIG_FB_TFT_SSD1331) += fb_ssd1331.o
++obj-$(CONFIG_FB_TFT_SSD1351) += fb_ssd1351.o
++obj-$(CONFIG_FB_TFT_ST7735R) += fb_st7735r.o
++obj-$(CONFIG_FB_TFT_TINYLCD) += fb_tinylcd.o
++obj-$(CONFIG_FB_TFT_TLS8204) += fb_tls8204.o
++obj-$(CONFIG_FB_TFT_UC1701) += fb_uc1701.o
++obj-$(CONFIG_FB_TFT_UPD161704) += fb_upd161704.o
++obj-$(CONFIG_FB_TFT_WATTEROTT) += fb_watterott.o
++obj-$(CONFIG_FB_FLEX) += flexfb.o
++
++# Device modules
++obj-$(CONFIG_FB_TFT_FBTFT_DEVICE) += fbtft_device.o
+diff -Nur linux-3.18.8/drivers/staging/fbtft/README linux-rpi/drivers/staging/fbtft/README
+--- linux-3.18.8/drivers/staging/fbtft/README 1970-01-01 01:00:00.000000000 +0100
++++ linux-rpi/drivers/staging/fbtft/README 2015-03-05 14:40:16.341715808 +0100
+@@ -0,0 +1,32 @@
++ FBTFT
++=========
++
++Linux Framebuffer drivers for small TFT LCD display modules.
++The module 'fbtft' makes writing drivers for some of these displays very easy.
++
++Development is done on a Raspberry Pi running the Raspbian "wheezy" distribution.
++
++INSTALLATION
++ Download kernel sources
++
++ From Linux 3.15
++ cd drivers/video/fbdev/fbtft
++ git clone https://github.com/notro/fbtft.git
++
++ Add to drivers/video/fbdev/Kconfig: source "drivers/video/fbdev/fbtft/Kconfig"
++ Add to drivers/video/fbdev/Makefile: obj-y += fbtft/
++
++ Before Linux 3.15
++ cd drivers/video
++ git clone https://github.com/notro/fbtft.git
++
++ Add to drivers/video/Kconfig: source "drivers/video/fbtft/Kconfig"
++ Add to drivers/video/Makefile: obj-y += fbtft/
++
++ Enable driver(s) in menuconfig and build the kernel
++
++
++See wiki for more information: https://github.com/notro/fbtft/wiki
++
++
++Source: https://github.com/notro/fbtft/
+diff -Nur linux-3.18.8/drivers/staging/Kconfig linux-rpi/drivers/staging/Kconfig
+--- linux-3.18.8/drivers/staging/Kconfig 2015-02-27 02:49:36.000000000 +0100
++++ linux-rpi/drivers/staging/Kconfig 2015-03-05 14:40:16.309715808 +0100
+@@ -108,4 +108,6 @@
+
+ source "drivers/staging/unisys/Kconfig"
+
++source "drivers/staging/fbtft/Kconfig"
++
+ endif # STAGING
+diff -Nur linux-3.18.8/drivers/staging/Makefile linux-rpi/drivers/staging/Makefile
+--- linux-3.18.8/drivers/staging/Makefile 2015-02-27 02:49:36.000000000 +0100
++++ linux-rpi/drivers/staging/Makefile 2015-03-05 14:40:16.309715808 +0100
+@@ -46,3 +46,4 @@
+ obj-$(CONFIG_GS_FPGABOOT) += gs_fpgaboot/
+ obj-$(CONFIG_CRYPTO_SKEIN) += skein/
+ obj-$(CONFIG_UNISYSSPAR) += unisys/
++obj-$(CONFIG_FB_TFT) += fbtft/
+diff -Nur linux-3.18.8/drivers/staging/media/lirc/Kconfig linux-rpi/drivers/staging/media/lirc/Kconfig
+--- linux-3.18.8/drivers/staging/media/lirc/Kconfig 2015-02-27 02:49:36.000000000 +0100
++++ linux-rpi/drivers/staging/media/lirc/Kconfig 2015-03-05 14:40:16.401715807 +0100
@@ -38,6 +38,12 @@
help
Driver for Homebrew Parallel Port Receivers
@@ -48893,10 +59482,10 @@ diff -Nur linux-3.18.6/drivers/staging/media/lirc/Kconfig linux-rpi/drivers/stag
config LIRC_SASEM
tristate "Sasem USB IR Remote"
depends on LIRC && USB
-diff -Nur linux-3.18.6/drivers/staging/media/lirc/lirc_rpi.c linux-rpi/drivers/staging/media/lirc/lirc_rpi.c
---- linux-3.18.6/drivers/staging/media/lirc/lirc_rpi.c 1970-01-01 01:00:00.000000000 +0100
-+++ linux-rpi/drivers/staging/media/lirc/lirc_rpi.c 2015-02-09 04:40:25.000000000 +0100
-@@ -0,0 +1,757 @@
+diff -Nur linux-3.18.8/drivers/staging/media/lirc/lirc_rpi.c linux-rpi/drivers/staging/media/lirc/lirc_rpi.c
+--- linux-3.18.8/drivers/staging/media/lirc/lirc_rpi.c 1970-01-01 01:00:00.000000000 +0100
++++ linux-rpi/drivers/staging/media/lirc/lirc_rpi.c 2015-03-05 14:40:16.401715807 +0100
+@@ -0,0 +1,765 @@
+/*
+ * lirc_rpi.c
+ *
@@ -48930,6 +59519,7 @@ diff -Nur linux-3.18.6/drivers/staging/media/lirc/lirc_rpi.c linux-rpi/drivers/s
+#include <linux/kernel.h>
+#include <linux/time.h>
+#include <linux/timex.h>
++#include <linux/timekeeping.h>
+#include <linux/string.h>
+#include <linux/delay.h>
+#include <linux/platform_device.h>
@@ -49006,6 +59596,13 @@ diff -Nur linux-3.18.6/drivers/staging/media/lirc/lirc_rpi.c linux-rpi/drivers/s
+ udelay(usecs);
+}
+
++static unsigned long read_current_us(void)
++{
++ struct timespec now;
++ getnstimeofday(&now);
++ return (now.tv_sec * 1000000) + (now.tv_nsec/1000);
++}
++
+static int init_timing_params(unsigned int new_duty_cycle,
+ unsigned int new_freq)
+{
@@ -49034,7 +59631,7 @@ diff -Nur linux-3.18.6/drivers/staging/media/lirc/lirc_rpi.c linux-rpi/drivers/s
+ length *= 1000;
+
+ actual = 0; target = 0; flag = 0;
-+ read_current_timer(&actual_us);
++ actual_us = read_current_us();
+
+ while (actual < length) {
+ if (flag) {
@@ -49052,7 +59649,7 @@ diff -Nur linux-3.18.6/drivers/staging/media/lirc/lirc_rpi.c linux-rpi/drivers/s
+ */
+ if ((int)(target_us - actual_us) > 0)
+ udelay(target_us - actual_us);
-+ read_current_timer(&actual_us);
++ actual_us = read_current_us();
+ actual += (actual_us - initial_us) * 1000;
+ flag = !flag;
+ }
@@ -49654,9 +60251,9 @@ diff -Nur linux-3.18.6/drivers/staging/media/lirc/lirc_rpi.c linux-rpi/drivers/s
+
+module_param(debug, bool, S_IRUGO | S_IWUSR);
+MODULE_PARM_DESC(debug, "Enable debugging messages");
-diff -Nur linux-3.18.6/drivers/staging/media/lirc/Makefile linux-rpi/drivers/staging/media/lirc/Makefile
---- linux-3.18.6/drivers/staging/media/lirc/Makefile 2015-02-06 15:53:48.000000000 +0100
-+++ linux-rpi/drivers/staging/media/lirc/Makefile 2015-02-09 04:40:25.000000000 +0100
+diff -Nur linux-3.18.8/drivers/staging/media/lirc/Makefile linux-rpi/drivers/staging/media/lirc/Makefile
+--- linux-3.18.8/drivers/staging/media/lirc/Makefile 2015-02-27 02:49:36.000000000 +0100
++++ linux-rpi/drivers/staging/media/lirc/Makefile 2015-03-05 14:40:16.401715807 +0100
@@ -7,6 +7,7 @@
obj-$(CONFIG_LIRC_IGORPLUGUSB) += lirc_igorplugusb.o
obj-$(CONFIG_LIRC_IMON) += lirc_imon.o
@@ -49665,9 +60262,9 @@ diff -Nur linux-3.18.6/drivers/staging/media/lirc/Makefile linux-rpi/drivers/sta
obj-$(CONFIG_LIRC_SASEM) += lirc_sasem.o
obj-$(CONFIG_LIRC_SERIAL) += lirc_serial.o
obj-$(CONFIG_LIRC_SIR) += lirc_sir.o
-diff -Nur linux-3.18.6/drivers/thermal/bcm2835-thermal.c linux-rpi/drivers/thermal/bcm2835-thermal.c
---- linux-3.18.6/drivers/thermal/bcm2835-thermal.c 1970-01-01 01:00:00.000000000 +0100
-+++ linux-rpi/drivers/thermal/bcm2835-thermal.c 2015-02-09 04:40:27.000000000 +0100
+diff -Nur linux-3.18.8/drivers/thermal/bcm2835-thermal.c linux-rpi/drivers/thermal/bcm2835-thermal.c
+--- linux-3.18.8/drivers/thermal/bcm2835-thermal.c 1970-01-01 01:00:00.000000000 +0100
++++ linux-rpi/drivers/thermal/bcm2835-thermal.c 2015-03-05 14:40:16.489715807 +0100
@@ -0,0 +1,184 @@
+/*****************************************************************************
+* Copyright 2011 Broadcom Corporation. All rights reserved.
@@ -49853,9 +60450,9 @@ diff -Nur linux-3.18.6/drivers/thermal/bcm2835-thermal.c linux-rpi/drivers/therm
+MODULE_DESCRIPTION("Thermal driver for bcm2835 chip");
+
+module_platform_driver(bcm2835_thermal_driver);
-diff -Nur linux-3.18.6/drivers/thermal/Kconfig linux-rpi/drivers/thermal/Kconfig
---- linux-3.18.6/drivers/thermal/Kconfig 2015-02-06 15:53:48.000000000 +0100
-+++ linux-rpi/drivers/thermal/Kconfig 2015-02-09 04:40:27.000000000 +0100
+diff -Nur linux-3.18.8/drivers/thermal/Kconfig linux-rpi/drivers/thermal/Kconfig
+--- linux-3.18.8/drivers/thermal/Kconfig 2015-02-27 02:49:36.000000000 +0100
++++ linux-rpi/drivers/thermal/Kconfig 2015-03-05 14:40:16.489715807 +0100
@@ -206,6 +206,12 @@
enforce idle time which results in more package C-state residency. The
user interface is exposed via generic thermal framework.
@@ -49869,9 +60466,9 @@ diff -Nur linux-3.18.6/drivers/thermal/Kconfig linux-rpi/drivers/thermal/Kconfig
config X86_PKG_TEMP_THERMAL
tristate "X86 package temperature thermal driver"
depends on X86_THERMAL_VECTOR
-diff -Nur linux-3.18.6/drivers/thermal/Makefile linux-rpi/drivers/thermal/Makefile
---- linux-3.18.6/drivers/thermal/Makefile 2015-02-06 15:53:48.000000000 +0100
-+++ linux-rpi/drivers/thermal/Makefile 2015-02-09 04:40:27.000000000 +0100
+diff -Nur linux-3.18.8/drivers/thermal/Makefile linux-rpi/drivers/thermal/Makefile
+--- linux-3.18.8/drivers/thermal/Makefile 2015-02-27 02:49:36.000000000 +0100
++++ linux-rpi/drivers/thermal/Makefile 2015-03-05 14:40:16.489715807 +0100
@@ -29,6 +29,7 @@
obj-$(CONFIG_IMX_THERMAL) += imx_thermal.o
obj-$(CONFIG_DB8500_CPUFREQ_COOLING) += db8500_cpufreq_cooling.o
@@ -49880,10 +60477,18 @@ diff -Nur linux-3.18.6/drivers/thermal/Makefile linux-rpi/drivers/thermal/Makefi
obj-$(CONFIG_X86_PKG_TEMP_THERMAL) += x86_pkg_temp_thermal.o
obj-$(CONFIG_INTEL_SOC_DTS_THERMAL) += intel_soc_dts_thermal.o
obj-$(CONFIG_TI_SOC_THERMAL) += ti-soc-thermal/
-diff -Nur linux-3.18.6/drivers/tty/serial/amba-pl011.c linux-rpi/drivers/tty/serial/amba-pl011.c
---- linux-3.18.6/drivers/tty/serial/amba-pl011.c 2015-02-06 15:53:48.000000000 +0100
-+++ linux-rpi/drivers/tty/serial/amba-pl011.c 2015-02-09 04:40:28.000000000 +0100
-@@ -84,7 +84,7 @@
+diff -Nur linux-3.18.8/drivers/tty/serial/amba-pl011.c linux-rpi/drivers/tty/serial/amba-pl011.c
+--- linux-3.18.8/drivers/tty/serial/amba-pl011.c 2015-02-27 02:49:36.000000000 +0100
++++ linux-rpi/drivers/tty/serial/amba-pl011.c 2015-03-05 14:40:16.505715807 +0100
+@@ -58,6 +58,7 @@
+ #include <linux/pinctrl/consumer.h>
+ #include <linux/sizes.h>
+ #include <linux/io.h>
++#include <linux/workqueue.h>
+
+ #define UART_NR 14
+
+@@ -84,7 +85,7 @@
static unsigned int get_fifosize_arm(struct amba_device *dev)
{
@@ -49892,9 +60497,299 @@ diff -Nur linux-3.18.6/drivers/tty/serial/amba-pl011.c linux-rpi/drivers/tty/ser
}
static struct vendor_data vendor_arm = {
-diff -Nur linux-3.18.6/drivers/usb/core/generic.c linux-rpi/drivers/usb/core/generic.c
---- linux-3.18.6/drivers/usb/core/generic.c 2015-02-06 15:53:48.000000000 +0100
-+++ linux-rpi/drivers/usb/core/generic.c 2015-02-09 04:40:28.000000000 +0100
+@@ -156,7 +157,9 @@
+ unsigned int lcrh_tx; /* vendor-specific */
+ unsigned int lcrh_rx; /* vendor-specific */
+ unsigned int old_cr; /* state during shutdown */
++ struct delayed_work tx_softirq_work;
+ bool autorts;
++ unsigned int tx_irq_seen; /* 0=none, 1=1, 2=2 or more */
+ char type[12];
+ #ifdef CONFIG_DMA_ENGINE
+ /* DMA stuff */
+@@ -408,8 +411,9 @@
+ dma_release_channel(uap->dmarx.chan);
+ }
+
+-/* Forward declare this for the refill routine */
++/* Forward declare these for the refill routine */
+ static int pl011_dma_tx_refill(struct uart_amba_port *uap);
++static void pl011_start_tx_pio(struct uart_amba_port *uap);
+
+ /*
+ * The current DMA TX buffer has been sent.
+@@ -447,14 +451,13 @@
+ return;
+ }
+
+- if (pl011_dma_tx_refill(uap) <= 0) {
++ if (pl011_dma_tx_refill(uap) <= 0)
+ /*
+ * We didn't queue a DMA buffer for some reason, but we
+ * have data pending to be sent. Re-enable the TX IRQ.
+ */
+- uap->im |= UART011_TXIM;
+- writew(uap->im, uap->port.membase + UART011_IMSC);
+- }
++ pl011_start_tx_pio(uap);
++
+ spin_unlock_irqrestore(&uap->port.lock, flags);
+ }
+
+@@ -628,12 +631,10 @@
+ if (!uap->dmatx.queued) {
+ if (pl011_dma_tx_refill(uap) > 0) {
+ uap->im &= ~UART011_TXIM;
+- ret = true;
+- } else {
+- uap->im |= UART011_TXIM;
++ writew(uap->im, uap->port.membase +
++ UART011_IMSC);
++ } else
+ ret = false;
+- }
+- writew(uap->im, uap->port.membase + UART011_IMSC);
+ } else if (!(uap->dmacr & UART011_TXDMAE)) {
+ uap->dmacr |= UART011_TXDMAE;
+ writew(uap->dmacr,
+@@ -1172,15 +1173,24 @@
+ pl011_dma_tx_stop(uap);
+ }
+
++static bool pl011_tx_chars(struct uart_amba_port *uap);
++
++/* Start TX with programmed I/O only (no DMA) */
++static void pl011_start_tx_pio(struct uart_amba_port *uap)
++{
++ uap->im |= UART011_TXIM;
++ writew(uap->im, uap->port.membase + UART011_IMSC);
++ if (!uap->tx_irq_seen)
++ pl011_tx_chars(uap);
++}
++
+ static void pl011_start_tx(struct uart_port *port)
+ {
+ struct uart_amba_port *uap =
+ container_of(port, struct uart_amba_port, port);
+
+- if (!pl011_dma_tx_start(uap)) {
+- uap->im |= UART011_TXIM;
+- writew(uap->im, uap->port.membase + UART011_IMSC);
+- }
++ if (!pl011_dma_tx_start(uap))
++ pl011_start_tx_pio(uap);
+ }
+
+ static void pl011_stop_rx(struct uart_port *port)
+@@ -1238,40 +1248,87 @@
+ spin_lock(&uap->port.lock);
+ }
+
+-static void pl011_tx_chars(struct uart_amba_port *uap)
++/*
++ * Transmit a character
++ * There must be at least one free entry in the TX FIFO to accept the char.
++ *
++ * Returns true if the FIFO might have space in it afterwards;
++ * returns false if the FIFO definitely became full.
++ */
++static bool pl011_tx_char(struct uart_amba_port *uap, unsigned char c)
++{
++ writew(c, uap->port.membase + UART01x_DR);
++ uap->port.icount.tx++;
++
++ if (likely(uap->tx_irq_seen > 1))
++ return true;
++
++ return !(readw(uap->port.membase + UART01x_FR) & UART01x_FR_TXFF);
++}
++
++static bool pl011_tx_chars(struct uart_amba_port *uap)
+ {
+ struct circ_buf *xmit = &uap->port.state->xmit;
+ int count;
+
++ if (unlikely(uap->tx_irq_seen < 2))
++ /*
++ * Initial FIFO fill level unknown: we must check TXFF
++ * after each write, so just try to fill up the FIFO.
++ */
++ count = uap->fifosize;
++ else /* tx_irq_seen >= 2 */
++ /*
++ * FIFO initially at least half-empty, so we can simply
++ * write half the FIFO without polling TXFF.
++
++ * Note: the *first* TX IRQ can still race with
++ * pl011_start_tx_pio(), which can result in the FIFO
++ * being fuller than expected in that case.
++ */
++ count = uap->fifosize >> 1;
++
++ /*
++ * If the FIFO is full we're guaranteed a TX IRQ at some later point,
++ * and can't transmit immediately in any case:
++ */
++ if (unlikely(uap->tx_irq_seen < 2 &&
++ readw(uap->port.membase + UART01x_FR) & UART01x_FR_TXFF))
++ return false;
++
+ if (uap->port.x_char) {
+- writew(uap->port.x_char, uap->port.membase + UART01x_DR);
+- uap->port.icount.tx++;
++ pl011_tx_char(uap, uap->port.x_char);
+ uap->port.x_char = 0;
+- return;
++ --count;
+ }
+ if (uart_circ_empty(xmit) || uart_tx_stopped(&uap->port)) {
+ pl011_stop_tx(&uap->port);
+- return;
++ goto done;
+ }
+
+ /* If we are using DMA mode, try to send some characters. */
+ if (pl011_dma_tx_irq(uap))
+- return;
++ goto done;
+
+- count = uap->fifosize >> 1;
+- do {
+- writew(xmit->buf[xmit->tail], uap->port.membase + UART01x_DR);
++ while (count-- > 0 && pl011_tx_char(uap, xmit->buf[xmit->tail])) {
+ xmit->tail = (xmit->tail + 1) & (UART_XMIT_SIZE - 1);
+- uap->port.icount.tx++;
+ if (uart_circ_empty(xmit))
+ break;
+- } while (--count > 0);
++ }
+
+ if (uart_circ_chars_pending(xmit) < WAKEUP_CHARS)
+ uart_write_wakeup(&uap->port);
+
+- if (uart_circ_empty(xmit))
++ if (uart_circ_empty(xmit)) {
+ pl011_stop_tx(&uap->port);
++ goto done;
++ }
++
++ if (unlikely(!uap->tx_irq_seen))
++ schedule_delayed_work(&uap->tx_softirq_work, uap->port.timeout);
++
++done:
++ return false;
+ }
+
+ static void pl011_modem_status(struct uart_amba_port *uap)
+@@ -1298,6 +1355,28 @@
+ wake_up_interruptible(&uap->port.state->port.delta_msr_wait);
+ }
+
++static void pl011_tx_softirq(struct work_struct *work)
++{
++ struct delayed_work *dwork = to_delayed_work(work);
++ struct uart_amba_port *uap =
++ container_of(dwork, struct uart_amba_port, tx_softirq_work);
++
++ spin_lock(&uap->port.lock);
++ while (pl011_tx_chars(uap)) ;
++ spin_unlock(&uap->port.lock);
++}
++
++static void pl011_tx_irq_seen(struct uart_amba_port *uap)
++{
++ if (likely(uap->tx_irq_seen > 1))
++ return;
++
++ uap->tx_irq_seen++;
++ if (uap->tx_irq_seen < 2)
++ /* first TX IRQ */
++ cancel_delayed_work(&uap->tx_softirq_work);
++}
++
+ static irqreturn_t pl011_int(int irq, void *dev_id)
+ {
+ struct uart_amba_port *uap = dev_id;
+@@ -1336,8 +1415,10 @@
+ if (status & (UART011_DSRMIS|UART011_DCDMIS|
+ UART011_CTSMIS|UART011_RIMIS))
+ pl011_modem_status(uap);
+- if (status & UART011_TXIS)
++ if (status & UART011_TXIS) {
++ pl011_tx_irq_seen(uap);
+ pl011_tx_chars(uap);
++ }
+
+ if (pass_counter-- == 0)
+ break;
+@@ -1541,7 +1622,7 @@
+ {
+ struct uart_amba_port *uap =
+ container_of(port, struct uart_amba_port, port);
+- unsigned int cr, lcr_h, fbrd, ibrd;
++ unsigned int cr;
+ int retval;
+
+ retval = pl011_hwinit(port);
+@@ -1559,30 +1640,8 @@
+
+ writew(uap->vendor->ifls, uap->port.membase + UART011_IFLS);
+
+- /*
+- * Provoke TX FIFO interrupt into asserting. Taking care to preserve
+- * baud rate and data format specified by FBRD, IBRD and LCRH as the
+- * UART may already be in use as a console.
+- */
+ spin_lock_irq(&uap->port.lock);
+
+- fbrd = readw(uap->port.membase + UART011_FBRD);
+- ibrd = readw(uap->port.membase + UART011_IBRD);
+- lcr_h = readw(uap->port.membase + uap->lcrh_rx);
+-
+- cr = UART01x_CR_UARTEN | UART011_CR_TXE | UART011_CR_LBE;
+- writew(cr, uap->port.membase + UART011_CR);
+- writew(0, uap->port.membase + UART011_FBRD);
+- writew(1, uap->port.membase + UART011_IBRD);
+- pl011_write_lcr_h(uap, 0);
+- writew(0, uap->port.membase + UART01x_DR);
+- while (readw(uap->port.membase + UART01x_FR) & UART01x_FR_BUSY)
+- barrier();
+-
+- writew(fbrd, uap->port.membase + UART011_FBRD);
+- writew(ibrd, uap->port.membase + UART011_IBRD);
+- pl011_write_lcr_h(uap, lcr_h);
+-
+ /* restore RTS and DTR */
+ cr = uap->old_cr & (UART011_CR_RTS | UART011_CR_DTR);
+ cr |= UART01x_CR_UARTEN | UART011_CR_RXE | UART011_CR_TXE;
+@@ -1636,13 +1695,15 @@
+ container_of(port, struct uart_amba_port, port);
+ unsigned int cr;
+
++ cancel_delayed_work_sync(&uap->tx_softirq_work);
++
+ /*
+ * disable all interrupts
+ */
+ spin_lock_irq(&uap->port.lock);
+ uap->im = 0;
+ writew(uap->im, uap->port.membase + UART011_IMSC);
+- writew(0xffff, uap->port.membase + UART011_ICR);
++ writew(0xffff & ~UART011_TXIS, uap->port.membase + UART011_ICR);
+ spin_unlock_irq(&uap->port.lock);
+
+ pl011_dma_shutdown(uap);
+@@ -2180,6 +2241,7 @@
+ uap->port.ops = &amba_pl011_pops;
+ uap->port.flags = UPF_BOOT_AUTOCONF;
+ uap->port.line = i;
++ INIT_DELAYED_WORK(&uap->tx_softirq_work, pl011_tx_softirq);
+ pl011_dma_probe(&dev->dev, uap);
+
+ /* Ensure interrupts from this UART are masked and cleared */
+diff -Nur linux-3.18.8/drivers/usb/core/generic.c linux-rpi/drivers/usb/core/generic.c
+--- linux-3.18.8/drivers/usb/core/generic.c 2015-02-27 02:49:36.000000000 +0100
++++ linux-rpi/drivers/usb/core/generic.c 2015-03-05 14:40:16.529715806 +0100
@@ -152,6 +152,7 @@
dev_warn(&udev->dev,
"no configuration chosen from %d choice%s\n",
@@ -49903,9 +60798,9 @@ diff -Nur linux-3.18.6/drivers/usb/core/generic.c linux-rpi/drivers/usb/core/gen
}
return i;
}
-diff -Nur linux-3.18.6/drivers/usb/core/hub.c linux-rpi/drivers/usb/core/hub.c
---- linux-3.18.6/drivers/usb/core/hub.c 2015-02-06 15:53:48.000000000 +0100
-+++ linux-rpi/drivers/usb/core/hub.c 2015-02-09 04:40:28.000000000 +0100
+diff -Nur linux-3.18.8/drivers/usb/core/hub.c linux-rpi/drivers/usb/core/hub.c
+--- linux-3.18.8/drivers/usb/core/hub.c 2015-02-27 02:49:36.000000000 +0100
++++ linux-rpi/drivers/usb/core/hub.c 2015-03-05 14:40:16.533715806 +0100
@@ -4923,7 +4923,7 @@
if (portchange & USB_PORT_STAT_C_OVERCURRENT) {
u16 status = 0, unused;
@@ -49915,9 +60810,9 @@ diff -Nur linux-3.18.6/drivers/usb/core/hub.c linux-rpi/drivers/usb/core/hub.c
usb_clear_port_feature(hdev, port1,
USB_PORT_FEAT_C_OVER_CURRENT);
msleep(100); /* Cool down */
-diff -Nur linux-3.18.6/drivers/usb/core/message.c linux-rpi/drivers/usb/core/message.c
---- linux-3.18.6/drivers/usb/core/message.c 2015-02-06 15:53:48.000000000 +0100
-+++ linux-rpi/drivers/usb/core/message.c 2015-02-09 04:40:28.000000000 +0100
+diff -Nur linux-3.18.8/drivers/usb/core/message.c linux-rpi/drivers/usb/core/message.c
+--- linux-3.18.8/drivers/usb/core/message.c 2015-02-27 02:49:36.000000000 +0100
++++ linux-rpi/drivers/usb/core/message.c 2015-03-05 14:40:16.533715806 +0100
@@ -1889,6 +1889,85 @@
if (cp->string == NULL &&
!(dev->quirks & USB_QUIRK_CONFIG_INTF_STRINGS))
@@ -50004,9 +60899,9 @@ diff -Nur linux-3.18.6/drivers/usb/core/message.c linux-rpi/drivers/usb/core/mes
/* Now that the interfaces are installed, re-enable LPM. */
usb_unlocked_enable_lpm(dev);
-diff -Nur linux-3.18.6/drivers/usb/core/otg_whitelist.h linux-rpi/drivers/usb/core/otg_whitelist.h
---- linux-3.18.6/drivers/usb/core/otg_whitelist.h 2015-02-06 15:53:48.000000000 +0100
-+++ linux-rpi/drivers/usb/core/otg_whitelist.h 2015-02-09 04:40:28.000000000 +0100
+diff -Nur linux-3.18.8/drivers/usb/core/otg_whitelist.h linux-rpi/drivers/usb/core/otg_whitelist.h
+--- linux-3.18.8/drivers/usb/core/otg_whitelist.h 2015-02-27 02:49:36.000000000 +0100
++++ linux-rpi/drivers/usb/core/otg_whitelist.h 2015-03-05 14:40:16.533715806 +0100
@@ -19,33 +19,82 @@
static struct usb_device_id whitelist_table [] = {
@@ -50160,9 +61055,9 @@ diff -Nur linux-3.18.6/drivers/usb/core/otg_whitelist.h linux-rpi/drivers/usb/co
return 0;
}
-diff -Nur linux-3.18.6/drivers/usb/gadget/file_storage.c linux-rpi/drivers/usb/gadget/file_storage.c
---- linux-3.18.6/drivers/usb/gadget/file_storage.c 1970-01-01 01:00:00.000000000 +0100
-+++ linux-rpi/drivers/usb/gadget/file_storage.c 2015-02-09 04:40:28.000000000 +0100
+diff -Nur linux-3.18.8/drivers/usb/gadget/file_storage.c linux-rpi/drivers/usb/gadget/file_storage.c
+--- linux-3.18.8/drivers/usb/gadget/file_storage.c 1970-01-01 01:00:00.000000000 +0100
++++ linux-rpi/drivers/usb/gadget/file_storage.c 2015-03-05 14:40:16.541715806 +0100
@@ -0,0 +1,3676 @@
+/*
+ * file_storage.c -- File-backed USB Storage Gadget, for USB development
@@ -53840,9 +64735,9 @@ diff -Nur linux-3.18.6/drivers/usb/gadget/file_storage.c linux-rpi/drivers/usb/g
+ kref_put(&fsg->ref, fsg_release);
+}
+module_exit(fsg_cleanup);
-diff -Nur linux-3.18.6/drivers/usb/host/dwc_common_port/changes.txt linux-rpi/drivers/usb/host/dwc_common_port/changes.txt
---- linux-3.18.6/drivers/usb/host/dwc_common_port/changes.txt 1970-01-01 01:00:00.000000000 +0100
-+++ linux-rpi/drivers/usb/host/dwc_common_port/changes.txt 2015-02-09 04:40:28.000000000 +0100
+diff -Nur linux-3.18.8/drivers/usb/host/dwc_common_port/changes.txt linux-rpi/drivers/usb/host/dwc_common_port/changes.txt
+--- linux-3.18.8/drivers/usb/host/dwc_common_port/changes.txt 1970-01-01 01:00:00.000000000 +0100
++++ linux-rpi/drivers/usb/host/dwc_common_port/changes.txt 2015-03-05 14:40:16.553715806 +0100
@@ -0,0 +1,174 @@
+
+dwc_read_reg32() and friends now take an additional parameter, a pointer to an
@@ -54018,9 +64913,9 @@ diff -Nur linux-3.18.6/drivers/usb/host/dwc_common_port/changes.txt linux-rpi/dr
+A DWC_LIBMODULE #define has also been added. If this is not defined, then the
+module code in dwc_common_linux.c is not compiled in. This allows linking the
+library code directly into a driver module, instead of as a standalone module.
-diff -Nur linux-3.18.6/drivers/usb/host/dwc_common_port/doc/doxygen.cfg linux-rpi/drivers/usb/host/dwc_common_port/doc/doxygen.cfg
---- linux-3.18.6/drivers/usb/host/dwc_common_port/doc/doxygen.cfg 1970-01-01 01:00:00.000000000 +0100
-+++ linux-rpi/drivers/usb/host/dwc_common_port/doc/doxygen.cfg 2015-02-09 04:40:28.000000000 +0100
+diff -Nur linux-3.18.8/drivers/usb/host/dwc_common_port/doc/doxygen.cfg linux-rpi/drivers/usb/host/dwc_common_port/doc/doxygen.cfg
+--- linux-3.18.8/drivers/usb/host/dwc_common_port/doc/doxygen.cfg 1970-01-01 01:00:00.000000000 +0100
++++ linux-rpi/drivers/usb/host/dwc_common_port/doc/doxygen.cfg 2015-03-05 14:40:16.553715806 +0100
@@ -0,0 +1,270 @@
+# Doxyfile 1.4.5
+
@@ -54292,9 +65187,9 @@ diff -Nur linux-3.18.6/drivers/usb/host/dwc_common_port/doc/doxygen.cfg linux-rp
+# Configuration::additions related to the search engine
+#---------------------------------------------------------------------------
+SEARCHENGINE = NO
-diff -Nur linux-3.18.6/drivers/usb/host/dwc_common_port/dwc_cc.c linux-rpi/drivers/usb/host/dwc_common_port/dwc_cc.c
---- linux-3.18.6/drivers/usb/host/dwc_common_port/dwc_cc.c 1970-01-01 01:00:00.000000000 +0100
-+++ linux-rpi/drivers/usb/host/dwc_common_port/dwc_cc.c 2015-02-09 04:40:28.000000000 +0100
+diff -Nur linux-3.18.8/drivers/usb/host/dwc_common_port/dwc_cc.c linux-rpi/drivers/usb/host/dwc_common_port/dwc_cc.c
+--- linux-3.18.8/drivers/usb/host/dwc_common_port/dwc_cc.c 1970-01-01 01:00:00.000000000 +0100
++++ linux-rpi/drivers/usb/host/dwc_common_port/dwc_cc.c 2015-03-05 14:40:16.553715806 +0100
@@ -0,0 +1,532 @@
+/* =========================================================================
+ * $File: //dwh/usb_iip/dev/software/dwc_common_port_2/dwc_cc.c $
@@ -54828,9 +65723,9 @@ diff -Nur linux-3.18.6/drivers/usb/host/dwc_common_port/dwc_cc.c linux-rpi/drive
+}
+
+#endif /* DWC_CCLIB */
-diff -Nur linux-3.18.6/drivers/usb/host/dwc_common_port/dwc_cc.h linux-rpi/drivers/usb/host/dwc_common_port/dwc_cc.h
---- linux-3.18.6/drivers/usb/host/dwc_common_port/dwc_cc.h 1970-01-01 01:00:00.000000000 +0100
-+++ linux-rpi/drivers/usb/host/dwc_common_port/dwc_cc.h 2015-02-09 04:40:28.000000000 +0100
+diff -Nur linux-3.18.8/drivers/usb/host/dwc_common_port/dwc_cc.h linux-rpi/drivers/usb/host/dwc_common_port/dwc_cc.h
+--- linux-3.18.8/drivers/usb/host/dwc_common_port/dwc_cc.h 1970-01-01 01:00:00.000000000 +0100
++++ linux-rpi/drivers/usb/host/dwc_common_port/dwc_cc.h 2015-03-05 14:40:16.553715806 +0100
@@ -0,0 +1,224 @@
+/* =========================================================================
+ * $File: //dwh/usb_iip/dev/software/dwc_common_port_2/dwc_cc.h $
@@ -55056,9 +65951,9 @@ diff -Nur linux-3.18.6/drivers/usb/host/dwc_common_port/dwc_cc.h linux-rpi/drive
+#endif
+
+#endif /* _DWC_CC_H_ */
-diff -Nur linux-3.18.6/drivers/usb/host/dwc_common_port/dwc_common_fbsd.c linux-rpi/drivers/usb/host/dwc_common_port/dwc_common_fbsd.c
---- linux-3.18.6/drivers/usb/host/dwc_common_port/dwc_common_fbsd.c 1970-01-01 01:00:00.000000000 +0100
-+++ linux-rpi/drivers/usb/host/dwc_common_port/dwc_common_fbsd.c 2015-02-09 04:40:28.000000000 +0100
+diff -Nur linux-3.18.8/drivers/usb/host/dwc_common_port/dwc_common_fbsd.c linux-rpi/drivers/usb/host/dwc_common_port/dwc_common_fbsd.c
+--- linux-3.18.8/drivers/usb/host/dwc_common_port/dwc_common_fbsd.c 1970-01-01 01:00:00.000000000 +0100
++++ linux-rpi/drivers/usb/host/dwc_common_port/dwc_common_fbsd.c 2015-03-05 14:40:16.553715806 +0100
@@ -0,0 +1,1308 @@
+#include "dwc_os.h"
+#include "dwc_list.h"
@@ -56368,9 +67263,9 @@ diff -Nur linux-3.18.6/drivers/usb/host/dwc_common_port/dwc_common_fbsd.c linux-
+{
+ return wq->pending;
+}
-diff -Nur linux-3.18.6/drivers/usb/host/dwc_common_port/dwc_common_linux.c linux-rpi/drivers/usb/host/dwc_common_port/dwc_common_linux.c
---- linux-3.18.6/drivers/usb/host/dwc_common_port/dwc_common_linux.c 1970-01-01 01:00:00.000000000 +0100
-+++ linux-rpi/drivers/usb/host/dwc_common_port/dwc_common_linux.c 2015-02-09 04:40:28.000000000 +0100
+diff -Nur linux-3.18.8/drivers/usb/host/dwc_common_port/dwc_common_linux.c linux-rpi/drivers/usb/host/dwc_common_port/dwc_common_linux.c
+--- linux-3.18.8/drivers/usb/host/dwc_common_port/dwc_common_linux.c 1970-01-01 01:00:00.000000000 +0100
++++ linux-rpi/drivers/usb/host/dwc_common_port/dwc_common_linux.c 2015-03-05 14:40:16.553715806 +0100
@@ -0,0 +1,1434 @@
+#include <linux/kernel.h>
+#include <linux/init.h>
@@ -57806,9 +68701,9 @@ diff -Nur linux-3.18.6/drivers/usb/host/dwc_common_port/dwc_common_linux.c linux
+MODULE_LICENSE ("GPL");
+
+#endif /* DWC_LIBMODULE */
-diff -Nur linux-3.18.6/drivers/usb/host/dwc_common_port/dwc_common_nbsd.c linux-rpi/drivers/usb/host/dwc_common_port/dwc_common_nbsd.c
---- linux-3.18.6/drivers/usb/host/dwc_common_port/dwc_common_nbsd.c 1970-01-01 01:00:00.000000000 +0100
-+++ linux-rpi/drivers/usb/host/dwc_common_port/dwc_common_nbsd.c 2015-02-09 04:40:28.000000000 +0100
+diff -Nur linux-3.18.8/drivers/usb/host/dwc_common_port/dwc_common_nbsd.c linux-rpi/drivers/usb/host/dwc_common_port/dwc_common_nbsd.c
+--- linux-3.18.8/drivers/usb/host/dwc_common_port/dwc_common_nbsd.c 1970-01-01 01:00:00.000000000 +0100
++++ linux-rpi/drivers/usb/host/dwc_common_port/dwc_common_nbsd.c 2015-03-05 14:40:16.557715806 +0100
@@ -0,0 +1,1275 @@
+#include "dwc_os.h"
+#include "dwc_list.h"
@@ -59085,9 +69980,9 @@ diff -Nur linux-3.18.6/drivers/usb/host/dwc_common_port/dwc_common_nbsd.c linux-
+{
+ return wq->pending;
+}
-diff -Nur linux-3.18.6/drivers/usb/host/dwc_common_port/dwc_crypto.c linux-rpi/drivers/usb/host/dwc_common_port/dwc_crypto.c
---- linux-3.18.6/drivers/usb/host/dwc_common_port/dwc_crypto.c 1970-01-01 01:00:00.000000000 +0100
-+++ linux-rpi/drivers/usb/host/dwc_common_port/dwc_crypto.c 2015-02-09 04:40:28.000000000 +0100
+diff -Nur linux-3.18.8/drivers/usb/host/dwc_common_port/dwc_crypto.c linux-rpi/drivers/usb/host/dwc_common_port/dwc_crypto.c
+--- linux-3.18.8/drivers/usb/host/dwc_common_port/dwc_crypto.c 1970-01-01 01:00:00.000000000 +0100
++++ linux-rpi/drivers/usb/host/dwc_common_port/dwc_crypto.c 2015-03-05 14:40:16.557715806 +0100
@@ -0,0 +1,308 @@
+/* =========================================================================
+ * $File: //dwh/usb_iip/dev/software/dwc_common_port_2/dwc_crypto.c $
@@ -59397,9 +70292,9 @@ diff -Nur linux-3.18.6/drivers/usb/host/dwc_common_port/dwc_crypto.c linux-rpi/d
+}
+
+#endif /* DWC_CRYPTOLIB */
-diff -Nur linux-3.18.6/drivers/usb/host/dwc_common_port/dwc_crypto.h linux-rpi/drivers/usb/host/dwc_common_port/dwc_crypto.h
---- linux-3.18.6/drivers/usb/host/dwc_common_port/dwc_crypto.h 1970-01-01 01:00:00.000000000 +0100
-+++ linux-rpi/drivers/usb/host/dwc_common_port/dwc_crypto.h 2015-02-09 04:40:28.000000000 +0100
+diff -Nur linux-3.18.8/drivers/usb/host/dwc_common_port/dwc_crypto.h linux-rpi/drivers/usb/host/dwc_common_port/dwc_crypto.h
+--- linux-3.18.8/drivers/usb/host/dwc_common_port/dwc_crypto.h 1970-01-01 01:00:00.000000000 +0100
++++ linux-rpi/drivers/usb/host/dwc_common_port/dwc_crypto.h 2015-03-05 14:40:16.557715806 +0100
@@ -0,0 +1,111 @@
+/* =========================================================================
+ * $File: //dwh/usb_iip/dev/software/dwc_common_port_2/dwc_crypto.h $
@@ -59512,9 +70407,9 @@ diff -Nur linux-3.18.6/drivers/usb/host/dwc_common_port/dwc_crypto.h linux-rpi/d
+#endif
+
+#endif /* _DWC_CRYPTO_H_ */
-diff -Nur linux-3.18.6/drivers/usb/host/dwc_common_port/dwc_dh.c linux-rpi/drivers/usb/host/dwc_common_port/dwc_dh.c
---- linux-3.18.6/drivers/usb/host/dwc_common_port/dwc_dh.c 1970-01-01 01:00:00.000000000 +0100
-+++ linux-rpi/drivers/usb/host/dwc_common_port/dwc_dh.c 2015-02-09 04:40:28.000000000 +0100
+diff -Nur linux-3.18.8/drivers/usb/host/dwc_common_port/dwc_dh.c linux-rpi/drivers/usb/host/dwc_common_port/dwc_dh.c
+--- linux-3.18.8/drivers/usb/host/dwc_common_port/dwc_dh.c 1970-01-01 01:00:00.000000000 +0100
++++ linux-rpi/drivers/usb/host/dwc_common_port/dwc_dh.c 2015-03-05 14:40:16.557715806 +0100
@@ -0,0 +1,291 @@
+/* =========================================================================
+ * $File: //dwh/usb_iip/dev/software/dwc_common_port_2/dwc_dh.c $
@@ -59807,9 +70702,9 @@ diff -Nur linux-3.18.6/drivers/usb/host/dwc_common_port/dwc_dh.c linux-rpi/drive
+#endif /* !CONFIG_MACH_IPMATE */
+
+#endif /* DWC_CRYPTOLIB */
-diff -Nur linux-3.18.6/drivers/usb/host/dwc_common_port/dwc_dh.h linux-rpi/drivers/usb/host/dwc_common_port/dwc_dh.h
---- linux-3.18.6/drivers/usb/host/dwc_common_port/dwc_dh.h 1970-01-01 01:00:00.000000000 +0100
-+++ linux-rpi/drivers/usb/host/dwc_common_port/dwc_dh.h 2015-02-09 04:40:28.000000000 +0100
+diff -Nur linux-3.18.8/drivers/usb/host/dwc_common_port/dwc_dh.h linux-rpi/drivers/usb/host/dwc_common_port/dwc_dh.h
+--- linux-3.18.8/drivers/usb/host/dwc_common_port/dwc_dh.h 1970-01-01 01:00:00.000000000 +0100
++++ linux-rpi/drivers/usb/host/dwc_common_port/dwc_dh.h 2015-03-05 14:40:16.557715806 +0100
@@ -0,0 +1,106 @@
+/* =========================================================================
+ * $File: //dwh/usb_iip/dev/software/dwc_common_port_2/dwc_dh.h $
@@ -59917,9 +70812,9 @@ diff -Nur linux-3.18.6/drivers/usb/host/dwc_common_port/dwc_dh.h linux-rpi/drive
+#endif
+
+#endif /* _DWC_DH_H_ */
-diff -Nur linux-3.18.6/drivers/usb/host/dwc_common_port/dwc_list.h linux-rpi/drivers/usb/host/dwc_common_port/dwc_list.h
---- linux-3.18.6/drivers/usb/host/dwc_common_port/dwc_list.h 1970-01-01 01:00:00.000000000 +0100
-+++ linux-rpi/drivers/usb/host/dwc_common_port/dwc_list.h 2015-02-09 04:40:28.000000000 +0100
+diff -Nur linux-3.18.8/drivers/usb/host/dwc_common_port/dwc_list.h linux-rpi/drivers/usb/host/dwc_common_port/dwc_list.h
+--- linux-3.18.8/drivers/usb/host/dwc_common_port/dwc_list.h 1970-01-01 01:00:00.000000000 +0100
++++ linux-rpi/drivers/usb/host/dwc_common_port/dwc_list.h 2015-03-05 14:40:16.557715806 +0100
@@ -0,0 +1,594 @@
+/* $OpenBSD: queue.h,v 1.26 2004/05/04 16:59:32 grange Exp $ */
+/* $NetBSD: queue.h,v 1.11 1996/05/16 05:17:14 mycroft Exp $ */
@@ -60515,9 +71410,9 @@ diff -Nur linux-3.18.6/drivers/usb/host/dwc_common_port/dwc_list.h linux-rpi/dri
+#endif
+
+#endif /* _DWC_LIST_H_ */
-diff -Nur linux-3.18.6/drivers/usb/host/dwc_common_port/dwc_mem.c linux-rpi/drivers/usb/host/dwc_common_port/dwc_mem.c
---- linux-3.18.6/drivers/usb/host/dwc_common_port/dwc_mem.c 1970-01-01 01:00:00.000000000 +0100
-+++ linux-rpi/drivers/usb/host/dwc_common_port/dwc_mem.c 2015-02-09 04:40:28.000000000 +0100
+diff -Nur linux-3.18.8/drivers/usb/host/dwc_common_port/dwc_mem.c linux-rpi/drivers/usb/host/dwc_common_port/dwc_mem.c
+--- linux-3.18.8/drivers/usb/host/dwc_common_port/dwc_mem.c 1970-01-01 01:00:00.000000000 +0100
++++ linux-rpi/drivers/usb/host/dwc_common_port/dwc_mem.c 2015-03-05 14:40:16.557715806 +0100
@@ -0,0 +1,245 @@
+/* Memory Debugging */
+#ifdef DWC_DEBUG_MEMORY
@@ -60764,9 +71659,9 @@ diff -Nur linux-3.18.6/drivers/usb/host/dwc_common_port/dwc_mem.c linux-rpi/driv
+}
+
+#endif /* DWC_DEBUG_MEMORY */
-diff -Nur linux-3.18.6/drivers/usb/host/dwc_common_port/dwc_modpow.c linux-rpi/drivers/usb/host/dwc_common_port/dwc_modpow.c
---- linux-3.18.6/drivers/usb/host/dwc_common_port/dwc_modpow.c 1970-01-01 01:00:00.000000000 +0100
-+++ linux-rpi/drivers/usb/host/dwc_common_port/dwc_modpow.c 2015-02-09 04:40:28.000000000 +0100
+diff -Nur linux-3.18.8/drivers/usb/host/dwc_common_port/dwc_modpow.c linux-rpi/drivers/usb/host/dwc_common_port/dwc_modpow.c
+--- linux-3.18.8/drivers/usb/host/dwc_common_port/dwc_modpow.c 1970-01-01 01:00:00.000000000 +0100
++++ linux-rpi/drivers/usb/host/dwc_common_port/dwc_modpow.c 2015-03-05 14:40:16.557715806 +0100
@@ -0,0 +1,636 @@
+/* Bignum routines adapted from PUTTY sources. PuTTY copyright notice follows.
+ *
@@ -61404,9 +72299,9 @@ diff -Nur linux-3.18.6/drivers/usb/host/dwc_common_port/dwc_modpow.c linux-rpi/d
+#endif /* CONFIG_MACH_IPMATE */
+
+#endif /*DWC_CRYPTOLIB */
-diff -Nur linux-3.18.6/drivers/usb/host/dwc_common_port/dwc_modpow.h linux-rpi/drivers/usb/host/dwc_common_port/dwc_modpow.h
---- linux-3.18.6/drivers/usb/host/dwc_common_port/dwc_modpow.h 1970-01-01 01:00:00.000000000 +0100
-+++ linux-rpi/drivers/usb/host/dwc_common_port/dwc_modpow.h 2015-02-09 04:40:28.000000000 +0100
+diff -Nur linux-3.18.8/drivers/usb/host/dwc_common_port/dwc_modpow.h linux-rpi/drivers/usb/host/dwc_common_port/dwc_modpow.h
+--- linux-3.18.8/drivers/usb/host/dwc_common_port/dwc_modpow.h 1970-01-01 01:00:00.000000000 +0100
++++ linux-rpi/drivers/usb/host/dwc_common_port/dwc_modpow.h 2015-03-05 14:40:16.557715806 +0100
@@ -0,0 +1,34 @@
+/*
+ * dwc_modpow.h
@@ -61442,9 +72337,9 @@ diff -Nur linux-3.18.6/drivers/usb/host/dwc_common_port/dwc_modpow.h linux-rpi/d
+#endif
+
+#endif /* _LINUX_BIGNUM_H */
-diff -Nur linux-3.18.6/drivers/usb/host/dwc_common_port/dwc_notifier.c linux-rpi/drivers/usb/host/dwc_common_port/dwc_notifier.c
---- linux-3.18.6/drivers/usb/host/dwc_common_port/dwc_notifier.c 1970-01-01 01:00:00.000000000 +0100
-+++ linux-rpi/drivers/usb/host/dwc_common_port/dwc_notifier.c 2015-02-09 04:40:28.000000000 +0100
+diff -Nur linux-3.18.8/drivers/usb/host/dwc_common_port/dwc_notifier.c linux-rpi/drivers/usb/host/dwc_common_port/dwc_notifier.c
+--- linux-3.18.8/drivers/usb/host/dwc_common_port/dwc_notifier.c 1970-01-01 01:00:00.000000000 +0100
++++ linux-rpi/drivers/usb/host/dwc_common_port/dwc_notifier.c 2015-03-05 14:40:16.557715806 +0100
@@ -0,0 +1,319 @@
+#ifdef DWC_NOTIFYLIB
+
@@ -61765,9 +72660,9 @@ diff -Nur linux-3.18.6/drivers/usb/host/dwc_common_port/dwc_notifier.c linux-rpi
+}
+
+#endif /* DWC_NOTIFYLIB */
-diff -Nur linux-3.18.6/drivers/usb/host/dwc_common_port/dwc_notifier.h linux-rpi/drivers/usb/host/dwc_common_port/dwc_notifier.h
---- linux-3.18.6/drivers/usb/host/dwc_common_port/dwc_notifier.h 1970-01-01 01:00:00.000000000 +0100
-+++ linux-rpi/drivers/usb/host/dwc_common_port/dwc_notifier.h 2015-02-09 04:40:28.000000000 +0100
+diff -Nur linux-3.18.8/drivers/usb/host/dwc_common_port/dwc_notifier.h linux-rpi/drivers/usb/host/dwc_common_port/dwc_notifier.h
+--- linux-3.18.8/drivers/usb/host/dwc_common_port/dwc_notifier.h 1970-01-01 01:00:00.000000000 +0100
++++ linux-rpi/drivers/usb/host/dwc_common_port/dwc_notifier.h 2015-03-05 14:40:16.557715806 +0100
@@ -0,0 +1,122 @@
+
+#ifndef __DWC_NOTIFIER_H__
@@ -61891,9 +72786,9 @@ diff -Nur linux-3.18.6/drivers/usb/host/dwc_common_port/dwc_notifier.h linux-rpi
+#endif
+
+#endif /* __DWC_NOTIFIER_H__ */
-diff -Nur linux-3.18.6/drivers/usb/host/dwc_common_port/dwc_os.h linux-rpi/drivers/usb/host/dwc_common_port/dwc_os.h
---- linux-3.18.6/drivers/usb/host/dwc_common_port/dwc_os.h 1970-01-01 01:00:00.000000000 +0100
-+++ linux-rpi/drivers/usb/host/dwc_common_port/dwc_os.h 2015-02-09 04:40:28.000000000 +0100
+diff -Nur linux-3.18.8/drivers/usb/host/dwc_common_port/dwc_os.h linux-rpi/drivers/usb/host/dwc_common_port/dwc_os.h
+--- linux-3.18.8/drivers/usb/host/dwc_common_port/dwc_os.h 1970-01-01 01:00:00.000000000 +0100
++++ linux-rpi/drivers/usb/host/dwc_common_port/dwc_os.h 2015-03-05 14:40:16.557715806 +0100
@@ -0,0 +1,1276 @@
+/* =========================================================================
+ * $File: //dwh/usb_iip/dev/software/dwc_common_port_2/dwc_os.h $
@@ -63171,9 +74066,9 @@ diff -Nur linux-3.18.6/drivers/usb/host/dwc_common_port/dwc_os.h linux-rpi/drive
+#endif
+
+#endif /* _DWC_OS_H_ */
-diff -Nur linux-3.18.6/drivers/usb/host/dwc_common_port/Makefile linux-rpi/drivers/usb/host/dwc_common_port/Makefile
---- linux-3.18.6/drivers/usb/host/dwc_common_port/Makefile 1970-01-01 01:00:00.000000000 +0100
-+++ linux-rpi/drivers/usb/host/dwc_common_port/Makefile 2015-02-09 04:40:28.000000000 +0100
+diff -Nur linux-3.18.8/drivers/usb/host/dwc_common_port/Makefile linux-rpi/drivers/usb/host/dwc_common_port/Makefile
+--- linux-3.18.8/drivers/usb/host/dwc_common_port/Makefile 1970-01-01 01:00:00.000000000 +0100
++++ linux-rpi/drivers/usb/host/dwc_common_port/Makefile 2015-03-05 14:40:16.553715806 +0100
@@ -0,0 +1,58 @@
+#
+# Makefile for DWC_common library
@@ -63233,9 +74128,9 @@ diff -Nur linux-3.18.6/drivers/usb/host/dwc_common_port/Makefile linux-rpi/drive
+
+clean:
+ rm -rf *.o *.ko .*.cmd *.mod.c .*.o.d .*.o.tmp modules.order Module.markers Module.symvers .tmp_versions/
-diff -Nur linux-3.18.6/drivers/usb/host/dwc_common_port/Makefile.fbsd linux-rpi/drivers/usb/host/dwc_common_port/Makefile.fbsd
---- linux-3.18.6/drivers/usb/host/dwc_common_port/Makefile.fbsd 1970-01-01 01:00:00.000000000 +0100
-+++ linux-rpi/drivers/usb/host/dwc_common_port/Makefile.fbsd 2015-02-09 04:40:28.000000000 +0100
+diff -Nur linux-3.18.8/drivers/usb/host/dwc_common_port/Makefile.fbsd linux-rpi/drivers/usb/host/dwc_common_port/Makefile.fbsd
+--- linux-3.18.8/drivers/usb/host/dwc_common_port/Makefile.fbsd 1970-01-01 01:00:00.000000000 +0100
++++ linux-rpi/drivers/usb/host/dwc_common_port/Makefile.fbsd 2015-03-05 14:40:16.553715806 +0100
@@ -0,0 +1,17 @@
+CFLAGS += -I/sys/i386/compile/GENERIC -I/sys/i386/include -I/usr/include
+CFLAGS += -DDWC_FREEBSD
@@ -63254,9 +74149,9 @@ diff -Nur linux-3.18.6/drivers/usb/host/dwc_common_port/Makefile.fbsd linux-rpi/
+ dwc_common_fbsd.c dwc_mem.c
+
+.include <bsd.kmod.mk>
-diff -Nur linux-3.18.6/drivers/usb/host/dwc_common_port/Makefile.linux linux-rpi/drivers/usb/host/dwc_common_port/Makefile.linux
---- linux-3.18.6/drivers/usb/host/dwc_common_port/Makefile.linux 1970-01-01 01:00:00.000000000 +0100
-+++ linux-rpi/drivers/usb/host/dwc_common_port/Makefile.linux 2015-02-09 04:40:28.000000000 +0100
+diff -Nur linux-3.18.8/drivers/usb/host/dwc_common_port/Makefile.linux linux-rpi/drivers/usb/host/dwc_common_port/Makefile.linux
+--- linux-3.18.8/drivers/usb/host/dwc_common_port/Makefile.linux 1970-01-01 01:00:00.000000000 +0100
++++ linux-rpi/drivers/usb/host/dwc_common_port/Makefile.linux 2015-03-05 14:40:16.553715806 +0100
@@ -0,0 +1,49 @@
+#
+# Makefile for DWC_common library
@@ -63307,9 +74202,9 @@ diff -Nur linux-3.18.6/drivers/usb/host/dwc_common_port/Makefile.linux linux-rpi
+
+clean:
+ rm -rf *.o *.ko .*.cmd *.mod.c .*.o.d .*.o.tmp modules.order Module.markers Module.symvers .tmp_versions/
-diff -Nur linux-3.18.6/drivers/usb/host/dwc_common_port/usb.h linux-rpi/drivers/usb/host/dwc_common_port/usb.h
---- linux-3.18.6/drivers/usb/host/dwc_common_port/usb.h 1970-01-01 01:00:00.000000000 +0100
-+++ linux-rpi/drivers/usb/host/dwc_common_port/usb.h 2015-02-09 04:40:28.000000000 +0100
+diff -Nur linux-3.18.8/drivers/usb/host/dwc_common_port/usb.h linux-rpi/drivers/usb/host/dwc_common_port/usb.h
+--- linux-3.18.8/drivers/usb/host/dwc_common_port/usb.h 1970-01-01 01:00:00.000000000 +0100
++++ linux-rpi/drivers/usb/host/dwc_common_port/usb.h 2015-03-05 14:40:16.557715806 +0100
@@ -0,0 +1,946 @@
+/*
+ * Copyright (c) 1998 The NetBSD Foundation, Inc.
@@ -64257,9 +75152,9 @@ diff -Nur linux-3.18.6/drivers/usb/host/dwc_common_port/usb.h linux-rpi/drivers/
+#endif
+
+#endif /* _USB_H_ */
-diff -Nur linux-3.18.6/drivers/usb/host/dwc_otg/doc/doxygen.cfg linux-rpi/drivers/usb/host/dwc_otg/doc/doxygen.cfg
---- linux-3.18.6/drivers/usb/host/dwc_otg/doc/doxygen.cfg 1970-01-01 01:00:00.000000000 +0100
-+++ linux-rpi/drivers/usb/host/dwc_otg/doc/doxygen.cfg 2015-02-09 04:40:28.000000000 +0100
+diff -Nur linux-3.18.8/drivers/usb/host/dwc_otg/doc/doxygen.cfg linux-rpi/drivers/usb/host/dwc_otg/doc/doxygen.cfg
+--- linux-3.18.8/drivers/usb/host/dwc_otg/doc/doxygen.cfg 1970-01-01 01:00:00.000000000 +0100
++++ linux-rpi/drivers/usb/host/dwc_otg/doc/doxygen.cfg 2015-03-05 14:40:16.557715806 +0100
@@ -0,0 +1,224 @@
+# Doxyfile 1.3.9.1
+
@@ -64485,9 +75380,9 @@ diff -Nur linux-3.18.6/drivers/usb/host/dwc_otg/doc/doxygen.cfg linux-rpi/driver
+# Configuration::additions related to the search engine
+#---------------------------------------------------------------------------
+SEARCHENGINE = NO
-diff -Nur linux-3.18.6/drivers/usb/host/dwc_otg/dummy_audio.c linux-rpi/drivers/usb/host/dwc_otg/dummy_audio.c
---- linux-3.18.6/drivers/usb/host/dwc_otg/dummy_audio.c 1970-01-01 01:00:00.000000000 +0100
-+++ linux-rpi/drivers/usb/host/dwc_otg/dummy_audio.c 2015-02-09 04:40:29.000000000 +0100
+diff -Nur linux-3.18.8/drivers/usb/host/dwc_otg/dummy_audio.c linux-rpi/drivers/usb/host/dwc_otg/dummy_audio.c
+--- linux-3.18.8/drivers/usb/host/dwc_otg/dummy_audio.c 1970-01-01 01:00:00.000000000 +0100
++++ linux-rpi/drivers/usb/host/dwc_otg/dummy_audio.c 2015-03-05 14:40:16.557715806 +0100
@@ -0,0 +1,1575 @@
+/*
+ * zero.c -- Gadget Zero, for USB development
@@ -66064,9 +76959,9 @@ diff -Nur linux-3.18.6/drivers/usb/host/dwc_otg/dummy_audio.c linux-rpi/drivers/
+ remove_proc_entry("isoc_test", NULL);
+}
+module_exit (cleanup);
-diff -Nur linux-3.18.6/drivers/usb/host/dwc_otg/dwc_cfi_common.h linux-rpi/drivers/usb/host/dwc_otg/dwc_cfi_common.h
---- linux-3.18.6/drivers/usb/host/dwc_otg/dwc_cfi_common.h 1970-01-01 01:00:00.000000000 +0100
-+++ linux-rpi/drivers/usb/host/dwc_otg/dwc_cfi_common.h 2015-02-09 04:40:29.000000000 +0100
+diff -Nur linux-3.18.8/drivers/usb/host/dwc_otg/dwc_cfi_common.h linux-rpi/drivers/usb/host/dwc_otg/dwc_cfi_common.h
+--- linux-3.18.8/drivers/usb/host/dwc_otg/dwc_cfi_common.h 1970-01-01 01:00:00.000000000 +0100
++++ linux-rpi/drivers/usb/host/dwc_otg/dwc_cfi_common.h 2015-03-05 14:40:16.557715806 +0100
@@ -0,0 +1,142 @@
+/* ==========================================================================
+ * Synopsys HS OTG Linux Software Driver and documentation (hereinafter,
@@ -66210,9 +77105,9 @@ diff -Nur linux-3.18.6/drivers/usb/host/dwc_otg/dwc_cfi_common.h linux-rpi/drive
+typedef struct cfi_string cfi_string_t;
+
+#endif
-diff -Nur linux-3.18.6/drivers/usb/host/dwc_otg/dwc_otg_adp.c linux-rpi/drivers/usb/host/dwc_otg/dwc_otg_adp.c
---- linux-3.18.6/drivers/usb/host/dwc_otg/dwc_otg_adp.c 1970-01-01 01:00:00.000000000 +0100
-+++ linux-rpi/drivers/usb/host/dwc_otg/dwc_otg_adp.c 2015-02-09 04:40:29.000000000 +0100
+diff -Nur linux-3.18.8/drivers/usb/host/dwc_otg/dwc_otg_adp.c linux-rpi/drivers/usb/host/dwc_otg/dwc_otg_adp.c
+--- linux-3.18.8/drivers/usb/host/dwc_otg/dwc_otg_adp.c 1970-01-01 01:00:00.000000000 +0100
++++ linux-rpi/drivers/usb/host/dwc_otg/dwc_otg_adp.c 2015-03-05 14:40:16.557715806 +0100
@@ -0,0 +1,854 @@
+/* ==========================================================================
+ * $File: //dwh/usb_iip/dev/software/otg/linux/drivers/dwc_otg_adp.c $
@@ -67068,9 +77963,9 @@ diff -Nur linux-3.18.6/drivers/usb/host/dwc_otg/dwc_otg_adp.c linux-rpi/drivers/
+#endif
+ return 1;
+}
-diff -Nur linux-3.18.6/drivers/usb/host/dwc_otg/dwc_otg_adp.h linux-rpi/drivers/usb/host/dwc_otg/dwc_otg_adp.h
---- linux-3.18.6/drivers/usb/host/dwc_otg/dwc_otg_adp.h 1970-01-01 01:00:00.000000000 +0100
-+++ linux-rpi/drivers/usb/host/dwc_otg/dwc_otg_adp.h 2015-02-09 04:40:29.000000000 +0100
+diff -Nur linux-3.18.8/drivers/usb/host/dwc_otg/dwc_otg_adp.h linux-rpi/drivers/usb/host/dwc_otg/dwc_otg_adp.h
+--- linux-3.18.8/drivers/usb/host/dwc_otg/dwc_otg_adp.h 1970-01-01 01:00:00.000000000 +0100
++++ linux-rpi/drivers/usb/host/dwc_otg/dwc_otg_adp.h 2015-03-05 14:40:16.557715806 +0100
@@ -0,0 +1,80 @@
+/* ==========================================================================
+ * $File: //dwh/usb_iip/dev/software/otg/linux/drivers/dwc_otg_adp.h $
@@ -67152,9 +78047,9 @@ diff -Nur linux-3.18.6/drivers/usb/host/dwc_otg/dwc_otg_adp.h linux-rpi/drivers/
+extern int32_t dwc_otg_adp_handle_srp_intr(dwc_otg_core_if_t * core_if);
+
+#endif //__DWC_OTG_ADP_H__
-diff -Nur linux-3.18.6/drivers/usb/host/dwc_otg/dwc_otg_attr.c linux-rpi/drivers/usb/host/dwc_otg/dwc_otg_attr.c
---- linux-3.18.6/drivers/usb/host/dwc_otg/dwc_otg_attr.c 1970-01-01 01:00:00.000000000 +0100
-+++ linux-rpi/drivers/usb/host/dwc_otg/dwc_otg_attr.c 2015-02-09 04:40:29.000000000 +0100
+diff -Nur linux-3.18.8/drivers/usb/host/dwc_otg/dwc_otg_attr.c linux-rpi/drivers/usb/host/dwc_otg/dwc_otg_attr.c
+--- linux-3.18.8/drivers/usb/host/dwc_otg/dwc_otg_attr.c 1970-01-01 01:00:00.000000000 +0100
++++ linux-rpi/drivers/usb/host/dwc_otg/dwc_otg_attr.c 2015-03-05 14:40:16.557715806 +0100
@@ -0,0 +1,1210 @@
+/* ==========================================================================
+ * $File: //dwh/usb_iip/dev/software/otg/linux/drivers/dwc_otg_attr.c $
@@ -68366,9 +79261,9 @@ diff -Nur linux-3.18.6/drivers/usb/host/dwc_otg/dwc_otg_attr.c linux-rpi/drivers
+ device_remove_file(&dev->dev, &dev_attr_sleep_status);
+#endif
+}
-diff -Nur linux-3.18.6/drivers/usb/host/dwc_otg/dwc_otg_attr.h linux-rpi/drivers/usb/host/dwc_otg/dwc_otg_attr.h
---- linux-3.18.6/drivers/usb/host/dwc_otg/dwc_otg_attr.h 1970-01-01 01:00:00.000000000 +0100
-+++ linux-rpi/drivers/usb/host/dwc_otg/dwc_otg_attr.h 2015-02-09 04:40:29.000000000 +0100
+diff -Nur linux-3.18.8/drivers/usb/host/dwc_otg/dwc_otg_attr.h linux-rpi/drivers/usb/host/dwc_otg/dwc_otg_attr.h
+--- linux-3.18.8/drivers/usb/host/dwc_otg/dwc_otg_attr.h 1970-01-01 01:00:00.000000000 +0100
++++ linux-rpi/drivers/usb/host/dwc_otg/dwc_otg_attr.h 2015-03-05 14:40:16.557715806 +0100
@@ -0,0 +1,89 @@
+/* ==========================================================================
+ * $File: //dwh/usb_iip/dev/software/otg/linux/drivers/dwc_otg_attr.h $
@@ -68459,9 +79354,9 @@ diff -Nur linux-3.18.6/drivers/usb/host/dwc_otg/dwc_otg_attr.h linux-rpi/drivers
+#endif
+ );
+#endif
-diff -Nur linux-3.18.6/drivers/usb/host/dwc_otg/dwc_otg_cfi.c linux-rpi/drivers/usb/host/dwc_otg/dwc_otg_cfi.c
---- linux-3.18.6/drivers/usb/host/dwc_otg/dwc_otg_cfi.c 1970-01-01 01:00:00.000000000 +0100
-+++ linux-rpi/drivers/usb/host/dwc_otg/dwc_otg_cfi.c 2015-02-09 04:40:29.000000000 +0100
+diff -Nur linux-3.18.8/drivers/usb/host/dwc_otg/dwc_otg_cfi.c linux-rpi/drivers/usb/host/dwc_otg/dwc_otg_cfi.c
+--- linux-3.18.8/drivers/usb/host/dwc_otg/dwc_otg_cfi.c 1970-01-01 01:00:00.000000000 +0100
++++ linux-rpi/drivers/usb/host/dwc_otg/dwc_otg_cfi.c 2015-03-05 14:40:16.557715806 +0100
@@ -0,0 +1,1876 @@
+/* ==========================================================================
+ * Synopsys HS OTG Linux Software Driver and documentation (hereinafter,
@@ -70339,9 +81234,9 @@ diff -Nur linux-3.18.6/drivers/usb/host/dwc_otg/dwc_otg_cfi.c linux-rpi/drivers/
+}
+
+#endif //DWC_UTE_CFI
-diff -Nur linux-3.18.6/drivers/usb/host/dwc_otg/dwc_otg_cfi.h linux-rpi/drivers/usb/host/dwc_otg/dwc_otg_cfi.h
---- linux-3.18.6/drivers/usb/host/dwc_otg/dwc_otg_cfi.h 1970-01-01 01:00:00.000000000 +0100
-+++ linux-rpi/drivers/usb/host/dwc_otg/dwc_otg_cfi.h 2015-02-09 04:40:29.000000000 +0100
+diff -Nur linux-3.18.8/drivers/usb/host/dwc_otg/dwc_otg_cfi.h linux-rpi/drivers/usb/host/dwc_otg/dwc_otg_cfi.h
+--- linux-3.18.8/drivers/usb/host/dwc_otg/dwc_otg_cfi.h 1970-01-01 01:00:00.000000000 +0100
++++ linux-rpi/drivers/usb/host/dwc_otg/dwc_otg_cfi.h 2015-03-05 14:40:16.557715806 +0100
@@ -0,0 +1,320 @@
+/* ==========================================================================
+ * Synopsys HS OTG Linux Software Driver and documentation (hereinafter,
@@ -70663,9 +81558,9 @@ diff -Nur linux-3.18.6/drivers/usb/host/dwc_otg/dwc_otg_cfi.h linux-rpi/drivers/
+int cfi_setup(struct dwc_otg_pcd *pcd, struct cfi_usb_ctrlrequest *ctrl);
+
+#endif /* (__DWC_OTG_CFI_H__) */
-diff -Nur linux-3.18.6/drivers/usb/host/dwc_otg/dwc_otg_cil.c linux-rpi/drivers/usb/host/dwc_otg/dwc_otg_cil.c
---- linux-3.18.6/drivers/usb/host/dwc_otg/dwc_otg_cil.c 1970-01-01 01:00:00.000000000 +0100
-+++ linux-rpi/drivers/usb/host/dwc_otg/dwc_otg_cil.c 2015-02-09 04:40:29.000000000 +0100
+diff -Nur linux-3.18.8/drivers/usb/host/dwc_otg/dwc_otg_cil.c linux-rpi/drivers/usb/host/dwc_otg/dwc_otg_cil.c
+--- linux-3.18.8/drivers/usb/host/dwc_otg/dwc_otg_cil.c 1970-01-01 01:00:00.000000000 +0100
++++ linux-rpi/drivers/usb/host/dwc_otg/dwc_otg_cil.c 2015-03-05 14:40:16.557715806 +0100
@@ -0,0 +1,7141 @@
+/* ==========================================================================
+ * $File: //dwh/usb_iip/dev/software/otg/linux/drivers/dwc_otg_cil.c $
@@ -77808,9 +88703,9 @@ diff -Nur linux-3.18.6/drivers/usb/host/dwc_otg/dwc_otg_cil.c linux-rpi/drivers/
+ dwc_otg_pcd_start_srp_timer(core_if);
+ return;
+}
-diff -Nur linux-3.18.6/drivers/usb/host/dwc_otg/dwc_otg_cil.h linux-rpi/drivers/usb/host/dwc_otg/dwc_otg_cil.h
---- linux-3.18.6/drivers/usb/host/dwc_otg/dwc_otg_cil.h 1970-01-01 01:00:00.000000000 +0100
-+++ linux-rpi/drivers/usb/host/dwc_otg/dwc_otg_cil.h 2015-02-09 04:40:29.000000000 +0100
+diff -Nur linux-3.18.8/drivers/usb/host/dwc_otg/dwc_otg_cil.h linux-rpi/drivers/usb/host/dwc_otg/dwc_otg_cil.h
+--- linux-3.18.8/drivers/usb/host/dwc_otg/dwc_otg_cil.h 1970-01-01 01:00:00.000000000 +0100
++++ linux-rpi/drivers/usb/host/dwc_otg/dwc_otg_cil.h 2015-03-05 14:40:16.557715806 +0100
@@ -0,0 +1,1464 @@
+/* ==========================================================================
+ * $File: //dwh/usb_iip/dev/software/otg/linux/drivers/dwc_otg_cil.h $
@@ -79276,9 +90171,9 @@ diff -Nur linux-3.18.6/drivers/usb/host/dwc_otg/dwc_otg_cil.h linux-rpi/drivers/
+//////////////////////////////////////////////////////////////////////
+
+#endif
-diff -Nur linux-3.18.6/drivers/usb/host/dwc_otg/dwc_otg_cil_intr.c linux-rpi/drivers/usb/host/dwc_otg/dwc_otg_cil_intr.c
---- linux-3.18.6/drivers/usb/host/dwc_otg/dwc_otg_cil_intr.c 1970-01-01 01:00:00.000000000 +0100
-+++ linux-rpi/drivers/usb/host/dwc_otg/dwc_otg_cil_intr.c 2015-02-09 04:40:29.000000000 +0100
+diff -Nur linux-3.18.8/drivers/usb/host/dwc_otg/dwc_otg_cil_intr.c linux-rpi/drivers/usb/host/dwc_otg/dwc_otg_cil_intr.c
+--- linux-3.18.8/drivers/usb/host/dwc_otg/dwc_otg_cil_intr.c 1970-01-01 01:00:00.000000000 +0100
++++ linux-rpi/drivers/usb/host/dwc_otg/dwc_otg_cil_intr.c 2015-03-05 14:40:16.557715806 +0100
@@ -0,0 +1,1594 @@
+/* ==========================================================================
+ * $File: //dwh/usb_iip/dev/software/otg/linux/drivers/dwc_otg_cil_intr.c $
@@ -80874,9 +91769,9 @@ diff -Nur linux-3.18.6/drivers/usb/host/dwc_otg/dwc_otg_cil_intr.c linux-rpi/dri
+ DWC_SPINUNLOCK(core_if->lock);
+ return retval;
+}
-diff -Nur linux-3.18.6/drivers/usb/host/dwc_otg/dwc_otg_core_if.h linux-rpi/drivers/usb/host/dwc_otg/dwc_otg_core_if.h
---- linux-3.18.6/drivers/usb/host/dwc_otg/dwc_otg_core_if.h 1970-01-01 01:00:00.000000000 +0100
-+++ linux-rpi/drivers/usb/host/dwc_otg/dwc_otg_core_if.h 2015-02-09 04:40:29.000000000 +0100
+diff -Nur linux-3.18.8/drivers/usb/host/dwc_otg/dwc_otg_core_if.h linux-rpi/drivers/usb/host/dwc_otg/dwc_otg_core_if.h
+--- linux-3.18.8/drivers/usb/host/dwc_otg/dwc_otg_core_if.h 1970-01-01 01:00:00.000000000 +0100
++++ linux-rpi/drivers/usb/host/dwc_otg/dwc_otg_core_if.h 2015-03-05 14:40:16.557715806 +0100
@@ -0,0 +1,705 @@
+/* ==========================================================================
+ * $File: //dwh/usb_iip/dev/software/otg/linux/drivers/dwc_otg_core_if.h $
@@ -81583,9 +92478,9 @@ diff -Nur linux-3.18.6/drivers/usb/host/dwc_otg/dwc_otg_core_if.h linux-rpi/driv
+/** @} */
+
+#endif /* __DWC_CORE_IF_H__ */
-diff -Nur linux-3.18.6/drivers/usb/host/dwc_otg/dwc_otg_dbg.h linux-rpi/drivers/usb/host/dwc_otg/dwc_otg_dbg.h
---- linux-3.18.6/drivers/usb/host/dwc_otg/dwc_otg_dbg.h 1970-01-01 01:00:00.000000000 +0100
-+++ linux-rpi/drivers/usb/host/dwc_otg/dwc_otg_dbg.h 2015-02-09 04:40:29.000000000 +0100
+diff -Nur linux-3.18.8/drivers/usb/host/dwc_otg/dwc_otg_dbg.h linux-rpi/drivers/usb/host/dwc_otg/dwc_otg_dbg.h
+--- linux-3.18.8/drivers/usb/host/dwc_otg/dwc_otg_dbg.h 1970-01-01 01:00:00.000000000 +0100
++++ linux-rpi/drivers/usb/host/dwc_otg/dwc_otg_dbg.h 2015-03-05 14:40:16.557715806 +0100
@@ -0,0 +1,117 @@
+/* ==========================================================================
+ *
@@ -81704,9 +92599,9 @@ diff -Nur linux-3.18.6/drivers/usb/host/dwc_otg/dwc_otg_dbg.h linux-rpi/drivers/
+
+#endif /*DEBUG*/
+#endif
-diff -Nur linux-3.18.6/drivers/usb/host/dwc_otg/dwc_otg_driver.c linux-rpi/drivers/usb/host/dwc_otg/dwc_otg_driver.c
---- linux-3.18.6/drivers/usb/host/dwc_otg/dwc_otg_driver.c 1970-01-01 01:00:00.000000000 +0100
-+++ linux-rpi/drivers/usb/host/dwc_otg/dwc_otg_driver.c 2015-02-09 04:40:29.000000000 +0100
+diff -Nur linux-3.18.8/drivers/usb/host/dwc_otg/dwc_otg_driver.c linux-rpi/drivers/usb/host/dwc_otg/dwc_otg_driver.c
+--- linux-3.18.8/drivers/usb/host/dwc_otg/dwc_otg_driver.c 1970-01-01 01:00:00.000000000 +0100
++++ linux-rpi/drivers/usb/host/dwc_otg/dwc_otg_driver.c 2015-03-05 14:40:16.557715806 +0100
@@ -0,0 +1,1749 @@
+/* ==========================================================================
+ * $File: //dwh/usb_iip/dev/software/otg/linux/drivers/dwc_otg_driver.c $
@@ -83457,9 +94352,9 @@ diff -Nur linux-3.18.6/drivers/usb/host/dwc_otg/dwc_otg_driver.c linux-rpi/drive
+ </td></tr>
+
+*/
-diff -Nur linux-3.18.6/drivers/usb/host/dwc_otg/dwc_otg_driver.h linux-rpi/drivers/usb/host/dwc_otg/dwc_otg_driver.h
---- linux-3.18.6/drivers/usb/host/dwc_otg/dwc_otg_driver.h 1970-01-01 01:00:00.000000000 +0100
-+++ linux-rpi/drivers/usb/host/dwc_otg/dwc_otg_driver.h 2015-02-09 04:40:29.000000000 +0100
+diff -Nur linux-3.18.8/drivers/usb/host/dwc_otg/dwc_otg_driver.h linux-rpi/drivers/usb/host/dwc_otg/dwc_otg_driver.h
+--- linux-3.18.8/drivers/usb/host/dwc_otg/dwc_otg_driver.h 1970-01-01 01:00:00.000000000 +0100
++++ linux-rpi/drivers/usb/host/dwc_otg/dwc_otg_driver.h 2015-03-05 14:40:16.557715806 +0100
@@ -0,0 +1,86 @@
+/* ==========================================================================
+ * $File: //dwh/usb_iip/dev/software/otg/linux/drivers/dwc_otg_driver.h $
@@ -83547,9 +94442,9 @@ diff -Nur linux-3.18.6/drivers/usb/host/dwc_otg/dwc_otg_driver.h linux-rpi/drive
+#endif
+
+#endif
-diff -Nur linux-3.18.6/drivers/usb/host/dwc_otg/dwc_otg_fiq_fsm.c linux-rpi/drivers/usb/host/dwc_otg/dwc_otg_fiq_fsm.c
---- linux-3.18.6/drivers/usb/host/dwc_otg/dwc_otg_fiq_fsm.c 1970-01-01 01:00:00.000000000 +0100
-+++ linux-rpi/drivers/usb/host/dwc_otg/dwc_otg_fiq_fsm.c 2015-02-09 04:40:29.000000000 +0100
+diff -Nur linux-3.18.8/drivers/usb/host/dwc_otg/dwc_otg_fiq_fsm.c linux-rpi/drivers/usb/host/dwc_otg/dwc_otg_fiq_fsm.c
+--- linux-3.18.8/drivers/usb/host/dwc_otg/dwc_otg_fiq_fsm.c 1970-01-01 01:00:00.000000000 +0100
++++ linux-rpi/drivers/usb/host/dwc_otg/dwc_otg_fiq_fsm.c 2015-03-05 14:40:16.557715806 +0100
@@ -0,0 +1,1346 @@
+/*
+ * dwc_otg_fiq_fsm.c - The finite state machine FIQ
@@ -84897,9 +95792,9 @@ diff -Nur linux-3.18.6/drivers/usb/host/dwc_otg/dwc_otg_fiq_fsm.c linux-rpi/driv
+ mb();
+ fiq_fsm_spin_unlock(&state->lock);
+}
-diff -Nur linux-3.18.6/drivers/usb/host/dwc_otg/dwc_otg_fiq_fsm.h linux-rpi/drivers/usb/host/dwc_otg/dwc_otg_fiq_fsm.h
---- linux-3.18.6/drivers/usb/host/dwc_otg/dwc_otg_fiq_fsm.h 1970-01-01 01:00:00.000000000 +0100
-+++ linux-rpi/drivers/usb/host/dwc_otg/dwc_otg_fiq_fsm.h 2015-02-09 04:40:29.000000000 +0100
+diff -Nur linux-3.18.8/drivers/usb/host/dwc_otg/dwc_otg_fiq_fsm.h linux-rpi/drivers/usb/host/dwc_otg/dwc_otg_fiq_fsm.h
+--- linux-3.18.8/drivers/usb/host/dwc_otg/dwc_otg_fiq_fsm.h 1970-01-01 01:00:00.000000000 +0100
++++ linux-rpi/drivers/usb/host/dwc_otg/dwc_otg_fiq_fsm.h 2015-03-05 14:40:16.557715806 +0100
@@ -0,0 +1,367 @@
+/*
+ * dwc_otg_fiq_fsm.h - Finite state machine FIQ header definitions
@@ -85268,9 +96163,9 @@ diff -Nur linux-3.18.6/drivers/usb/host/dwc_otg/dwc_otg_fiq_fsm.h linux-rpi/driv
+extern void dwc_otg_fiq_nop(struct fiq_state *state);
+
+#endif /* DWC_OTG_FIQ_FSM_H_ */
-diff -Nur linux-3.18.6/drivers/usb/host/dwc_otg/dwc_otg_fiq_stub.S linux-rpi/drivers/usb/host/dwc_otg/dwc_otg_fiq_stub.S
---- linux-3.18.6/drivers/usb/host/dwc_otg/dwc_otg_fiq_stub.S 1970-01-01 01:00:00.000000000 +0100
-+++ linux-rpi/drivers/usb/host/dwc_otg/dwc_otg_fiq_stub.S 2015-02-09 04:40:29.000000000 +0100
+diff -Nur linux-3.18.8/drivers/usb/host/dwc_otg/dwc_otg_fiq_stub.S linux-rpi/drivers/usb/host/dwc_otg/dwc_otg_fiq_stub.S
+--- linux-3.18.8/drivers/usb/host/dwc_otg/dwc_otg_fiq_stub.S 1970-01-01 01:00:00.000000000 +0100
++++ linux-rpi/drivers/usb/host/dwc_otg/dwc_otg_fiq_stub.S 2015-03-05 14:40:16.557715806 +0100
@@ -0,0 +1,81 @@
+/*
+ * dwc_otg_fiq_fsm.S - assembly stub for the FSM FIQ
@@ -85353,9 +96248,9 @@ diff -Nur linux-3.18.6/drivers/usb/host/dwc_otg/dwc_otg_fiq_stub.S linux-rpi/dri
+_dwc_otg_fiq_stub_end:
+END(_dwc_otg_fiq_stub)
+
-diff -Nur linux-3.18.6/drivers/usb/host/dwc_otg/dwc_otg_hcd.c linux-rpi/drivers/usb/host/dwc_otg/dwc_otg_hcd.c
---- linux-3.18.6/drivers/usb/host/dwc_otg/dwc_otg_hcd.c 1970-01-01 01:00:00.000000000 +0100
-+++ linux-rpi/drivers/usb/host/dwc_otg/dwc_otg_hcd.c 2015-02-09 04:40:29.000000000 +0100
+diff -Nur linux-3.18.8/drivers/usb/host/dwc_otg/dwc_otg_hcd.c linux-rpi/drivers/usb/host/dwc_otg/dwc_otg_hcd.c
+--- linux-3.18.8/drivers/usb/host/dwc_otg/dwc_otg_hcd.c 1970-01-01 01:00:00.000000000 +0100
++++ linux-rpi/drivers/usb/host/dwc_otg/dwc_otg_hcd.c 2015-03-05 14:40:16.557715806 +0100
@@ -0,0 +1,4244 @@
+
+/* ==========================================================================
@@ -89601,9 +100496,9 @@ diff -Nur linux-3.18.6/drivers/usb/host/dwc_otg/dwc_otg_hcd.c linux-rpi/drivers/
+}
+
+#endif /* DWC_DEVICE_ONLY */
-diff -Nur linux-3.18.6/drivers/usb/host/dwc_otg/dwc_otg_hcd_ddma.c linux-rpi/drivers/usb/host/dwc_otg/dwc_otg_hcd_ddma.c
---- linux-3.18.6/drivers/usb/host/dwc_otg/dwc_otg_hcd_ddma.c 1970-01-01 01:00:00.000000000 +0100
-+++ linux-rpi/drivers/usb/host/dwc_otg/dwc_otg_hcd_ddma.c 2015-02-09 04:40:29.000000000 +0100
+diff -Nur linux-3.18.8/drivers/usb/host/dwc_otg/dwc_otg_hcd_ddma.c linux-rpi/drivers/usb/host/dwc_otg/dwc_otg_hcd_ddma.c
+--- linux-3.18.8/drivers/usb/host/dwc_otg/dwc_otg_hcd_ddma.c 1970-01-01 01:00:00.000000000 +0100
++++ linux-rpi/drivers/usb/host/dwc_otg/dwc_otg_hcd_ddma.c 2015-03-05 14:40:16.561715806 +0100
@@ -0,0 +1,1132 @@
+/*==========================================================================
+ * $File: //dwh/usb_iip/dev/software/otg/linux/drivers/dwc_otg_hcd_ddma.c $
@@ -90737,9 +101632,9 @@ diff -Nur linux-3.18.6/drivers/usb/host/dwc_otg/dwc_otg_hcd_ddma.c linux-rpi/dri
+}
+
+#endif /* DWC_DEVICE_ONLY */
-diff -Nur linux-3.18.6/drivers/usb/host/dwc_otg/dwc_otg_hcd.h linux-rpi/drivers/usb/host/dwc_otg/dwc_otg_hcd.h
---- linux-3.18.6/drivers/usb/host/dwc_otg/dwc_otg_hcd.h 1970-01-01 01:00:00.000000000 +0100
-+++ linux-rpi/drivers/usb/host/dwc_otg/dwc_otg_hcd.h 2015-02-09 04:40:29.000000000 +0100
+diff -Nur linux-3.18.8/drivers/usb/host/dwc_otg/dwc_otg_hcd.h linux-rpi/drivers/usb/host/dwc_otg/dwc_otg_hcd.h
+--- linux-3.18.8/drivers/usb/host/dwc_otg/dwc_otg_hcd.h 1970-01-01 01:00:00.000000000 +0100
++++ linux-rpi/drivers/usb/host/dwc_otg/dwc_otg_hcd.h 2015-03-05 14:40:16.557715806 +0100
@@ -0,0 +1,862 @@
+/* ==========================================================================
+ * $File: //dwh/usb_iip/dev/software/otg/linux/drivers/dwc_otg_hcd.h $
@@ -91603,9 +102498,9 @@ diff -Nur linux-3.18.6/drivers/usb/host/dwc_otg/dwc_otg_hcd.h linux-rpi/drivers/
+#endif
+#endif
+#endif /* DWC_DEVICE_ONLY */
-diff -Nur linux-3.18.6/drivers/usb/host/dwc_otg/dwc_otg_hcd_if.h linux-rpi/drivers/usb/host/dwc_otg/dwc_otg_hcd_if.h
---- linux-3.18.6/drivers/usb/host/dwc_otg/dwc_otg_hcd_if.h 1970-01-01 01:00:00.000000000 +0100
-+++ linux-rpi/drivers/usb/host/dwc_otg/dwc_otg_hcd_if.h 2015-02-09 04:40:29.000000000 +0100
+diff -Nur linux-3.18.8/drivers/usb/host/dwc_otg/dwc_otg_hcd_if.h linux-rpi/drivers/usb/host/dwc_otg/dwc_otg_hcd_if.h
+--- linux-3.18.8/drivers/usb/host/dwc_otg/dwc_otg_hcd_if.h 1970-01-01 01:00:00.000000000 +0100
++++ linux-rpi/drivers/usb/host/dwc_otg/dwc_otg_hcd_if.h 2015-03-05 14:40:16.561715806 +0100
@@ -0,0 +1,417 @@
+/* ==========================================================================
+ * $File: //dwh/usb_iip/dev/software/otg/linux/drivers/dwc_otg_hcd_if.h $
@@ -92024,10 +102919,10 @@ diff -Nur linux-3.18.6/drivers/usb/host/dwc_otg/dwc_otg_hcd_if.h linux-rpi/drive
+
+#endif /* __DWC_HCD_IF_H__ */
+#endif /* DWC_DEVICE_ONLY */
-diff -Nur linux-3.18.6/drivers/usb/host/dwc_otg/dwc_otg_hcd_intr.c linux-rpi/drivers/usb/host/dwc_otg/dwc_otg_hcd_intr.c
---- linux-3.18.6/drivers/usb/host/dwc_otg/dwc_otg_hcd_intr.c 1970-01-01 01:00:00.000000000 +0100
-+++ linux-rpi/drivers/usb/host/dwc_otg/dwc_otg_hcd_intr.c 2015-02-09 04:40:29.000000000 +0100
-@@ -0,0 +1,2719 @@
+diff -Nur linux-3.18.8/drivers/usb/host/dwc_otg/dwc_otg_hcd_intr.c linux-rpi/drivers/usb/host/dwc_otg/dwc_otg_hcd_intr.c
+--- linux-3.18.8/drivers/usb/host/dwc_otg/dwc_otg_hcd_intr.c 1970-01-01 01:00:00.000000000 +0100
++++ linux-rpi/drivers/usb/host/dwc_otg/dwc_otg_hcd_intr.c 2015-03-05 14:40:16.561715806 +0100
+@@ -0,0 +1,2713 @@
+/* ==========================================================================
+ * $File: //dwh/usb_iip/dev/software/otg/linux/drivers/dwc_otg_hcd_intr.c $
+ * $Revision: #89 $
@@ -94387,7 +105282,7 @@ diff -Nur linux-3.18.6/drivers/usb/host/dwc_otg/dwc_otg_hcd_intr.c linux-rpi/dri
+ * different from the normal (messy) path. This function and its friends handles
+ * channel cleanup and transaction completion from a FIQ transaction.
+ */
-+int32_t dwc_otg_hcd_handle_hc_fsm(dwc_otg_hcd_t *hcd, uint32_t num)
++void dwc_otg_hcd_handle_hc_fsm(dwc_otg_hcd_t *hcd, uint32_t num)
+{
+ struct fiq_channel_state *st = &hcd->fiq_state->channel[num];
+ dwc_hc_t *hc = hcd->hc_ptr_array[num];
@@ -94396,7 +105291,6 @@ diff -Nur linux-3.18.6/drivers/usb/host/dwc_otg/dwc_otg_hcd_intr.c linux-rpi/dri
+ dwc_otg_hc_regs_t *hc_regs = hcd->core_if->host_if->hc_regs[num];
+ hcint_data_t hcint = hcd->fiq_state->channel[num].hcint_copy;
+ int hostchannels = 0;
-+ int ret = 0;
+ fiq_print(FIQDBG_INT, hcd->fiq_state, "OUT %01d %01d ", num , st->fsm);
+
+ hostchannels = hcd->available_host_channels;
@@ -94410,7 +105304,6 @@ diff -Nur linux-3.18.6/drivers/usb/host/dwc_otg/dwc_otg_hcd_intr.c linux-rpi/dri
+ * CLEAR_TT_BUFFER hub command if we were in the start-split phase.
+ */
+ release_channel(hcd, hc, NULL, hc->halt_status);
-+ ret = 1;
+ break;
+
+ case FIQ_NP_SPLIT_DONE:
@@ -94423,7 +105316,6 @@ diff -Nur linux-3.18.6/drivers/usb/host/dwc_otg/dwc_otg_hcd_intr.c linux-rpi/dri
+ } else if (hcint.b.nak) {
+ handle_hc_nak_intr(hcd, hc, hc_regs, qtd);
+ }
-+ ret = 1;
+ break;
+
+ case FIQ_NP_SPLIT_HS_ABORTED:
@@ -94634,15 +105526,12 @@ diff -Nur linux-3.18.6/drivers/usb/host/dwc_otg/dwc_otg_hcd_intr.c linux-rpi/dri
+ break;
+
+ default:
-+ local_fiq_disable();
-+ DWC_WARN("unexpected state received on hc=%d fsm=%d", hc->hc_num, st->fsm);
-+ BUG();
++ DWC_WARN("Unexpected state received on hc=%d fsm=%d on transfer to device %d ep 0x%x",
++ hc->hc_num, st->fsm, hc->dev_addr, hc->ep_num);
++ qtd->error_count++;
++ release_channel(hcd, hc, qtd, DWC_OTG_HC_XFER_NO_HALT_STATUS);
+ }
-+ //if (hostchannels != hcd->available_host_channels) {
-+ /* should have incremented by now! */
-+ // BUG();
-+// }
-+ return ret;
++ return;
+}
+
+/** Handles interrupt for a specific Host Channel */
@@ -94747,9 +105636,9 @@ diff -Nur linux-3.18.6/drivers/usb/host/dwc_otg/dwc_otg_hcd_intr.c linux-rpi/dri
+ return retval;
+}
+#endif /* DWC_DEVICE_ONLY */
-diff -Nur linux-3.18.6/drivers/usb/host/dwc_otg/dwc_otg_hcd_linux.c linux-rpi/drivers/usb/host/dwc_otg/dwc_otg_hcd_linux.c
---- linux-3.18.6/drivers/usb/host/dwc_otg/dwc_otg_hcd_linux.c 1970-01-01 01:00:00.000000000 +0100
-+++ linux-rpi/drivers/usb/host/dwc_otg/dwc_otg_hcd_linux.c 2015-02-09 04:40:29.000000000 +0100
+diff -Nur linux-3.18.8/drivers/usb/host/dwc_otg/dwc_otg_hcd_linux.c linux-rpi/drivers/usb/host/dwc_otg/dwc_otg_hcd_linux.c
+--- linux-3.18.8/drivers/usb/host/dwc_otg/dwc_otg_hcd_linux.c 1970-01-01 01:00:00.000000000 +0100
++++ linux-rpi/drivers/usb/host/dwc_otg/dwc_otg_hcd_linux.c 2015-03-05 14:40:16.561715806 +0100
@@ -0,0 +1,994 @@
+
+/* ==========================================================================
@@ -95745,9 +106634,9 @@ diff -Nur linux-3.18.6/drivers/usb/host/dwc_otg/dwc_otg_hcd_linux.c linux-rpi/dr
+}
+
+#endif /* DWC_DEVICE_ONLY */
-diff -Nur linux-3.18.6/drivers/usb/host/dwc_otg/dwc_otg_hcd_queue.c linux-rpi/drivers/usb/host/dwc_otg/dwc_otg_hcd_queue.c
---- linux-3.18.6/drivers/usb/host/dwc_otg/dwc_otg_hcd_queue.c 1970-01-01 01:00:00.000000000 +0100
-+++ linux-rpi/drivers/usb/host/dwc_otg/dwc_otg_hcd_queue.c 2015-02-09 04:40:29.000000000 +0100
+diff -Nur linux-3.18.8/drivers/usb/host/dwc_otg/dwc_otg_hcd_queue.c linux-rpi/drivers/usb/host/dwc_otg/dwc_otg_hcd_queue.c
+--- linux-3.18.8/drivers/usb/host/dwc_otg/dwc_otg_hcd_queue.c 1970-01-01 01:00:00.000000000 +0100
++++ linux-rpi/drivers/usb/host/dwc_otg/dwc_otg_hcd_queue.c 2015-03-05 14:40:16.561715806 +0100
@@ -0,0 +1,957 @@
+/* ==========================================================================
+ * $File: //dwh/usb_iip/dev/software/otg/linux/drivers/dwc_otg_hcd_queue.c $
@@ -96706,9 +107595,9 @@ diff -Nur linux-3.18.6/drivers/usb/host/dwc_otg/dwc_otg_hcd_queue.c linux-rpi/dr
+}
+
+#endif /* DWC_DEVICE_ONLY */
-diff -Nur linux-3.18.6/drivers/usb/host/dwc_otg/dwc_otg_os_dep.h linux-rpi/drivers/usb/host/dwc_otg/dwc_otg_os_dep.h
---- linux-3.18.6/drivers/usb/host/dwc_otg/dwc_otg_os_dep.h 1970-01-01 01:00:00.000000000 +0100
-+++ linux-rpi/drivers/usb/host/dwc_otg/dwc_otg_os_dep.h 2015-02-09 04:40:29.000000000 +0100
+diff -Nur linux-3.18.8/drivers/usb/host/dwc_otg/dwc_otg_os_dep.h linux-rpi/drivers/usb/host/dwc_otg/dwc_otg_os_dep.h
+--- linux-3.18.8/drivers/usb/host/dwc_otg/dwc_otg_os_dep.h 1970-01-01 01:00:00.000000000 +0100
++++ linux-rpi/drivers/usb/host/dwc_otg/dwc_otg_os_dep.h 2015-03-05 14:40:16.561715806 +0100
@@ -0,0 +1,188 @@
+#ifndef _DWC_OS_DEP_H_
+#define _DWC_OS_DEP_H_
@@ -96898,9 +107787,9 @@ diff -Nur linux-3.18.6/drivers/usb/host/dwc_otg/dwc_otg_os_dep.h linux-rpi/drive
+
+
+#endif /* _DWC_OS_DEP_H_ */
-diff -Nur linux-3.18.6/drivers/usb/host/dwc_otg/dwc_otg_pcd.c linux-rpi/drivers/usb/host/dwc_otg/dwc_otg_pcd.c
---- linux-3.18.6/drivers/usb/host/dwc_otg/dwc_otg_pcd.c 1970-01-01 01:00:00.000000000 +0100
-+++ linux-rpi/drivers/usb/host/dwc_otg/dwc_otg_pcd.c 2015-02-09 04:40:29.000000000 +0100
+diff -Nur linux-3.18.8/drivers/usb/host/dwc_otg/dwc_otg_pcd.c linux-rpi/drivers/usb/host/dwc_otg/dwc_otg_pcd.c
+--- linux-3.18.8/drivers/usb/host/dwc_otg/dwc_otg_pcd.c 1970-01-01 01:00:00.000000000 +0100
++++ linux-rpi/drivers/usb/host/dwc_otg/dwc_otg_pcd.c 2015-03-05 14:40:16.561715806 +0100
@@ -0,0 +1,2712 @@
+/* ==========================================================================
+ * $File: //dwh/usb_iip/dev/software/otg/linux/drivers/dwc_otg_pcd.c $
@@ -99614,9 +110503,9 @@ diff -Nur linux-3.18.6/drivers/usb/host/dwc_otg/dwc_otg_pcd.c linux-rpi/drivers/
+}
+
+#endif /* DWC_HOST_ONLY */
-diff -Nur linux-3.18.6/drivers/usb/host/dwc_otg/dwc_otg_pcd.h linux-rpi/drivers/usb/host/dwc_otg/dwc_otg_pcd.h
---- linux-3.18.6/drivers/usb/host/dwc_otg/dwc_otg_pcd.h 1970-01-01 01:00:00.000000000 +0100
-+++ linux-rpi/drivers/usb/host/dwc_otg/dwc_otg_pcd.h 2015-02-09 04:40:29.000000000 +0100
+diff -Nur linux-3.18.8/drivers/usb/host/dwc_otg/dwc_otg_pcd.h linux-rpi/drivers/usb/host/dwc_otg/dwc_otg_pcd.h
+--- linux-3.18.8/drivers/usb/host/dwc_otg/dwc_otg_pcd.h 1970-01-01 01:00:00.000000000 +0100
++++ linux-rpi/drivers/usb/host/dwc_otg/dwc_otg_pcd.h 2015-03-05 14:40:16.561715806 +0100
@@ -0,0 +1,266 @@
+/* ==========================================================================
+ * $File: //dwh/usb_iip/dev/software/otg/linux/drivers/dwc_otg_pcd.h $
@@ -99884,9 +110773,9 @@ diff -Nur linux-3.18.6/drivers/usb/host/dwc_otg/dwc_otg_pcd.h linux-rpi/drivers/
+extern void do_test_mode(void *data);
+#endif
+#endif /* DWC_HOST_ONLY */
-diff -Nur linux-3.18.6/drivers/usb/host/dwc_otg/dwc_otg_pcd_if.h linux-rpi/drivers/usb/host/dwc_otg/dwc_otg_pcd_if.h
---- linux-3.18.6/drivers/usb/host/dwc_otg/dwc_otg_pcd_if.h 1970-01-01 01:00:00.000000000 +0100
-+++ linux-rpi/drivers/usb/host/dwc_otg/dwc_otg_pcd_if.h 2015-02-09 04:40:29.000000000 +0100
+diff -Nur linux-3.18.8/drivers/usb/host/dwc_otg/dwc_otg_pcd_if.h linux-rpi/drivers/usb/host/dwc_otg/dwc_otg_pcd_if.h
+--- linux-3.18.8/drivers/usb/host/dwc_otg/dwc_otg_pcd_if.h 1970-01-01 01:00:00.000000000 +0100
++++ linux-rpi/drivers/usb/host/dwc_otg/dwc_otg_pcd_if.h 2015-03-05 14:40:16.561715806 +0100
@@ -0,0 +1,360 @@
+/* ==========================================================================
+ * $File: //dwh/usb_iip/dev/software/otg/linux/drivers/dwc_otg_pcd_if.h $
@@ -100248,9 +111137,9 @@ diff -Nur linux-3.18.6/drivers/usb/host/dwc_otg/dwc_otg_pcd_if.h linux-rpi/drive
+#endif /* __DWC_PCD_IF_H__ */
+
+#endif /* DWC_HOST_ONLY */
-diff -Nur linux-3.18.6/drivers/usb/host/dwc_otg/dwc_otg_pcd_intr.c linux-rpi/drivers/usb/host/dwc_otg/dwc_otg_pcd_intr.c
---- linux-3.18.6/drivers/usb/host/dwc_otg/dwc_otg_pcd_intr.c 1970-01-01 01:00:00.000000000 +0100
-+++ linux-rpi/drivers/usb/host/dwc_otg/dwc_otg_pcd_intr.c 2015-02-09 04:40:29.000000000 +0100
+diff -Nur linux-3.18.8/drivers/usb/host/dwc_otg/dwc_otg_pcd_intr.c linux-rpi/drivers/usb/host/dwc_otg/dwc_otg_pcd_intr.c
+--- linux-3.18.8/drivers/usb/host/dwc_otg/dwc_otg_pcd_intr.c 1970-01-01 01:00:00.000000000 +0100
++++ linux-rpi/drivers/usb/host/dwc_otg/dwc_otg_pcd_intr.c 2015-03-05 14:40:16.561715806 +0100
@@ -0,0 +1,5147 @@
+/* ==========================================================================
+ * $File: //dwh/usb_iip/dev/software/otg/linux/drivers/dwc_otg_pcd_intr.c $
@@ -105399,9 +116288,9 @@ diff -Nur linux-3.18.6/drivers/usb/host/dwc_otg/dwc_otg_pcd_intr.c linux-rpi/dri
+}
+
+#endif /* DWC_HOST_ONLY */
-diff -Nur linux-3.18.6/drivers/usb/host/dwc_otg/dwc_otg_pcd_linux.c linux-rpi/drivers/usb/host/dwc_otg/dwc_otg_pcd_linux.c
---- linux-3.18.6/drivers/usb/host/dwc_otg/dwc_otg_pcd_linux.c 1970-01-01 01:00:00.000000000 +0100
-+++ linux-rpi/drivers/usb/host/dwc_otg/dwc_otg_pcd_linux.c 2015-02-09 04:40:29.000000000 +0100
+diff -Nur linux-3.18.8/drivers/usb/host/dwc_otg/dwc_otg_pcd_linux.c linux-rpi/drivers/usb/host/dwc_otg/dwc_otg_pcd_linux.c
+--- linux-3.18.8/drivers/usb/host/dwc_otg/dwc_otg_pcd_linux.c 1970-01-01 01:00:00.000000000 +0100
++++ linux-rpi/drivers/usb/host/dwc_otg/dwc_otg_pcd_linux.c 2015-03-05 14:40:16.561715806 +0100
@@ -0,0 +1,1360 @@
+ /* ==========================================================================
+ * $File: //dwh/usb_iip/dev/software/otg/linux/drivers/dwc_otg_pcd_linux.c $
@@ -106763,9 +117652,9 @@ diff -Nur linux-3.18.6/drivers/usb/host/dwc_otg/dwc_otg_pcd_linux.c linux-rpi/dr
+EXPORT_SYMBOL(usb_gadget_unregister_driver);
+
+#endif /* DWC_HOST_ONLY */
-diff -Nur linux-3.18.6/drivers/usb/host/dwc_otg/dwc_otg_regs.h linux-rpi/drivers/usb/host/dwc_otg/dwc_otg_regs.h
---- linux-3.18.6/drivers/usb/host/dwc_otg/dwc_otg_regs.h 1970-01-01 01:00:00.000000000 +0100
-+++ linux-rpi/drivers/usb/host/dwc_otg/dwc_otg_regs.h 2015-02-09 04:40:29.000000000 +0100
+diff -Nur linux-3.18.8/drivers/usb/host/dwc_otg/dwc_otg_regs.h linux-rpi/drivers/usb/host/dwc_otg/dwc_otg_regs.h
+--- linux-3.18.8/drivers/usb/host/dwc_otg/dwc_otg_regs.h 1970-01-01 01:00:00.000000000 +0100
++++ linux-rpi/drivers/usb/host/dwc_otg/dwc_otg_regs.h 2015-03-05 14:40:16.561715806 +0100
@@ -0,0 +1,2550 @@
+/* ==========================================================================
+ * $File: //dwh/usb_iip/dev/software/otg/linux/drivers/dwc_otg_regs.h $
@@ -109317,9 +120206,9 @@ diff -Nur linux-3.18.6/drivers/usb/host/dwc_otg/dwc_otg_regs.h linux-rpi/drivers
+} gpwrdn_data_t;
+
+#endif
-diff -Nur linux-3.18.6/drivers/usb/host/dwc_otg/Makefile linux-rpi/drivers/usb/host/dwc_otg/Makefile
---- linux-3.18.6/drivers/usb/host/dwc_otg/Makefile 1970-01-01 01:00:00.000000000 +0100
-+++ linux-rpi/drivers/usb/host/dwc_otg/Makefile 2015-02-09 04:40:28.000000000 +0100
+diff -Nur linux-3.18.8/drivers/usb/host/dwc_otg/Makefile linux-rpi/drivers/usb/host/dwc_otg/Makefile
+--- linux-3.18.8/drivers/usb/host/dwc_otg/Makefile 1970-01-01 01:00:00.000000000 +0100
++++ linux-rpi/drivers/usb/host/dwc_otg/Makefile 2015-03-05 14:40:16.557715806 +0100
@@ -0,0 +1,82 @@
+#
+# Makefile for DWC_otg Highspeed USB controller driver
@@ -109403,9 +120292,9 @@ diff -Nur linux-3.18.6/drivers/usb/host/dwc_otg/Makefile linux-rpi/drivers/usb/h
+ rm -rf *.o *.ko .*cmd *.mod.c .tmp_versions Module.symvers
+
+endif
-diff -Nur linux-3.18.6/drivers/usb/host/dwc_otg/test/dwc_otg_test.pm linux-rpi/drivers/usb/host/dwc_otg/test/dwc_otg_test.pm
---- linux-3.18.6/drivers/usb/host/dwc_otg/test/dwc_otg_test.pm 1970-01-01 01:00:00.000000000 +0100
-+++ linux-rpi/drivers/usb/host/dwc_otg/test/dwc_otg_test.pm 2015-02-09 04:40:29.000000000 +0100
+diff -Nur linux-3.18.8/drivers/usb/host/dwc_otg/test/dwc_otg_test.pm linux-rpi/drivers/usb/host/dwc_otg/test/dwc_otg_test.pm
+--- linux-3.18.8/drivers/usb/host/dwc_otg/test/dwc_otg_test.pm 1970-01-01 01:00:00.000000000 +0100
++++ linux-rpi/drivers/usb/host/dwc_otg/test/dwc_otg_test.pm 2015-03-05 14:40:16.561715806 +0100
@@ -0,0 +1,337 @@
+package dwc_otg_test;
+
@@ -109744,9 +120633,9 @@ diff -Nur linux-3.18.6/drivers/usb/host/dwc_otg/test/dwc_otg_test.pm linux-rpi/d
+);
+
+1;
-diff -Nur linux-3.18.6/drivers/usb/host/dwc_otg/test/Makefile linux-rpi/drivers/usb/host/dwc_otg/test/Makefile
---- linux-3.18.6/drivers/usb/host/dwc_otg/test/Makefile 1970-01-01 01:00:00.000000000 +0100
-+++ linux-rpi/drivers/usb/host/dwc_otg/test/Makefile 2015-02-09 04:40:29.000000000 +0100
+diff -Nur linux-3.18.8/drivers/usb/host/dwc_otg/test/Makefile linux-rpi/drivers/usb/host/dwc_otg/test/Makefile
+--- linux-3.18.8/drivers/usb/host/dwc_otg/test/Makefile 1970-01-01 01:00:00.000000000 +0100
++++ linux-rpi/drivers/usb/host/dwc_otg/test/Makefile 2015-03-05 14:40:16.561715806 +0100
@@ -0,0 +1,16 @@
+
+PERL=/usr/bin/perl
@@ -109764,9 +120653,9 @@ diff -Nur linux-3.18.6/drivers/usb/host/dwc_otg/test/Makefile linux-rpi/drivers/
+ else echo "=======> $$test, FAILED" ; \
+ fi \
+ done
-diff -Nur linux-3.18.6/drivers/usb/host/dwc_otg/test/test_mod_param.pl linux-rpi/drivers/usb/host/dwc_otg/test/test_mod_param.pl
---- linux-3.18.6/drivers/usb/host/dwc_otg/test/test_mod_param.pl 1970-01-01 01:00:00.000000000 +0100
-+++ linux-rpi/drivers/usb/host/dwc_otg/test/test_mod_param.pl 2015-02-09 04:40:29.000000000 +0100
+diff -Nur linux-3.18.8/drivers/usb/host/dwc_otg/test/test_mod_param.pl linux-rpi/drivers/usb/host/dwc_otg/test/test_mod_param.pl
+--- linux-3.18.8/drivers/usb/host/dwc_otg/test/test_mod_param.pl 1970-01-01 01:00:00.000000000 +0100
++++ linux-rpi/drivers/usb/host/dwc_otg/test/test_mod_param.pl 2015-03-05 14:40:16.561715806 +0100
@@ -0,0 +1,133 @@
+#!/usr/bin/perl -w
+#
@@ -109901,9 +120790,9 @@ diff -Nur linux-3.18.6/drivers/usb/host/dwc_otg/test/test_mod_param.pl linux-rpi
+
+test_main();
+0;
-diff -Nur linux-3.18.6/drivers/usb/host/dwc_otg/test/test_sysfs.pl linux-rpi/drivers/usb/host/dwc_otg/test/test_sysfs.pl
---- linux-3.18.6/drivers/usb/host/dwc_otg/test/test_sysfs.pl 1970-01-01 01:00:00.000000000 +0100
-+++ linux-rpi/drivers/usb/host/dwc_otg/test/test_sysfs.pl 2015-02-09 04:40:29.000000000 +0100
+diff -Nur linux-3.18.8/drivers/usb/host/dwc_otg/test/test_sysfs.pl linux-rpi/drivers/usb/host/dwc_otg/test/test_sysfs.pl
+--- linux-3.18.8/drivers/usb/host/dwc_otg/test/test_sysfs.pl 1970-01-01 01:00:00.000000000 +0100
++++ linux-rpi/drivers/usb/host/dwc_otg/test/test_sysfs.pl 2015-03-05 14:40:16.561715806 +0100
@@ -0,0 +1,193 @@
+#!/usr/bin/perl -w
+#
@@ -110098,9 +120987,9 @@ diff -Nur linux-3.18.6/drivers/usb/host/dwc_otg/test/test_sysfs.pl linux-rpi/dri
+
+test_main();
+0;
-diff -Nur linux-3.18.6/drivers/usb/host/Kconfig linux-rpi/drivers/usb/host/Kconfig
---- linux-3.18.6/drivers/usb/host/Kconfig 2015-02-06 15:53:48.000000000 +0100
-+++ linux-rpi/drivers/usb/host/Kconfig 2015-02-09 04:40:28.000000000 +0100
+diff -Nur linux-3.18.8/drivers/usb/host/Kconfig linux-rpi/drivers/usb/host/Kconfig
+--- linux-3.18.8/drivers/usb/host/Kconfig 2015-02-27 02:49:36.000000000 +0100
++++ linux-rpi/drivers/usb/host/Kconfig 2015-03-05 14:40:16.553715806 +0100
@@ -744,6 +744,19 @@
To compile this driver a module, choose M here: the module
will be called "hwa-hc".
@@ -110121,9 +121010,9 @@ diff -Nur linux-3.18.6/drivers/usb/host/Kconfig linux-rpi/drivers/usb/host/Kconf
config USB_IMX21_HCD
tristate "i.MX21 HCD support"
depends on ARM && ARCH_MXC
-diff -Nur linux-3.18.6/drivers/usb/host/Makefile linux-rpi/drivers/usb/host/Makefile
---- linux-3.18.6/drivers/usb/host/Makefile 2015-02-06 15:53:48.000000000 +0100
-+++ linux-rpi/drivers/usb/host/Makefile 2015-02-09 04:40:28.000000000 +0100
+diff -Nur linux-3.18.8/drivers/usb/host/Makefile linux-rpi/drivers/usb/host/Makefile
+--- linux-3.18.8/drivers/usb/host/Makefile 2015-02-27 02:49:36.000000000 +0100
++++ linux-rpi/drivers/usb/host/Makefile 2015-03-05 14:40:16.553715806 +0100
@@ -71,6 +71,8 @@
obj-$(CONFIG_USB_R8A66597_HCD) += r8a66597-hcd.o
obj-$(CONFIG_USB_ISP1760_HCD) += isp1760.o
@@ -110133,9 +121022,9 @@ diff -Nur linux-3.18.6/drivers/usb/host/Makefile linux-rpi/drivers/usb/host/Make
obj-$(CONFIG_USB_IMX21_HCD) += imx21-hcd.o
obj-$(CONFIG_USB_FSL_MPH_DR_OF) += fsl-mph-dr-of.o
obj-$(CONFIG_USB_OCTEON2_COMMON) += octeon2-common.o
-diff -Nur linux-3.18.6/drivers/usb/Makefile linux-rpi/drivers/usb/Makefile
---- linux-3.18.6/drivers/usb/Makefile 2015-02-06 15:53:48.000000000 +0100
-+++ linux-rpi/drivers/usb/Makefile 2015-02-09 04:40:28.000000000 +0100
+diff -Nur linux-3.18.8/drivers/usb/Makefile linux-rpi/drivers/usb/Makefile
+--- linux-3.18.8/drivers/usb/Makefile 2015-02-27 02:49:36.000000000 +0100
++++ linux-rpi/drivers/usb/Makefile 2015-03-05 14:40:16.525715806 +0100
@@ -24,6 +24,7 @@
obj-$(CONFIG_USB_R8A66597_HCD) += host/
obj-$(CONFIG_USB_HWA_HCD) += host/
@@ -110144,9 +121033,9 @@ diff -Nur linux-3.18.6/drivers/usb/Makefile linux-rpi/drivers/usb/Makefile
obj-$(CONFIG_USB_IMX21_HCD) += host/
obj-$(CONFIG_USB_FSL_MPH_DR_OF) += host/
obj-$(CONFIG_USB_FUSBH200_HCD) += host/
-diff -Nur linux-3.18.6/drivers/video/fbdev/bcm2708_fb.c linux-rpi/drivers/video/fbdev/bcm2708_fb.c
---- linux-3.18.6/drivers/video/fbdev/bcm2708_fb.c 1970-01-01 01:00:00.000000000 +0100
-+++ linux-rpi/drivers/video/fbdev/bcm2708_fb.c 2015-02-09 04:40:30.000000000 +0100
+diff -Nur linux-3.18.8/drivers/video/fbdev/bcm2708_fb.c linux-rpi/drivers/video/fbdev/bcm2708_fb.c
+--- linux-3.18.8/drivers/video/fbdev/bcm2708_fb.c 1970-01-01 01:00:00.000000000 +0100
++++ linux-rpi/drivers/video/fbdev/bcm2708_fb.c 2015-03-05 14:40:16.889715804 +0100
@@ -0,0 +1,818 @@
+/*
+ * linux/drivers/video/bcm2708_fb.c
@@ -110966,9 +121855,9 @@ diff -Nur linux-3.18.6/drivers/video/fbdev/bcm2708_fb.c linux-rpi/drivers/video/
+MODULE_PARM_DESC(fbheight, "Height of ARM Framebuffer");
+MODULE_PARM_DESC(fbdepth, "Bit depth of ARM Framebuffer");
+MODULE_PARM_DESC(fbswap, "Swap order of red and blue in 24 and 32 bit modes");
-diff -Nur linux-3.18.6/drivers/video/fbdev/core/cfbimgblt.c linux-rpi/drivers/video/fbdev/core/cfbimgblt.c
---- linux-3.18.6/drivers/video/fbdev/core/cfbimgblt.c 2015-02-06 15:53:48.000000000 +0100
-+++ linux-rpi/drivers/video/fbdev/core/cfbimgblt.c 2015-02-09 04:40:30.000000000 +0100
+diff -Nur linux-3.18.8/drivers/video/fbdev/core/cfbimgblt.c linux-rpi/drivers/video/fbdev/core/cfbimgblt.c
+--- linux-3.18.8/drivers/video/fbdev/core/cfbimgblt.c 2015-02-27 02:49:36.000000000 +0100
++++ linux-rpi/drivers/video/fbdev/core/cfbimgblt.c 2015-03-05 14:40:16.893715804 +0100
@@ -28,6 +28,11 @@
*
* Also need to add code to deal with cards endians that are different than
@@ -111142,9 +122031,9 @@ diff -Nur linux-3.18.6/drivers/video/fbdev/core/cfbimgblt.c linux-rpi/drivers/vi
slow_imageblit(image, p, dst1, fgcolor, bgcolor,
start_index, pitch_index);
} else
-diff -Nur linux-3.18.6/drivers/video/fbdev/core/fbmem.c linux-rpi/drivers/video/fbdev/core/fbmem.c
---- linux-3.18.6/drivers/video/fbdev/core/fbmem.c 2015-02-06 15:53:48.000000000 +0100
-+++ linux-rpi/drivers/video/fbdev/core/fbmem.c 2015-02-09 04:40:30.000000000 +0100
+diff -Nur linux-3.18.8/drivers/video/fbdev/core/fbmem.c linux-rpi/drivers/video/fbdev/core/fbmem.c
+--- linux-3.18.8/drivers/video/fbdev/core/fbmem.c 2015-02-27 02:49:36.000000000 +0100
++++ linux-rpi/drivers/video/fbdev/core/fbmem.c 2015-03-05 14:40:16.893715804 +0100
@@ -1084,6 +1084,25 @@
}
EXPORT_SYMBOL(fb_blank);
@@ -111203,9 +122092,9 @@ diff -Nur linux-3.18.6/drivers/video/fbdev/core/fbmem.c linux-rpi/drivers/video/
arg = (unsigned long) compat_ptr(arg);
case FBIOBLANK:
ret = do_fb_ioctl(info, cmd, arg);
-diff -Nur linux-3.18.6/drivers/video/fbdev/Kconfig linux-rpi/drivers/video/fbdev/Kconfig
---- linux-3.18.6/drivers/video/fbdev/Kconfig 2015-02-06 15:53:48.000000000 +0100
-+++ linux-rpi/drivers/video/fbdev/Kconfig 2015-02-09 04:40:30.000000000 +0100
+diff -Nur linux-3.18.8/drivers/video/fbdev/Kconfig linux-rpi/drivers/video/fbdev/Kconfig
+--- linux-3.18.8/drivers/video/fbdev/Kconfig 2015-02-27 02:49:36.000000000 +0100
++++ linux-rpi/drivers/video/fbdev/Kconfig 2015-03-05 14:40:16.885715804 +0100
@@ -224,6 +224,20 @@
comment "Frame buffer hardware drivers"
depends on FB
@@ -111227,9 +122116,9 @@ diff -Nur linux-3.18.6/drivers/video/fbdev/Kconfig linux-rpi/drivers/video/fbdev
config FB_GRVGA
tristate "Aeroflex Gaisler framebuffer support"
depends on FB && SPARC
-diff -Nur linux-3.18.6/drivers/video/fbdev/Makefile linux-rpi/drivers/video/fbdev/Makefile
---- linux-3.18.6/drivers/video/fbdev/Makefile 2015-02-06 15:53:48.000000000 +0100
-+++ linux-rpi/drivers/video/fbdev/Makefile 2015-02-09 04:40:30.000000000 +0100
+diff -Nur linux-3.18.8/drivers/video/fbdev/Makefile linux-rpi/drivers/video/fbdev/Makefile
+--- linux-3.18.8/drivers/video/fbdev/Makefile 2015-02-27 02:49:36.000000000 +0100
++++ linux-rpi/drivers/video/fbdev/Makefile 2015-03-05 14:40:16.885715804 +0100
@@ -12,6 +12,7 @@
obj-$(CONFIG_FB_WMT_GE_ROPS) += wmt_ge_rops.o
@@ -111238,9 +122127,9 @@ diff -Nur linux-3.18.6/drivers/video/fbdev/Makefile linux-rpi/drivers/video/fbde
obj-$(CONFIG_FB_AMIGA) += amifb.o c2p_planar.o
obj-$(CONFIG_FB_ARC) += arcfb.o
obj-$(CONFIG_FB_CLPS711X) += clps711x-fb.o
-diff -Nur linux-3.18.6/drivers/video/logo/logo_linux_clut224.ppm linux-rpi/drivers/video/logo/logo_linux_clut224.ppm
---- linux-3.18.6/drivers/video/logo/logo_linux_clut224.ppm 2015-02-06 15:53:48.000000000 +0100
-+++ linux-rpi/drivers/video/logo/logo_linux_clut224.ppm 2015-02-09 04:40:31.000000000 +0100
+diff -Nur linux-3.18.8/drivers/video/logo/logo_linux_clut224.ppm linux-rpi/drivers/video/logo/logo_linux_clut224.ppm
+--- linux-3.18.8/drivers/video/logo/logo_linux_clut224.ppm 2015-02-27 02:49:36.000000000 +0100
++++ linux-rpi/drivers/video/logo/logo_linux_clut224.ppm 2015-03-05 14:40:16.933715804 +0100
@@ -1,1604 +1,883 @@
P3
-# Standard 224-color Linux logo
@@ -113727,9 +124616,9 @@ diff -Nur linux-3.18.6/drivers/video/logo/logo_linux_clut224.ppm linux-rpi/drive
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+0 0 0 0 0 0 0 0 0
-diff -Nur linux-3.18.6/drivers/w1/masters/w1-gpio.c linux-rpi/drivers/w1/masters/w1-gpio.c
---- linux-3.18.6/drivers/w1/masters/w1-gpio.c 2015-02-06 15:53:48.000000000 +0100
-+++ linux-rpi/drivers/w1/masters/w1-gpio.c 2015-02-09 04:40:31.000000000 +0100
+diff -Nur linux-3.18.8/drivers/w1/masters/w1-gpio.c linux-rpi/drivers/w1/masters/w1-gpio.c
+--- linux-3.18.8/drivers/w1/masters/w1-gpio.c 2015-02-27 02:49:36.000000000 +0100
++++ linux-rpi/drivers/w1/masters/w1-gpio.c 2015-03-05 14:40:16.941715804 +0100
@@ -23,6 +23,19 @@
#include "../w1.h"
#include "../w1_int.h"
@@ -113864,9 +124753,9 @@ diff -Nur linux-3.18.6/drivers/w1/masters/w1-gpio.c linux-rpi/drivers/w1/masters
return 0;
}
-diff -Nur linux-3.18.6/drivers/w1/w1.h linux-rpi/drivers/w1/w1.h
---- linux-3.18.6/drivers/w1/w1.h 2015-02-06 15:53:48.000000000 +0100
-+++ linux-rpi/drivers/w1/w1.h 2015-02-09 04:40:31.000000000 +0100
+diff -Nur linux-3.18.8/drivers/w1/w1.h linux-rpi/drivers/w1/w1.h
+--- linux-3.18.8/drivers/w1/w1.h 2015-02-27 02:49:36.000000000 +0100
++++ linux-rpi/drivers/w1/w1.h 2015-03-05 14:40:16.945715804 +0100
@@ -171,6 +171,12 @@
u8 (*set_pullup)(void *, int);
@@ -113880,9 +124769,9 @@ diff -Nur linux-3.18.6/drivers/w1/w1.h linux-rpi/drivers/w1/w1.h
void (*search)(void *, struct w1_master *,
u8, w1_slave_found_callback);
};
-diff -Nur linux-3.18.6/drivers/w1/w1_int.c linux-rpi/drivers/w1/w1_int.c
---- linux-3.18.6/drivers/w1/w1_int.c 2015-02-06 15:53:48.000000000 +0100
-+++ linux-rpi/drivers/w1/w1_int.c 2015-02-09 04:40:31.000000000 +0100
+diff -Nur linux-3.18.8/drivers/w1/w1_int.c linux-rpi/drivers/w1/w1_int.c
+--- linux-3.18.8/drivers/w1/w1_int.c 2015-02-27 02:49:36.000000000 +0100
++++ linux-rpi/drivers/w1/w1_int.c 2015-03-05 14:40:16.945715804 +0100
@@ -123,6 +123,20 @@
return(-EINVAL);
}
@@ -113904,9 +124793,9 @@ diff -Nur linux-3.18.6/drivers/w1/w1_int.c linux-rpi/drivers/w1/w1_int.c
/* Lock until the device is added (or not) to w1_masters. */
mutex_lock(&w1_mlock);
/* Search for the first available id (starting at 1). */
-diff -Nur linux-3.18.6/drivers/w1/w1_io.c linux-rpi/drivers/w1/w1_io.c
---- linux-3.18.6/drivers/w1/w1_io.c 2015-02-06 15:53:48.000000000 +0100
-+++ linux-rpi/drivers/w1/w1_io.c 2015-02-09 04:40:31.000000000 +0100
+diff -Nur linux-3.18.8/drivers/w1/w1_io.c linux-rpi/drivers/w1/w1_io.c
+--- linux-3.18.8/drivers/w1/w1_io.c 2015-02-27 02:49:36.000000000 +0100
++++ linux-rpi/drivers/w1/w1_io.c 2015-03-05 14:40:16.945715804 +0100
@@ -134,10 +134,22 @@
static void w1_post_write(struct w1_master *dev)
{
@@ -113933,9 +124822,9 @@ diff -Nur linux-3.18.6/drivers/w1/w1_io.c linux-rpi/drivers/w1/w1_io.c
dev->pullup_duration = 0;
}
}
-diff -Nur linux-3.18.6/drivers/watchdog/bcm2708_wdog.c linux-rpi/drivers/watchdog/bcm2708_wdog.c
---- linux-3.18.6/drivers/watchdog/bcm2708_wdog.c 1970-01-01 01:00:00.000000000 +0100
-+++ linux-rpi/drivers/watchdog/bcm2708_wdog.c 2015-02-09 04:40:31.000000000 +0100
+diff -Nur linux-3.18.8/drivers/watchdog/bcm2708_wdog.c linux-rpi/drivers/watchdog/bcm2708_wdog.c
+--- linux-3.18.8/drivers/watchdog/bcm2708_wdog.c 1970-01-01 01:00:00.000000000 +0100
++++ linux-rpi/drivers/watchdog/bcm2708_wdog.c 2015-03-05 14:40:17.125715803 +0100
@@ -0,0 +1,382 @@
+/*
+ * Broadcom BCM2708 watchdog driver.
@@ -114319,9 +125208,9 @@ diff -Nur linux-3.18.6/drivers/watchdog/bcm2708_wdog.c linux-rpi/drivers/watchdo
+MODULE_ALIAS_MISCDEV(WATCHDOG_MINOR);
+MODULE_ALIAS_MISCDEV(TEMP_MINOR);
+MODULE_LICENSE("GPL");
-diff -Nur linux-3.18.6/drivers/watchdog/Kconfig linux-rpi/drivers/watchdog/Kconfig
---- linux-3.18.6/drivers/watchdog/Kconfig 2015-02-06 15:53:48.000000000 +0100
-+++ linux-rpi/drivers/watchdog/Kconfig 2015-02-09 04:40:31.000000000 +0100
+diff -Nur linux-3.18.8/drivers/watchdog/Kconfig linux-rpi/drivers/watchdog/Kconfig
+--- linux-3.18.8/drivers/watchdog/Kconfig 2015-02-27 02:49:36.000000000 +0100
++++ linux-rpi/drivers/watchdog/Kconfig 2015-03-05 14:40:16.945715804 +0100
@@ -452,6 +452,12 @@
To compile this driver as a module, choose M here: the
module will be called retu_wdt.
@@ -114335,9 +125224,9 @@ diff -Nur linux-3.18.6/drivers/watchdog/Kconfig linux-rpi/drivers/watchdog/Kconf
config MOXART_WDT
tristate "MOXART watchdog"
depends on ARCH_MOXART
-diff -Nur linux-3.18.6/drivers/watchdog/Makefile linux-rpi/drivers/watchdog/Makefile
---- linux-3.18.6/drivers/watchdog/Makefile 2015-02-06 15:53:48.000000000 +0100
-+++ linux-rpi/drivers/watchdog/Makefile 2015-02-09 04:40:31.000000000 +0100
+diff -Nur linux-3.18.8/drivers/watchdog/Makefile linux-rpi/drivers/watchdog/Makefile
+--- linux-3.18.8/drivers/watchdog/Makefile 2015-02-27 02:49:36.000000000 +0100
++++ linux-rpi/drivers/watchdog/Makefile 2015-03-05 14:40:16.945715804 +0100
@@ -56,6 +56,7 @@
obj-$(CONFIG_IMX2_WDT) += imx2_wdt.o
obj-$(CONFIG_UX500_WATCHDOG) += ux500_wdt.o
@@ -114346,9 +125235,630 @@ diff -Nur linux-3.18.6/drivers/watchdog/Makefile linux-rpi/drivers/watchdog/Make
obj-$(CONFIG_BCM2835_WDT) += bcm2835_wdt.o
obj-$(CONFIG_MOXART_WDT) += moxart_wdt.o
obj-$(CONFIG_SIRFSOC_WATCHDOG) += sirfsoc_wdt.o
-diff -Nur linux-3.18.6/include/linux/broadcom/vc_cma.h linux-rpi/include/linux/broadcom/vc_cma.h
---- linux-3.18.6/include/linux/broadcom/vc_cma.h 1970-01-01 01:00:00.000000000 +0100
-+++ linux-rpi/include/linux/broadcom/vc_cma.h 2015-02-09 04:40:45.000000000 +0100
+diff -Nur linux-3.18.8/.git/config linux-rpi/.git/config
+--- linux-3.18.8/.git/config 1970-01-01 01:00:00.000000000 +0100
++++ linux-rpi/.git/config 2015-03-05 14:40:10.485715843 +0100
+@@ -0,0 +1,12 @@
++[core]
++ repositoryformatversion = 0
++ filemode = true
++ bare = false
++ logallrefupdates = true
++[remote "origin"]
++ url = https://github.com/raspberrypi/linux.git
++ fetch = +refs/heads/*:refs/remotes/origin/*
++[branch "rpi-3.18.y"]
++ remote = origin
++ merge = refs/heads/rpi-3.18.y
++ rebase = true
+diff -Nur linux-3.18.8/.git/description linux-rpi/.git/description
+--- linux-3.18.8/.git/description 1970-01-01 01:00:00.000000000 +0100
++++ linux-rpi/.git/description 2015-03-05 14:30:30.653719385 +0100
+@@ -0,0 +1 @@
++Unnamed repository; edit this file 'description' to name the repository.
+diff -Nur linux-3.18.8/.git/HEAD linux-rpi/.git/HEAD
+--- linux-3.18.8/.git/HEAD 1970-01-01 01:00:00.000000000 +0100
++++ linux-rpi/.git/HEAD 2015-03-05 14:40:10.453715844 +0100
+@@ -0,0 +1 @@
++ref: refs/heads/rpi-3.18.y
+diff -Nur linux-3.18.8/.git/hooks/applypatch-msg.sample linux-rpi/.git/hooks/applypatch-msg.sample
+--- linux-3.18.8/.git/hooks/applypatch-msg.sample 1970-01-01 01:00:00.000000000 +0100
++++ linux-rpi/.git/hooks/applypatch-msg.sample 2015-03-05 14:30:30.665719385 +0100
+@@ -0,0 +1,15 @@
++#!/bin/sh
++#
++# An example hook script to check the commit log message taken by
++# applypatch from an e-mail message.
++#
++# The hook should exit with non-zero status after issuing an
++# appropriate message if it wants to stop the commit. The hook is
++# allowed to edit the commit message file.
++#
++# To enable this hook, rename this file to "applypatch-msg".
++
++. git-sh-setup
++test -x "$GIT_DIR/hooks/commit-msg" &&
++ exec "$GIT_DIR/hooks/commit-msg" ${1+"$@"}
++:
+diff -Nur linux-3.18.8/.git/hooks/commit-msg.sample linux-rpi/.git/hooks/commit-msg.sample
+--- linux-3.18.8/.git/hooks/commit-msg.sample 1970-01-01 01:00:00.000000000 +0100
++++ linux-rpi/.git/hooks/commit-msg.sample 2015-03-05 14:30:30.661719385 +0100
+@@ -0,0 +1,24 @@
++#!/bin/sh
++#
++# An example hook script to check the commit log message.
++# Called by "git commit" with one argument, the name of the file
++# that has the commit message. The hook should exit with non-zero
++# status after issuing an appropriate message if it wants to stop the
++# commit. The hook is allowed to edit the commit message file.
++#
++# To enable this hook, rename this file to "commit-msg".
++
++# Uncomment the below to add a Signed-off-by line to the message.
++# Doing this in a hook is a bad idea in general, but the prepare-commit-msg
++# hook is more suited to it.
++#
++# SOB=$(git var GIT_AUTHOR_IDENT | sed -n 's/^\(.*>\).*$/Signed-off-by: \1/p')
++# grep -qs "^$SOB" "$1" || echo "$SOB" >> "$1"
++
++# This example catches duplicate Signed-off-by lines.
++
++test "" = "$(grep '^Signed-off-by: ' "$1" |
++ sort | uniq -c | sed -e '/^[ ]*1[ ]/d')" || {
++ echo >&2 Duplicate Signed-off-by lines.
++ exit 1
++}
+diff -Nur linux-3.18.8/.git/hooks/post-update.sample linux-rpi/.git/hooks/post-update.sample
+--- linux-3.18.8/.git/hooks/post-update.sample 1970-01-01 01:00:00.000000000 +0100
++++ linux-rpi/.git/hooks/post-update.sample 2015-03-05 14:30:30.665719385 +0100
+@@ -0,0 +1,8 @@
++#!/bin/sh
++#
++# An example hook script to prepare a packed repository for use over
++# dumb transports.
++#
++# To enable this hook, rename this file to "post-update".
++
++exec git update-server-info
+diff -Nur linux-3.18.8/.git/hooks/pre-applypatch.sample linux-rpi/.git/hooks/pre-applypatch.sample
+--- linux-3.18.8/.git/hooks/pre-applypatch.sample 1970-01-01 01:00:00.000000000 +0100
++++ linux-rpi/.git/hooks/pre-applypatch.sample 2015-03-05 14:30:30.661719385 +0100
+@@ -0,0 +1,14 @@
++#!/bin/sh
++#
++# An example hook script to verify what is about to be committed
++# by applypatch from an e-mail message.
++#
++# The hook should exit with non-zero status after issuing an
++# appropriate message if it wants to stop the commit.
++#
++# To enable this hook, rename this file to "pre-applypatch".
++
++. git-sh-setup
++test -x "$GIT_DIR/hooks/pre-commit" &&
++ exec "$GIT_DIR/hooks/pre-commit" ${1+"$@"}
++:
+diff -Nur linux-3.18.8/.git/hooks/pre-commit.sample linux-rpi/.git/hooks/pre-commit.sample
+--- linux-3.18.8/.git/hooks/pre-commit.sample 1970-01-01 01:00:00.000000000 +0100
++++ linux-rpi/.git/hooks/pre-commit.sample 2015-03-05 14:30:30.661719385 +0100
+@@ -0,0 +1,49 @@
++#!/bin/sh
++#
++# An example hook script to verify what is about to be committed.
++# Called by "git commit" with no arguments. The hook should
++# exit with non-zero status after issuing an appropriate message if
++# it wants to stop the commit.
++#
++# To enable this hook, rename this file to "pre-commit".
++
++if git rev-parse --verify HEAD >/dev/null 2>&1
++then
++ against=HEAD
++else
++ # Initial commit: diff against an empty tree object
++ against=4b825dc642cb6eb9a060e54bf8d69288fbee4904
++fi
++
++# If you want to allow non-ASCII filenames set this variable to true.
++allownonascii=$(git config --bool hooks.allownonascii)
++
++# Redirect output to stderr.
++exec 1>&2
++
++# Cross platform projects tend to avoid non-ASCII filenames; prevent
++# them from being added to the repository. We exploit the fact that the
++# printable range starts at the space character and ends with tilde.
++if [ "$allownonascii" != "true" ] &&
++ # Note that the use of brackets around a tr range is ok here, (it's
++ # even required, for portability to Solaris 10's /usr/bin/tr), since
++ # the square bracket bytes happen to fall in the designated range.
++ test $(git diff --cached --name-only --diff-filter=A -z $against |
++ LC_ALL=C tr -d '[ -~]\0' | wc -c) != 0
++then
++ cat <<\EOF
++Error: Attempt to add a non-ASCII file name.
++
++This can cause problems if you want to work with people on other platforms.
++
++To be portable it is advisable to rename the file.
++
++If you know what you are doing you can disable this check using:
++
++ git config hooks.allownonascii true
++EOF
++ exit 1
++fi
++
++# If there are whitespace errors, print the offending file names and fail.
++exec git diff-index --check --cached $against --
+diff -Nur linux-3.18.8/.git/hooks/prepare-commit-msg.sample linux-rpi/.git/hooks/prepare-commit-msg.sample
+--- linux-3.18.8/.git/hooks/prepare-commit-msg.sample 1970-01-01 01:00:00.000000000 +0100
++++ linux-rpi/.git/hooks/prepare-commit-msg.sample 2015-03-05 14:30:30.665719385 +0100
+@@ -0,0 +1,36 @@
++#!/bin/sh
++#
++# An example hook script to prepare the commit log message.
++# Called by "git commit" with the name of the file that has the
++# commit message, followed by the description of the commit
++# message's source. The hook's purpose is to edit the commit
++# message file. If the hook fails with a non-zero status,
++# the commit is aborted.
++#
++# To enable this hook, rename this file to "prepare-commit-msg".
++
++# This hook includes three examples. The first comments out the
++# "Conflicts:" part of a merge commit.
++#
++# The second includes the output of "git diff --name-status -r"
++# into the message, just before the "git status" output. It is
++# commented because it doesn't cope with --amend or with squashed
++# commits.
++#
++# The third example adds a Signed-off-by line to the message, that can
++# still be edited. This is rarely a good idea.
++
++case "$2,$3" in
++ merge,)
++ /usr/bin/perl -i.bak -ne 's/^/# /, s/^# #/#/ if /^Conflicts/ .. /#/; print' "$1" ;;
++
++# ,|template,)
++# /usr/bin/perl -i.bak -pe '
++# print "\n" . `git diff --cached --name-status -r`
++# if /^#/ && $first++ == 0' "$1" ;;
++
++ *) ;;
++esac
++
++# SOB=$(git var GIT_AUTHOR_IDENT | sed -n 's/^\(.*>\).*$/Signed-off-by: \1/p')
++# grep -qs "^$SOB" "$1" || echo "$SOB" >> "$1"
+diff -Nur linux-3.18.8/.git/hooks/pre-push.sample linux-rpi/.git/hooks/pre-push.sample
+--- linux-3.18.8/.git/hooks/pre-push.sample 1970-01-01 01:00:00.000000000 +0100
++++ linux-rpi/.git/hooks/pre-push.sample 2015-03-05 14:30:30.661719385 +0100
+@@ -0,0 +1,54 @@
++#!/bin/sh
++
++# An example hook script to verify what is about to be pushed. Called by "git
++# push" after it has checked the remote status, but before anything has been
++# pushed. If this script exits with a non-zero status nothing will be pushed.
++#
++# This hook is called with the following parameters:
++#
++# $1 -- Name of the remote to which the push is being done
++# $2 -- URL to which the push is being done
++#
++# If pushing without using a named remote those arguments will be equal.
++#
++# Information about the commits which are being pushed is supplied as lines to
++# the standard input in the form:
++#
++# <local ref> <local sha1> <remote ref> <remote sha1>
++#
++# This sample shows how to prevent push of commits where the log message starts
++# with "WIP" (work in progress).
++
++remote="$1"
++url="$2"
++
++z40=0000000000000000000000000000000000000000
++
++IFS=' '
++while read local_ref local_sha remote_ref remote_sha
++do
++ if [ "$local_sha" = $z40 ]
++ then
++ # Handle delete
++ :
++ else
++ if [ "$remote_sha" = $z40 ]
++ then
++ # New branch, examine all commits
++ range="$local_sha"
++ else
++ # Update to existing branch, examine new commits
++ range="$remote_sha..$local_sha"
++ fi
++
++ # Check for WIP commit
++ commit=`git rev-list -n 1 --grep '^WIP' "$range"`
++ if [ -n "$commit" ]
++ then
++ echo "Found WIP commit in $local_ref, not pushing"
++ exit 1
++ fi
++ fi
++done
++
++exit 0
+diff -Nur linux-3.18.8/.git/hooks/pre-rebase.sample linux-rpi/.git/hooks/pre-rebase.sample
+--- linux-3.18.8/.git/hooks/pre-rebase.sample 1970-01-01 01:00:00.000000000 +0100
++++ linux-rpi/.git/hooks/pre-rebase.sample 2015-03-05 14:30:30.661719385 +0100
+@@ -0,0 +1,169 @@
++#!/bin/sh
++#
++# Copyright (c) 2006, 2008 Junio C Hamano
++#
++# The "pre-rebase" hook is run just before "git rebase" starts doing
++# its job, and can prevent the command from running by exiting with
++# non-zero status.
++#
++# The hook is called with the following parameters:
++#
++# $1 -- the upstream the series was forked from.
++# $2 -- the branch being rebased (or empty when rebasing the current branch).
++#
++# This sample shows how to prevent topic branches that are already
++# merged to 'next' branch from getting rebased, because allowing it
++# would result in rebasing already published history.
++
++publish=next
++basebranch="$1"
++if test "$#" = 2
++then
++ topic="refs/heads/$2"
++else
++ topic=`git symbolic-ref HEAD` ||
++ exit 0 ;# we do not interrupt rebasing detached HEAD
++fi
++
++case "$topic" in
++refs/heads/??/*)
++ ;;
++*)
++ exit 0 ;# we do not interrupt others.
++ ;;
++esac
++
++# Now we are dealing with a topic branch being rebased
++# on top of master. Is it OK to rebase it?
++
++# Does the topic really exist?
++git show-ref -q "$topic" || {
++ echo >&2 "No such branch $topic"
++ exit 1
++}
++
++# Is topic fully merged to master?
++not_in_master=`git rev-list --pretty=oneline ^master "$topic"`
++if test -z "$not_in_master"
++then
++ echo >&2 "$topic is fully merged to master; better remove it."
++ exit 1 ;# we could allow it, but there is no point.
++fi
++
++# Is topic ever merged to next? If so you should not be rebasing it.
++only_next_1=`git rev-list ^master "^$topic" ${publish} | sort`
++only_next_2=`git rev-list ^master ${publish} | sort`
++if test "$only_next_1" = "$only_next_2"
++then
++ not_in_topic=`git rev-list "^$topic" master`
++ if test -z "$not_in_topic"
++ then
++ echo >&2 "$topic is already up-to-date with master"
++ exit 1 ;# we could allow it, but there is no point.
++ else
++ exit 0
++ fi
++else
++ not_in_next=`git rev-list --pretty=oneline ^${publish} "$topic"`
++ /usr/bin/perl -e '
++ my $topic = $ARGV[0];
++ my $msg = "* $topic has commits already merged to public branch:\n";
++ my (%not_in_next) = map {
++ /^([0-9a-f]+) /;
++ ($1 => 1);
++ } split(/\n/, $ARGV[1]);
++ for my $elem (map {
++ /^([0-9a-f]+) (.*)$/;
++ [$1 => $2];
++ } split(/\n/, $ARGV[2])) {
++ if (!exists $not_in_next{$elem->[0]}) {
++ if ($msg) {
++ print STDERR $msg;
++ undef $msg;
++ }
++ print STDERR " $elem->[1]\n";
++ }
++ }
++ ' "$topic" "$not_in_next" "$not_in_master"
++ exit 1
++fi
++
++<<\DOC_END
++
++This sample hook safeguards topic branches that have been
++published from being rewound.
++
++The workflow assumed here is:
++
++ * Once a topic branch forks from "master", "master" is never
++ merged into it again (either directly or indirectly).
++
++ * Once a topic branch is fully cooked and merged into "master",
++ it is deleted. If you need to build on top of it to correct
++ earlier mistakes, a new topic branch is created by forking at
++ the tip of the "master". This is not strictly necessary, but
++ it makes it easier to keep your history simple.
++
++ * Whenever you need to test or publish your changes to topic
++ branches, merge them into "next" branch.
++
++The script, being an example, hardcodes the publish branch name
++to be "next", but it is trivial to make it configurable via
++$GIT_DIR/config mechanism.
++
++With this workflow, you would want to know:
++
++(1) ... if a topic branch has ever been merged to "next". Young
++ topic branches can have stupid mistakes you would rather
++ clean up before publishing, and things that have not been
++ merged into other branches can be easily rebased without
++ affecting other people. But once it is published, you would
++ not want to rewind it.
++
++(2) ... if a topic branch has been fully merged to "master".
++ Then you can delete it. More importantly, you should not
++ build on top of it -- other people may already want to
++ change things related to the topic as patches against your
++ "master", so if you need further changes, it is better to
++ fork the topic (perhaps with the same name) afresh from the
++ tip of "master".
++
++Let's look at this example:
++
++ o---o---o---o---o---o---o---o---o---o "next"
++ / / / /
++ / a---a---b A / /
++ / / / /
++ / / c---c---c---c B /
++ / / / \ /
++ / / / b---b C \ /
++ / / / / \ /
++ ---o---o---o---o---o---o---o---o---o---o---o "master"
++
++
++A, B and C are topic branches.
++
++ * A has one fix since it was merged up to "next".
++
++ * B has finished. It has been fully merged up to "master" and "next",
++ and is ready to be deleted.
++
++ * C has not merged to "next" at all.
++
++We would want to allow C to be rebased, refuse A, and encourage
++B to be deleted.
++
++To compute (1):
++
++ git rev-list ^master ^topic next
++ git rev-list ^master next
++
++ if these match, topic has not merged in next at all.
++
++To compute (2):
++
++ git rev-list master..topic
++
++ if this is empty, it is fully merged to "master".
++
++DOC_END
+diff -Nur linux-3.18.8/.git/hooks/update.sample linux-rpi/.git/hooks/update.sample
+--- linux-3.18.8/.git/hooks/update.sample 1970-01-01 01:00:00.000000000 +0100
++++ linux-rpi/.git/hooks/update.sample 2015-03-05 14:30:30.665719385 +0100
+@@ -0,0 +1,128 @@
++#!/bin/sh
++#
++# An example hook script to blocks unannotated tags from entering.
++# Called by "git receive-pack" with arguments: refname sha1-old sha1-new
++#
++# To enable this hook, rename this file to "update".
++#
++# Config
++# ------
++# hooks.allowunannotated
++# This boolean sets whether unannotated tags will be allowed into the
++# repository. By default they won't be.
++# hooks.allowdeletetag
++# This boolean sets whether deleting tags will be allowed in the
++# repository. By default they won't be.
++# hooks.allowmodifytag
++# This boolean sets whether a tag may be modified after creation. By default
++# it won't be.
++# hooks.allowdeletebranch
++# This boolean sets whether deleting branches will be allowed in the
++# repository. By default they won't be.
++# hooks.denycreatebranch
++# This boolean sets whether remotely creating branches will be denied
++# in the repository. By default this is allowed.
++#
++
++# --- Command line
++refname="$1"
++oldrev="$2"
++newrev="$3"
++
++# --- Safety check
++if [ -z "$GIT_DIR" ]; then
++ echo "Don't run this script from the command line." >&2
++ echo " (if you want, you could supply GIT_DIR then run" >&2
++ echo " $0 <ref> <oldrev> <newrev>)" >&2
++ exit 1
++fi
++
++if [ -z "$refname" -o -z "$oldrev" -o -z "$newrev" ]; then
++ echo "usage: $0 <ref> <oldrev> <newrev>" >&2
++ exit 1
++fi
++
++# --- Config
++allowunannotated=$(git config --bool hooks.allowunannotated)
++allowdeletebranch=$(git config --bool hooks.allowdeletebranch)
++denycreatebranch=$(git config --bool hooks.denycreatebranch)
++allowdeletetag=$(git config --bool hooks.allowdeletetag)
++allowmodifytag=$(git config --bool hooks.allowmodifytag)
++
++# check for no description
++projectdesc=$(sed -e '1q' "$GIT_DIR/description")
++case "$projectdesc" in
++"Unnamed repository"* | "")
++ echo "*** Project description file hasn't been set" >&2
++ exit 1
++ ;;
++esac
++
++# --- Check types
++# if $newrev is 0000...0000, it's a commit to delete a ref.
++zero="0000000000000000000000000000000000000000"
++if [ "$newrev" = "$zero" ]; then
++ newrev_type=delete
++else
++ newrev_type=$(git cat-file -t $newrev)
++fi
++
++case "$refname","$newrev_type" in
++ refs/tags/*,commit)
++ # un-annotated tag
++ short_refname=${refname##refs/tags/}
++ if [ "$allowunannotated" != "true" ]; then
++ echo "*** The un-annotated tag, $short_refname, is not allowed in this repository" >&2
++ echo "*** Use 'git tag [ -a | -s ]' for tags you want to propagate." >&2
++ exit 1
++ fi
++ ;;
++ refs/tags/*,delete)
++ # delete tag
++ if [ "$allowdeletetag" != "true" ]; then
++ echo "*** Deleting a tag is not allowed in this repository" >&2
++ exit 1
++ fi
++ ;;
++ refs/tags/*,tag)
++ # annotated tag
++ if [ "$allowmodifytag" != "true" ] && git rev-parse $refname > /dev/null 2>&1
++ then
++ echo "*** Tag '$refname' already exists." >&2
++ echo "*** Modifying a tag is not allowed in this repository." >&2
++ exit 1
++ fi
++ ;;
++ refs/heads/*,commit)
++ # branch
++ if [ "$oldrev" = "$zero" -a "$denycreatebranch" = "true" ]; then
++ echo "*** Creating a branch is not allowed in this repository" >&2
++ exit 1
++ fi
++ ;;
++ refs/heads/*,delete)
++ # delete branch
++ if [ "$allowdeletebranch" != "true" ]; then
++ echo "*** Deleting a branch is not allowed in this repository" >&2
++ exit 1
++ fi
++ ;;
++ refs/remotes/*,commit)
++ # tracking branch
++ ;;
++ refs/remotes/*,delete)
++ # delete tracking branch
++ if [ "$allowdeletebranch" != "true" ]; then
++ echo "*** Deleting a tracking branch is not allowed in this repository" >&2
++ exit 1
++ fi
++ ;;
++ *)
++ # Anything else (is there anything else?)
++ echo "*** Update hook: unknown type of update to ref $refname of type $newrev_type" >&2
++ exit 1
++ ;;
++esac
++
++# --- Finished
++exit 0
+Binary files linux-3.18.8/.git/index and linux-rpi/.git/index differ
+diff -Nur linux-3.18.8/.git/info/exclude linux-rpi/.git/info/exclude
+--- linux-3.18.8/.git/info/exclude 1970-01-01 01:00:00.000000000 +0100
++++ linux-rpi/.git/info/exclude 2015-03-05 14:30:30.665719385 +0100
+@@ -0,0 +1,6 @@
++# git ls-files --others --exclude-from=.git/info/exclude
++# Lines that start with '#' are comments.
++# For a project mostly in C, the following would be a good set of
++# exclude patterns (uncomment them if you want to use them):
++# *.[oa]
++# *~
+diff -Nur linux-3.18.8/.git/logs/HEAD linux-rpi/.git/logs/HEAD
+--- linux-3.18.8/.git/logs/HEAD 1970-01-01 01:00:00.000000000 +0100
++++ linux-rpi/.git/logs/HEAD 2015-03-05 14:40:10.473715843 +0100
+@@ -0,0 +1 @@
++0000000000000000000000000000000000000000 91a03559bbc1b5cb2b1157150c1c698b22716d9a Waldemar Brodkorb <wbrodkorb@conet.de> 1425562810 +0100 clone: from https://github.com/raspberrypi/linux.git
+diff -Nur linux-3.18.8/.git/logs/refs/heads/rpi-3.18.y linux-rpi/.git/logs/refs/heads/rpi-3.18.y
+--- linux-3.18.8/.git/logs/refs/heads/rpi-3.18.y 1970-01-01 01:00:00.000000000 +0100
++++ linux-rpi/.git/logs/refs/heads/rpi-3.18.y 2015-03-05 14:40:10.473715843 +0100
+@@ -0,0 +1 @@
++0000000000000000000000000000000000000000 91a03559bbc1b5cb2b1157150c1c698b22716d9a Waldemar Brodkorb <wbrodkorb@conet.de> 1425562810 +0100 clone: from https://github.com/raspberrypi/linux.git
+diff -Nur linux-3.18.8/.git/logs/refs/remotes/origin/HEAD linux-rpi/.git/logs/refs/remotes/origin/HEAD
+--- linux-3.18.8/.git/logs/refs/remotes/origin/HEAD 1970-01-01 01:00:00.000000000 +0100
++++ linux-rpi/.git/logs/refs/remotes/origin/HEAD 2015-03-05 14:40:10.453715844 +0100
+@@ -0,0 +1 @@
++0000000000000000000000000000000000000000 91a03559bbc1b5cb2b1157150c1c698b22716d9a Waldemar Brodkorb <wbrodkorb@conet.de> 1425562810 +0100 clone: from https://github.com/raspberrypi/linux.git
+Binary files linux-3.18.8/.git/objects/pack/pack-adde7c3e99c2b64cc24940bb435fac50f0e72e20.idx and linux-rpi/.git/objects/pack/pack-adde7c3e99c2b64cc24940bb435fac50f0e72e20.idx differ
+Binary files linux-3.18.8/.git/objects/pack/pack-adde7c3e99c2b64cc24940bb435fac50f0e72e20.pack and linux-rpi/.git/objects/pack/pack-adde7c3e99c2b64cc24940bb435fac50f0e72e20.pack differ
+diff -Nur linux-3.18.8/.git/packed-refs linux-rpi/.git/packed-refs
+--- linux-3.18.8/.git/packed-refs 1970-01-01 01:00:00.000000000 +0100
++++ linux-rpi/.git/packed-refs 2015-03-05 14:40:10.453715844 +0100
+@@ -0,0 +1,20 @@
++# pack-refs with: peeled fully-peeled
++645fd9b0c0b3c1f79f71f92dac79bd2f87010444 refs/remotes/origin/master
++1b49b450222df26e4abf7abb6d9302f72b2ed386 refs/remotes/origin/rpi-3.10.y
++d894df614c20e2f56ce0ff0576a4c517352684de refs/remotes/origin/rpi-3.10.y-next
++8f768c5f2a3314e4eacce8d667c787f8dadfda74 refs/remotes/origin/rpi-3.11.y
++ee9b8c7d46f2b1787b1e64604acafc70f70191cf refs/remotes/origin/rpi-3.12.y
++a26c4d1f1428082f6aba79207535527c91115c76 refs/remotes/origin/rpi-3.13.y
++2514e943096ff51dd5a83b28b4b4d45ec2693434 refs/remotes/origin/rpi-3.13.y-next
++e294028d7733a30f3befacc41d473c251096a515 refs/remotes/origin/rpi-3.14.y
++8812404b672364ee794411ed19080dc9b6287682 refs/remotes/origin/rpi-3.15.y
++377c82aa1d31b37f1096096b0e4c65beb0bc5c49 refs/remotes/origin/rpi-3.16.y
++a2a6c3e259254f3687bde843f4caff011611cf7e refs/remotes/origin/rpi-3.17.y
++91a03559bbc1b5cb2b1157150c1c698b22716d9a refs/remotes/origin/rpi-3.18.y
++086127cc3f5fa6818a993965f9c753ede3a569da refs/remotes/origin/rpi-3.18.y-rebase
++d4d542c792f6ab98cb76d4ae71a9497e98b20cfa refs/remotes/origin/rpi-3.19.y
++ada8b4415ff44d535d63e4291a0eca733bc2ad0f refs/remotes/origin/rpi-3.2.27
++2a8d45ec0883e3cbdce920855b3461ac77308a5f refs/remotes/origin/rpi-3.6.y
++d996a1b91b2bf3dc06f4f4f822a56f4496457aa1 refs/remotes/origin/rpi-3.8.y
++d5572370289f698b101f3d0198b1c99f17f0d278 refs/remotes/origin/rpi-3.9.y
++8fa2e19c4fdbe17704947e444674e19ea47c8ddd refs/remotes/origin/rpi-patches
+diff -Nur linux-3.18.8/.git/refs/heads/rpi-3.18.y linux-rpi/.git/refs/heads/rpi-3.18.y
+--- linux-3.18.8/.git/refs/heads/rpi-3.18.y 1970-01-01 01:00:00.000000000 +0100
++++ linux-rpi/.git/refs/heads/rpi-3.18.y 2015-03-05 14:40:10.473715843 +0100
+@@ -0,0 +1 @@
++91a03559bbc1b5cb2b1157150c1c698b22716d9a
+diff -Nur linux-3.18.8/.git/refs/remotes/origin/HEAD linux-rpi/.git/refs/remotes/origin/HEAD
+--- linux-3.18.8/.git/refs/remotes/origin/HEAD 1970-01-01 01:00:00.000000000 +0100
++++ linux-rpi/.git/refs/remotes/origin/HEAD 2015-03-05 14:40:10.453715844 +0100
+@@ -0,0 +1 @@
++ref: refs/remotes/origin/rpi-3.18.y
+diff -Nur linux-3.18.8/include/linux/broadcom/vc_cma.h linux-rpi/include/linux/broadcom/vc_cma.h
+--- linux-3.18.8/include/linux/broadcom/vc_cma.h 1970-01-01 01:00:00.000000000 +0100
++++ linux-rpi/include/linux/broadcom/vc_cma.h 2015-03-05 14:40:17.829715798 +0100
@@ -0,0 +1,29 @@
+/*****************************************************************************
+* Copyright 2012 Broadcom Corporation. All rights reserved.
@@ -114379,9 +125889,9 @@ diff -Nur linux-3.18.6/include/linux/broadcom/vc_cma.h linux-rpi/include/linux/b
+#endif
+
+#endif /* VC_CMA_H */
-diff -Nur linux-3.18.6/include/linux/mmc/host.h linux-rpi/include/linux/mmc/host.h
---- linux-3.18.6/include/linux/mmc/host.h 2015-02-06 15:53:48.000000000 +0100
-+++ linux-rpi/include/linux/mmc/host.h 2015-02-09 04:40:46.000000000 +0100
+diff -Nur linux-3.18.8/include/linux/mmc/host.h linux-rpi/include/linux/mmc/host.h
+--- linux-3.18.8/include/linux/mmc/host.h 2015-02-27 02:49:36.000000000 +0100
++++ linux-rpi/include/linux/mmc/host.h 2015-03-05 14:40:18.025715797 +0100
@@ -290,6 +290,7 @@
#define MMC_CAP2_HS400 (MMC_CAP2_HS400_1_8V | \
MMC_CAP2_HS400_1_2V)
@@ -114390,9 +125900,9 @@ diff -Nur linux-3.18.6/include/linux/mmc/host.h linux-rpi/include/linux/mmc/host
mmc_pm_flag_t pm_caps; /* supported pm features */
-diff -Nur linux-3.18.6/include/linux/mmc/sdhci.h linux-rpi/include/linux/mmc/sdhci.h
---- linux-3.18.6/include/linux/mmc/sdhci.h 2015-02-06 15:53:48.000000000 +0100
-+++ linux-rpi/include/linux/mmc/sdhci.h 2015-02-09 04:40:46.000000000 +0100
+diff -Nur linux-3.18.8/include/linux/mmc/sdhci.h linux-rpi/include/linux/mmc/sdhci.h
+--- linux-3.18.8/include/linux/mmc/sdhci.h 2015-02-27 02:49:36.000000000 +0100
++++ linux-rpi/include/linux/mmc/sdhci.h 2015-03-05 14:40:18.025715797 +0100
@@ -130,6 +130,7 @@
#define SDHCI_SDIO_IRQ_ENABLED (1<<9) /* SDIO irq enabled */
#define SDHCI_SDR104_NEEDS_TUNING (1<<10) /* SDR104/HS200 needs tuning */
@@ -114401,9 +125911,9 @@ diff -Nur linux-3.18.6/include/linux/mmc/sdhci.h linux-rpi/include/linux/mmc/sdh
unsigned int version; /* SDHCI spec. version */
-diff -Nur linux-3.18.6/include/linux/platform_data/bcm2708.h linux-rpi/include/linux/platform_data/bcm2708.h
---- linux-3.18.6/include/linux/platform_data/bcm2708.h 1970-01-01 01:00:00.000000000 +0100
-+++ linux-rpi/include/linux/platform_data/bcm2708.h 2015-02-09 04:40:46.000000000 +0100
+diff -Nur linux-3.18.8/include/linux/platform_data/bcm2708.h linux-rpi/include/linux/platform_data/bcm2708.h
+--- linux-3.18.8/include/linux/platform_data/bcm2708.h 1970-01-01 01:00:00.000000000 +0100
++++ linux-rpi/include/linux/platform_data/bcm2708.h 2015-03-05 14:40:18.169715796 +0100
@@ -0,0 +1,23 @@
+/*
+ * include/linux/platform_data/bcm2708.h
@@ -114428,9 +125938,9 @@ diff -Nur linux-3.18.6/include/linux/platform_data/bcm2708.h linux-rpi/include/l
+ bcm2708_gpio_pull_t value);
+
+#endif
-diff -Nur linux-3.18.6/include/linux/vmstat.h linux-rpi/include/linux/vmstat.h
---- linux-3.18.6/include/linux/vmstat.h 2015-02-06 15:53:48.000000000 +0100
-+++ linux-rpi/include/linux/vmstat.h 2015-02-09 04:40:46.000000000 +0100
+diff -Nur linux-3.18.8/include/linux/vmstat.h linux-rpi/include/linux/vmstat.h
+--- linux-3.18.8/include/linux/vmstat.h 2015-02-27 02:49:36.000000000 +0100
++++ linux-rpi/include/linux/vmstat.h 2015-03-05 14:40:18.249715796 +0100
@@ -241,7 +241,11 @@
static inline void __dec_zone_state(struct zone *zone, enum zone_stat_item item)
{
@@ -114443,9 +125953,9 @@ diff -Nur linux-3.18.6/include/linux/vmstat.h linux-rpi/include/linux/vmstat.h
}
static inline void __inc_zone_page_state(struct page *page,
-diff -Nur linux-3.18.6/include/linux/w1-gpio.h linux-rpi/include/linux/w1-gpio.h
---- linux-3.18.6/include/linux/w1-gpio.h 2015-02-06 15:53:48.000000000 +0100
-+++ linux-rpi/include/linux/w1-gpio.h 2015-02-09 04:40:46.000000000 +0100
+diff -Nur linux-3.18.8/include/linux/w1-gpio.h linux-rpi/include/linux/w1-gpio.h
+--- linux-3.18.8/include/linux/w1-gpio.h 2015-02-27 02:49:36.000000000 +0100
++++ linux-rpi/include/linux/w1-gpio.h 2015-03-05 14:40:18.249715796 +0100
@@ -18,6 +18,7 @@
struct w1_gpio_platform_data {
unsigned int pin;
@@ -114454,9 +125964,9 @@ diff -Nur linux-3.18.6/include/linux/w1-gpio.h linux-rpi/include/linux/w1-gpio.h
void (*enable_external_pullup)(int enable);
unsigned int ext_pullup_enable_pin;
unsigned int pullup_duration;
-diff -Nur linux-3.18.6/include/uapi/linux/fb.h linux-rpi/include/uapi/linux/fb.h
---- linux-3.18.6/include/uapi/linux/fb.h 2015-02-06 15:53:48.000000000 +0100
-+++ linux-rpi/include/uapi/linux/fb.h 2015-02-09 04:40:46.000000000 +0100
+diff -Nur linux-3.18.8/include/uapi/linux/fb.h linux-rpi/include/uapi/linux/fb.h
+--- linux-3.18.8/include/uapi/linux/fb.h 2015-02-27 02:49:36.000000000 +0100
++++ linux-rpi/include/uapi/linux/fb.h 2015-03-05 14:40:18.293715796 +0100
@@ -34,6 +34,11 @@
#define FBIOPUT_MODEINFO 0x4617
#define FBIOGET_DISPINFO 0x4618
@@ -114469,9 +125979,9 @@ diff -Nur linux-3.18.6/include/uapi/linux/fb.h linux-rpi/include/uapi/linux/fb.h
#define FB_TYPE_PACKED_PIXELS 0 /* Packed Pixels */
#define FB_TYPE_PLANES 1 /* Non interleaved planes */
-diff -Nur linux-3.18.6/kernel/cgroup.c linux-rpi/kernel/cgroup.c
---- linux-3.18.6/kernel/cgroup.c 2015-02-06 15:53:48.000000000 +0100
-+++ linux-rpi/kernel/cgroup.c 2015-02-09 04:40:46.000000000 +0100
+diff -Nur linux-3.18.8/kernel/cgroup.c linux-rpi/kernel/cgroup.c
+--- linux-3.18.8/kernel/cgroup.c 2015-02-27 02:49:36.000000000 +0100
++++ linux-rpi/kernel/cgroup.c 2015-03-05 14:40:18.445715795 +0100
@@ -5322,6 +5322,29 @@
}
__setup("cgroup_disable=", cgroup_disable);
@@ -114502,9 +126012,9 @@ diff -Nur linux-3.18.6/kernel/cgroup.c linux-rpi/kernel/cgroup.c
static int __init cgroup_set_legacy_files_on_dfl(char *str)
{
printk("cgroup: using legacy files on the default hierarchy\n");
-diff -Nur linux-3.18.6/kernel/time/ntp.c linux-rpi/kernel/time/ntp.c
---- linux-3.18.6/kernel/time/ntp.c 2015-02-06 15:53:48.000000000 +0100
-+++ linux-rpi/kernel/time/ntp.c 2015-02-09 04:40:46.000000000 +0100
+diff -Nur linux-3.18.8/kernel/time/ntp.c linux-rpi/kernel/time/ntp.c
+--- linux-3.18.8/kernel/time/ntp.c 2015-02-27 02:49:36.000000000 +0100
++++ linux-rpi/kernel/time/ntp.c 2015-03-05 14:40:18.469715795 +0100
@@ -634,9 +634,9 @@
return -EPERM;
@@ -114517,9 +126027,9 @@ diff -Nur linux-3.18.6/kernel/time/ntp.c linux-rpi/kernel/time/ntp.c
return -EINVAL;
}
-diff -Nur linux-3.18.6/mm/memcontrol.c linux-rpi/mm/memcontrol.c
---- linux-3.18.6/mm/memcontrol.c 2015-02-06 15:53:48.000000000 +0100
-+++ linux-rpi/mm/memcontrol.c 2015-02-09 04:40:47.000000000 +0100
+diff -Nur linux-3.18.8/mm/memcontrol.c linux-rpi/mm/memcontrol.c
+--- linux-3.18.8/mm/memcontrol.c 2015-02-27 02:49:36.000000000 +0100
++++ linux-rpi/mm/memcontrol.c 2015-03-05 14:40:18.497715794 +0100
@@ -6207,6 +6207,7 @@
.bind = mem_cgroup_bind,
.legacy_cftypes = mem_cgroup_files,
@@ -114528,9 +126038,9 @@ diff -Nur linux-3.18.6/mm/memcontrol.c linux-rpi/mm/memcontrol.c
};
#ifdef CONFIG_MEMCG_SWAP
-diff -Nur linux-3.18.6/scripts/dtc/checks.c linux-rpi/scripts/dtc/checks.c
---- linux-3.18.6/scripts/dtc/checks.c 2015-02-06 15:53:48.000000000 +0100
-+++ linux-rpi/scripts/dtc/checks.c 2015-02-09 04:40:47.000000000 +0100
+diff -Nur linux-3.18.8/scripts/dtc/checks.c linux-rpi/scripts/dtc/checks.c
+--- linux-3.18.8/scripts/dtc/checks.c 2015-02-27 02:49:36.000000000 +0100
++++ linux-rpi/scripts/dtc/checks.c 2015-03-05 14:40:18.909715792 +0100
@@ -53,7 +53,7 @@
void *data;
bool warn, error;
@@ -114783,9 +126293,9 @@ diff -Nur linux-3.18.6/scripts/dtc/checks.c linux-rpi/scripts/dtc/checks.c
{
struct node *dt = bi->dt;
int i;
-diff -Nur linux-3.18.6/scripts/dtc/data.c linux-rpi/scripts/dtc/data.c
---- linux-3.18.6/scripts/dtc/data.c 2015-02-06 15:53:48.000000000 +0100
-+++ linux-rpi/scripts/dtc/data.c 2015-02-09 04:40:47.000000000 +0100
+diff -Nur linux-3.18.8/scripts/dtc/data.c linux-rpi/scripts/dtc/data.c
+--- linux-3.18.8/scripts/dtc/data.c 2015-02-27 02:49:36.000000000 +0100
++++ linux-rpi/scripts/dtc/data.c 2015-03-05 14:40:18.909715792 +0100
@@ -74,7 +74,7 @@
struct data d;
char *q;
@@ -114821,9 +126331,9 @@ diff -Nur linux-3.18.6/scripts/dtc/data.c linux-rpi/scripts/dtc/data.c
- return 1;
+ return true;
}
-diff -Nur linux-3.18.6/scripts/dtc/dtc.c linux-rpi/scripts/dtc/dtc.c
---- linux-3.18.6/scripts/dtc/dtc.c 2015-02-06 15:53:48.000000000 +0100
-+++ linux-rpi/scripts/dtc/dtc.c 2015-02-09 04:40:47.000000000 +0100
+diff -Nur linux-3.18.8/scripts/dtc/dtc.c linux-rpi/scripts/dtc/dtc.c
+--- linux-3.18.8/scripts/dtc/dtc.c 2015-02-27 02:49:36.000000000 +0100
++++ linux-rpi/scripts/dtc/dtc.c 2015-03-05 14:40:18.913715792 +0100
@@ -29,6 +29,7 @@
int minsize; /* Minimum blob size */
int padsize; /* Additional padding to blob */
@@ -114919,9 +126429,9 @@ diff -Nur linux-3.18.6/scripts/dtc/dtc.c linux-rpi/scripts/dtc/dtc.c
if (! outf)
die("Couldn't open output file %s: %s\n",
outname, strerror(errno));
-diff -Nur linux-3.18.6/scripts/dtc/dtc.h linux-rpi/scripts/dtc/dtc.h
---- linux-3.18.6/scripts/dtc/dtc.h 2015-02-06 15:53:48.000000000 +0100
-+++ linux-rpi/scripts/dtc/dtc.h 2015-02-09 04:40:47.000000000 +0100
+diff -Nur linux-3.18.8/scripts/dtc/dtc.h linux-rpi/scripts/dtc/dtc.h
+--- linux-3.18.8/scripts/dtc/dtc.h 2015-02-27 02:49:36.000000000 +0100
++++ linux-rpi/scripts/dtc/dtc.h 2015-03-05 14:40:18.913715792 +0100
@@ -38,9 +38,9 @@
#include "util.h"
@@ -115047,9 +126557,9 @@ diff -Nur linux-3.18.6/scripts/dtc/dtc.h linux-rpi/scripts/dtc/dtc.h
/* Flattened trees */
-diff -Nur linux-3.18.6/scripts/dtc/dtc-lexer.l linux-rpi/scripts/dtc/dtc-lexer.l
---- linux-3.18.6/scripts/dtc/dtc-lexer.l 2015-02-06 15:53:48.000000000 +0100
-+++ linux-rpi/scripts/dtc/dtc-lexer.l 2015-02-09 04:40:47.000000000 +0100
+diff -Nur linux-3.18.8/scripts/dtc/dtc-lexer.l linux-rpi/scripts/dtc/dtc-lexer.l
+--- linux-3.18.8/scripts/dtc/dtc-lexer.l 2015-02-27 02:49:36.000000000 +0100
++++ linux-rpi/scripts/dtc/dtc-lexer.l 2015-03-05 14:40:18.909715792 +0100
@@ -20,7 +20,6 @@
%option noyywrap nounput noinput never-interactive
@@ -115187,9 +126697,9 @@ diff -Nur linux-3.18.6/scripts/dtc/dtc-lexer.l linux-rpi/scripts/dtc/dtc-lexer.l
+
+ treesource_error = true;
}
-diff -Nur linux-3.18.6/scripts/dtc/dtc-lexer.lex.c_shipped linux-rpi/scripts/dtc/dtc-lexer.lex.c_shipped
---- linux-3.18.6/scripts/dtc/dtc-lexer.lex.c_shipped 2015-02-06 15:53:48.000000000 +0100
-+++ linux-rpi/scripts/dtc/dtc-lexer.lex.c_shipped 2015-02-09 04:40:47.000000000 +0100
+diff -Nur linux-3.18.8/scripts/dtc/dtc-lexer.lex.c_shipped linux-rpi/scripts/dtc/dtc-lexer.lex.c_shipped
+--- linux-3.18.8/scripts/dtc/dtc-lexer.lex.c_shipped 2015-02-27 02:49:36.000000000 +0100
++++ linux-rpi/scripts/dtc/dtc-lexer.lex.c_shipped 2015-03-05 14:40:18.913715792 +0100
@@ -372,8 +372,8 @@
*yy_cp = '\0'; \
(yy_c_buf_p) = yy_cp;
@@ -116044,9 +127554,9 @@ diff -Nur linux-3.18.6/scripts/dtc/dtc-lexer.lex.c_shipped linux-rpi/scripts/dtc
+ treesource_error = true;
}
-diff -Nur linux-3.18.6/scripts/dtc/dtc-parser.tab.c_shipped linux-rpi/scripts/dtc/dtc-parser.tab.c_shipped
---- linux-3.18.6/scripts/dtc/dtc-parser.tab.c_shipped 2015-02-06 15:53:48.000000000 +0100
-+++ linux-rpi/scripts/dtc/dtc-parser.tab.c_shipped 2015-02-09 04:40:47.000000000 +0100
+diff -Nur linux-3.18.8/scripts/dtc/dtc-parser.tab.c_shipped linux-rpi/scripts/dtc/dtc-parser.tab.c_shipped
+--- linux-3.18.8/scripts/dtc/dtc-parser.tab.c_shipped 2015-02-27 02:49:36.000000000 +0100
++++ linux-rpi/scripts/dtc/dtc-parser.tab.c_shipped 2015-03-05 14:40:18.913715792 +0100
@@ -1,19 +1,19 @@
-/* A Bison parser, made by GNU Bison 2.7.12-4996. */
+/* A Bison parser, made by GNU Bison 3.0.2. */
@@ -118716,9 +130226,9 @@ diff -Nur linux-3.18.6/scripts/dtc/dtc-parser.tab.c_shipped linux-rpi/scripts/dt
- return c;
+ ERROR(&yylloc, "%s", s);
}
-diff -Nur linux-3.18.6/scripts/dtc/dtc-parser.tab.h_shipped linux-rpi/scripts/dtc/dtc-parser.tab.h_shipped
---- linux-3.18.6/scripts/dtc/dtc-parser.tab.h_shipped 2015-02-06 15:53:48.000000000 +0100
-+++ linux-rpi/scripts/dtc/dtc-parser.tab.h_shipped 2015-02-09 04:40:47.000000000 +0100
+diff -Nur linux-3.18.8/scripts/dtc/dtc-parser.tab.h_shipped linux-rpi/scripts/dtc/dtc-parser.tab.h_shipped
+--- linux-3.18.8/scripts/dtc/dtc-parser.tab.h_shipped 2015-02-27 02:49:36.000000000 +0100
++++ linux-rpi/scripts/dtc/dtc-parser.tab.h_shipped 2015-03-05 14:40:18.913715792 +0100
@@ -1,19 +1,19 @@
-/* A Bison parser, made by GNU Bison 2.7.12-4996. */
+/* A Bison parser, made by GNU Bison 3.0.2. */
@@ -118890,9 +130400,9 @@ diff -Nur linux-3.18.6/scripts/dtc/dtc-parser.tab.h_shipped linux-rpi/scripts/dt
-#endif /* ! YYPARSE_PARAM */
#endif /* !YY_YY_DTC_PARSER_TAB_H_INCLUDED */
-diff -Nur linux-3.18.6/scripts/dtc/dtc-parser.y linux-rpi/scripts/dtc/dtc-parser.y
---- linux-3.18.6/scripts/dtc/dtc-parser.y 2015-02-06 15:53:48.000000000 +0100
-+++ linux-rpi/scripts/dtc/dtc-parser.y 2015-02-09 04:40:47.000000000 +0100
+diff -Nur linux-3.18.8/scripts/dtc/dtc-parser.y linux-rpi/scripts/dtc/dtc-parser.y
+--- linux-3.18.8/scripts/dtc/dtc-parser.y 2015-02-27 02:49:36.000000000 +0100
++++ linux-rpi/scripts/dtc/dtc-parser.y 2015-03-05 14:40:18.913715792 +0100
@@ -17,31 +17,28 @@
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
* USA
@@ -119167,9 +130677,9 @@ diff -Nur linux-3.18.6/scripts/dtc/dtc-parser.y linux-rpi/scripts/dtc/dtc-parser
- return c;
+ ERROR(&yylloc, "%s", s);
}
-diff -Nur linux-3.18.6/scripts/dtc/flattree.c linux-rpi/scripts/dtc/flattree.c
---- linux-3.18.6/scripts/dtc/flattree.c 2015-02-06 15:53:48.000000000 +0100
-+++ linux-rpi/scripts/dtc/flattree.c 2015-02-09 04:40:47.000000000 +0100
+diff -Nur linux-3.18.8/scripts/dtc/flattree.c linux-rpi/scripts/dtc/flattree.c
+--- linux-3.18.8/scripts/dtc/flattree.c 2015-02-27 02:49:36.000000000 +0100
++++ linux-rpi/scripts/dtc/flattree.c 2015-03-05 14:40:18.913715792 +0100
@@ -261,7 +261,13 @@
{
struct property *prop;
@@ -119337,9 +130847,9 @@ diff -Nur linux-3.18.6/scripts/dtc/flattree.c linux-rpi/scripts/dtc/flattree.c
emit->endnode(etarget, tree->labels);
}
-diff -Nur linux-3.18.6/scripts/dtc/fstree.c linux-rpi/scripts/dtc/fstree.c
---- linux-3.18.6/scripts/dtc/fstree.c 2015-02-06 15:53:48.000000000 +0100
-+++ linux-rpi/scripts/dtc/fstree.c 2015-02-09 04:40:47.000000000 +0100
+diff -Nur linux-3.18.8/scripts/dtc/fstree.c linux-rpi/scripts/dtc/fstree.c
+--- linux-3.18.8/scripts/dtc/fstree.c 2015-02-27 02:49:36.000000000 +0100
++++ linux-rpi/scripts/dtc/fstree.c 2015-03-05 14:40:18.913715792 +0100
@@ -37,26 +37,26 @@
tree = build_node(NULL, NULL);
@@ -119388,9 +130898,9 @@ diff -Nur linux-3.18.6/scripts/dtc/fstree.c linux-rpi/scripts/dtc/fstree.c
}
closedir(d);
-diff -Nur linux-3.18.6/scripts/dtc/livetree.c linux-rpi/scripts/dtc/livetree.c
---- linux-3.18.6/scripts/dtc/livetree.c 2015-02-06 15:53:48.000000000 +0100
-+++ linux-rpi/scripts/dtc/livetree.c 2015-02-09 04:40:47.000000000 +0100
+diff -Nur linux-3.18.8/scripts/dtc/livetree.c linux-rpi/scripts/dtc/livetree.c
+--- linux-3.18.8/scripts/dtc/livetree.c 2015-02-27 02:49:36.000000000 +0100
++++ linux-rpi/scripts/dtc/livetree.c 2015-03-05 14:40:18.913715792 +0100
@@ -511,7 +511,9 @@
struct node *get_node_by_ref(struct node *tree, const char *ref)
@@ -119402,9 +130912,9 @@ diff -Nur linux-3.18.6/scripts/dtc/livetree.c linux-rpi/scripts/dtc/livetree.c
return get_node_by_path(tree, ref);
else
return get_node_by_label(tree, ref);
-diff -Nur linux-3.18.6/scripts/dtc/srcpos.c linux-rpi/scripts/dtc/srcpos.c
---- linux-3.18.6/scripts/dtc/srcpos.c 2015-02-06 15:53:48.000000000 +0100
-+++ linux-rpi/scripts/dtc/srcpos.c 2015-02-09 04:40:47.000000000 +0100
+diff -Nur linux-3.18.8/scripts/dtc/srcpos.c linux-rpi/scripts/dtc/srcpos.c
+--- linux-3.18.8/scripts/dtc/srcpos.c 2015-02-27 02:49:36.000000000 +0100
++++ linux-rpi/scripts/dtc/srcpos.c 2015-03-05 14:40:18.913715792 +0100
@@ -34,7 +34,7 @@
static struct search_path *search_path_head, **search_path_tail;
@@ -119505,9 +131015,9 @@ diff -Nur linux-3.18.6/scripts/dtc/srcpos.c linux-rpi/scripts/dtc/srcpos.c
va_end(va);
}
-diff -Nur linux-3.18.6/scripts/dtc/srcpos.h linux-rpi/scripts/dtc/srcpos.h
---- linux-3.18.6/scripts/dtc/srcpos.h 2015-02-06 15:53:48.000000000 +0100
-+++ linux-rpi/scripts/dtc/srcpos.h 2015-02-09 04:40:47.000000000 +0100
+diff -Nur linux-3.18.8/scripts/dtc/srcpos.h linux-rpi/scripts/dtc/srcpos.h
+--- linux-3.18.8/scripts/dtc/srcpos.h 2015-02-27 02:49:36.000000000 +0100
++++ linux-rpi/scripts/dtc/srcpos.h 2015-03-05 14:40:18.913715792 +0100
@@ -21,6 +21,7 @@
#define _SRCPOS_H_
@@ -119544,9 +131054,9 @@ diff -Nur linux-3.18.6/scripts/dtc/srcpos.h linux-rpi/scripts/dtc/srcpos.h
extern void srcpos_set_line(char *f, int l);
-diff -Nur linux-3.18.6/scripts/dtc/treesource.c linux-rpi/scripts/dtc/treesource.c
---- linux-3.18.6/scripts/dtc/treesource.c 2015-02-06 15:53:48.000000000 +0100
-+++ linux-rpi/scripts/dtc/treesource.c 2015-02-09 04:40:47.000000000 +0100
+diff -Nur linux-3.18.8/scripts/dtc/treesource.c linux-rpi/scripts/dtc/treesource.c
+--- linux-3.18.8/scripts/dtc/treesource.c 2015-02-27 02:49:36.000000000 +0100
++++ linux-rpi/scripts/dtc/treesource.c 2015-03-05 14:40:18.913715792 +0100
@@ -26,12 +26,12 @@
extern YYLTYPE yylloc;
@@ -119601,9 +131111,9 @@ diff -Nur linux-3.18.6/scripts/dtc/treesource.c linux-rpi/scripts/dtc/treesource
if ((const void *)bp >= propend)
break;
fprintf(f, " ");
-diff -Nur linux-3.18.6/scripts/dtc/util.c linux-rpi/scripts/dtc/util.c
---- linux-3.18.6/scripts/dtc/util.c 2015-02-06 15:53:48.000000000 +0100
-+++ linux-rpi/scripts/dtc/util.c 2015-02-09 04:40:47.000000000 +0100
+diff -Nur linux-3.18.8/scripts/dtc/util.c linux-rpi/scripts/dtc/util.c
+--- linux-3.18.8/scripts/dtc/util.c 2015-02-27 02:49:36.000000000 +0100
++++ linux-rpi/scripts/dtc/util.c 2015-03-05 14:40:18.913715792 +0100
@@ -39,11 +39,11 @@
char *xstrdup(const char *s)
{
@@ -119660,9 +131170,9 @@ diff -Nur linux-3.18.6/scripts/dtc/util.c linux-rpi/scripts/dtc/util.c
printf(">");
} else {
printf(" = [");
-diff -Nur linux-3.18.6/scripts/dtc/util.h linux-rpi/scripts/dtc/util.h
---- linux-3.18.6/scripts/dtc/util.h 2015-02-06 15:53:48.000000000 +0100
-+++ linux-rpi/scripts/dtc/util.h 2015-02-09 04:40:47.000000000 +0100
+diff -Nur linux-3.18.8/scripts/dtc/util.h linux-rpi/scripts/dtc/util.h
+--- linux-3.18.8/scripts/dtc/util.h 2015-02-27 02:49:36.000000000 +0100
++++ linux-rpi/scripts/dtc/util.h 2015-03-05 14:40:18.913715792 +0100
@@ -2,6 +2,7 @@
#define _UTIL_H
@@ -119688,15 +131198,15 @@ diff -Nur linux-3.18.6/scripts/dtc/util.h linux-rpi/scripts/dtc/util.h
/*
* Parse an escaped character starting at index i in string s. The resulting
-diff -Nur linux-3.18.6/scripts/dtc/version_gen.h linux-rpi/scripts/dtc/version_gen.h
---- linux-3.18.6/scripts/dtc/version_gen.h 2015-02-06 15:53:48.000000000 +0100
-+++ linux-rpi/scripts/dtc/version_gen.h 2015-02-09 04:40:47.000000000 +0100
+diff -Nur linux-3.18.8/scripts/dtc/version_gen.h linux-rpi/scripts/dtc/version_gen.h
+--- linux-3.18.8/scripts/dtc/version_gen.h 2015-02-27 02:49:36.000000000 +0100
++++ linux-rpi/scripts/dtc/version_gen.h 2015-03-05 14:40:18.913715792 +0100
@@ -1 +1 @@
-#define DTC_VERSION "DTC 1.4.0-dirty"
+#define DTC_VERSION "DTC 1.4.1-g36c70742"
-diff -Nur linux-3.18.6/sound/arm/bcm2835.c linux-rpi/sound/arm/bcm2835.c
---- linux-3.18.6/sound/arm/bcm2835.c 1970-01-01 01:00:00.000000000 +0100
-+++ linux-rpi/sound/arm/bcm2835.c 2015-02-09 04:40:47.000000000 +0100
+diff -Nur linux-3.18.8/sound/arm/bcm2835.c linux-rpi/sound/arm/bcm2835.c
+--- linux-3.18.8/sound/arm/bcm2835.c 1970-01-01 01:00:00.000000000 +0100
++++ linux-rpi/sound/arm/bcm2835.c 2015-03-05 14:40:19.021715791 +0100
@@ -0,0 +1,420 @@
+/*****************************************************************************
+* Copyright 2011 Broadcom Corporation. All rights reserved.
@@ -120118,9 +131628,9 @@ diff -Nur linux-3.18.6/sound/arm/bcm2835.c linux-rpi/sound/arm/bcm2835.c
+MODULE_DESCRIPTION("Alsa driver for BCM2835 chip");
+MODULE_LICENSE("GPL");
+MODULE_ALIAS("platform:bcm2835_alsa");
-diff -Nur linux-3.18.6/sound/arm/bcm2835-ctl.c linux-rpi/sound/arm/bcm2835-ctl.c
---- linux-3.18.6/sound/arm/bcm2835-ctl.c 1970-01-01 01:00:00.000000000 +0100
-+++ linux-rpi/sound/arm/bcm2835-ctl.c 2015-02-09 04:40:47.000000000 +0100
+diff -Nur linux-3.18.8/sound/arm/bcm2835-ctl.c linux-rpi/sound/arm/bcm2835-ctl.c
+--- linux-3.18.8/sound/arm/bcm2835-ctl.c 1970-01-01 01:00:00.000000000 +0100
++++ linux-rpi/sound/arm/bcm2835-ctl.c 2015-03-05 14:40:19.021715791 +0100
@@ -0,0 +1,323 @@
+/*****************************************************************************
+* Copyright 2011 Broadcom Corporation. All rights reserved.
@@ -120445,9 +131955,9 @@ diff -Nur linux-3.18.6/sound/arm/bcm2835-ctl.c linux-rpi/sound/arm/bcm2835-ctl.c
+ }
+ return 0;
+}
-diff -Nur linux-3.18.6/sound/arm/bcm2835.h linux-rpi/sound/arm/bcm2835.h
---- linux-3.18.6/sound/arm/bcm2835.h 1970-01-01 01:00:00.000000000 +0100
-+++ linux-rpi/sound/arm/bcm2835.h 2015-02-09 04:40:47.000000000 +0100
+diff -Nur linux-3.18.8/sound/arm/bcm2835.h linux-rpi/sound/arm/bcm2835.h
+--- linux-3.18.8/sound/arm/bcm2835.h 1970-01-01 01:00:00.000000000 +0100
++++ linux-rpi/sound/arm/bcm2835.h 2015-03-05 14:40:19.021715791 +0100
@@ -0,0 +1,167 @@
+/*****************************************************************************
+* Copyright 2011 Broadcom Corporation. All rights reserved.
@@ -120616,9 +132126,9 @@ diff -Nur linux-3.18.6/sound/arm/bcm2835.h linux-rpi/sound/arm/bcm2835.h
+void bcm2835_audio_flush_playback_buffers(bcm2835_alsa_stream_t * alsa_stream);
+
+#endif /* __SOUND_ARM_BCM2835_H */
-diff -Nur linux-3.18.6/sound/arm/bcm2835-pcm.c linux-rpi/sound/arm/bcm2835-pcm.c
---- linux-3.18.6/sound/arm/bcm2835-pcm.c 1970-01-01 01:00:00.000000000 +0100
-+++ linux-rpi/sound/arm/bcm2835-pcm.c 2015-02-09 04:40:47.000000000 +0100
+diff -Nur linux-3.18.8/sound/arm/bcm2835-pcm.c linux-rpi/sound/arm/bcm2835-pcm.c
+--- linux-3.18.8/sound/arm/bcm2835-pcm.c 1970-01-01 01:00:00.000000000 +0100
++++ linux-rpi/sound/arm/bcm2835-pcm.c 2015-03-05 14:40:19.021715791 +0100
@@ -0,0 +1,552 @@
+/*****************************************************************************
+* Copyright 2011 Broadcom Corporation. All rights reserved.
@@ -121172,9 +132682,9 @@ diff -Nur linux-3.18.6/sound/arm/bcm2835-pcm.c linux-rpi/sound/arm/bcm2835-pcm.c
+
+ return 0;
+}
-diff -Nur linux-3.18.6/sound/arm/bcm2835-vchiq.c linux-rpi/sound/arm/bcm2835-vchiq.c
---- linux-3.18.6/sound/arm/bcm2835-vchiq.c 1970-01-01 01:00:00.000000000 +0100
-+++ linux-rpi/sound/arm/bcm2835-vchiq.c 2015-02-09 04:40:47.000000000 +0100
+diff -Nur linux-3.18.8/sound/arm/bcm2835-vchiq.c linux-rpi/sound/arm/bcm2835-vchiq.c
+--- linux-3.18.8/sound/arm/bcm2835-vchiq.c 1970-01-01 01:00:00.000000000 +0100
++++ linux-rpi/sound/arm/bcm2835-vchiq.c 2015-03-05 14:40:19.021715791 +0100
@@ -0,0 +1,902 @@
+/*****************************************************************************
+* Copyright 2011 Broadcom Corporation. All rights reserved.
@@ -122078,9 +133588,9 @@ diff -Nur linux-3.18.6/sound/arm/bcm2835-vchiq.c linux-rpi/sound/arm/bcm2835-vch
+
+module_param(force_bulk, bool, 0444);
+MODULE_PARM_DESC(force_bulk, "Force use of vchiq bulk for audio");
-diff -Nur linux-3.18.6/sound/arm/Kconfig linux-rpi/sound/arm/Kconfig
---- linux-3.18.6/sound/arm/Kconfig 2015-02-06 15:53:48.000000000 +0100
-+++ linux-rpi/sound/arm/Kconfig 2015-02-09 04:40:47.000000000 +0100
+diff -Nur linux-3.18.8/sound/arm/Kconfig linux-rpi/sound/arm/Kconfig
+--- linux-3.18.8/sound/arm/Kconfig 2015-02-27 02:49:36.000000000 +0100
++++ linux-rpi/sound/arm/Kconfig 2015-03-05 14:40:19.021715791 +0100
@@ -39,5 +39,12 @@
Say Y or M if you want to support any AC97 codec attached to
the PXA2xx AC97 interface.
@@ -122094,9 +133604,9 @@ diff -Nur linux-3.18.6/sound/arm/Kconfig linux-rpi/sound/arm/Kconfig
+
endif # SND_ARM
-diff -Nur linux-3.18.6/sound/arm/Makefile linux-rpi/sound/arm/Makefile
---- linux-3.18.6/sound/arm/Makefile 2015-02-06 15:53:48.000000000 +0100
-+++ linux-rpi/sound/arm/Makefile 2015-02-09 04:40:47.000000000 +0100
+diff -Nur linux-3.18.8/sound/arm/Makefile linux-rpi/sound/arm/Makefile
+--- linux-3.18.8/sound/arm/Makefile 2015-02-27 02:49:36.000000000 +0100
++++ linux-rpi/sound/arm/Makefile 2015-03-05 14:40:19.021715791 +0100
@@ -14,3 +14,8 @@
obj-$(CONFIG_SND_PXA2XX_AC97) += snd-pxa2xx-ac97.o
@@ -122106,9 +133616,9 @@ diff -Nur linux-3.18.6/sound/arm/Makefile linux-rpi/sound/arm/Makefile
+snd-bcm2835-objs := bcm2835.o bcm2835-ctl.o bcm2835-pcm.o bcm2835-vchiq.o
+
+ccflags-y += -Idrivers/misc/vc04_services -Idrivers/misc/vc04_services/interface/vcos/linuxkernel -D__VCCOREVER__=0x04000000
-diff -Nur linux-3.18.6/sound/arm/vc_vchi_audioserv_defs.h linux-rpi/sound/arm/vc_vchi_audioserv_defs.h
---- linux-3.18.6/sound/arm/vc_vchi_audioserv_defs.h 1970-01-01 01:00:00.000000000 +0100
-+++ linux-rpi/sound/arm/vc_vchi_audioserv_defs.h 2015-02-09 04:40:47.000000000 +0100
+diff -Nur linux-3.18.8/sound/arm/vc_vchi_audioserv_defs.h linux-rpi/sound/arm/vc_vchi_audioserv_defs.h
+--- linux-3.18.8/sound/arm/vc_vchi_audioserv_defs.h 1970-01-01 01:00:00.000000000 +0100
++++ linux-rpi/sound/arm/vc_vchi_audioserv_defs.h 2015-03-05 14:40:19.021715791 +0100
@@ -0,0 +1,116 @@
+/*****************************************************************************
+* Copyright 2011 Broadcom Corporation. All rights reserved.
@@ -122226,9 +133736,9 @@ diff -Nur linux-3.18.6/sound/arm/vc_vchi_audioserv_defs.h linux-rpi/sound/arm/vc
+} VC_AUDIO_MSG_T;
+
+#endif // _VC_AUDIO_DEFS_H_
-diff -Nur linux-3.18.6/sound/soc/bcm/bcm2708-i2s.c linux-rpi/sound/soc/bcm/bcm2708-i2s.c
---- linux-3.18.6/sound/soc/bcm/bcm2708-i2s.c 1970-01-01 01:00:00.000000000 +0100
-+++ linux-rpi/sound/soc/bcm/bcm2708-i2s.c 2015-02-09 04:40:48.000000000 +0100
+diff -Nur linux-3.18.8/sound/soc/bcm/bcm2708-i2s.c linux-rpi/sound/soc/bcm/bcm2708-i2s.c
+--- linux-3.18.8/sound/soc/bcm/bcm2708-i2s.c 1970-01-01 01:00:00.000000000 +0100
++++ linux-rpi/sound/soc/bcm/bcm2708-i2s.c 2015-03-05 14:40:19.313715789 +0100
@@ -0,0 +1,1009 @@
+/*
+ * ALSA SoC I2S Audio Layer for Broadcom BCM2708 SoC
@@ -123239,9 +134749,9 @@ diff -Nur linux-3.18.6/sound/soc/bcm/bcm2708-i2s.c linux-rpi/sound/soc/bcm/bcm27
+MODULE_DESCRIPTION("BCM2708 I2S interface");
+MODULE_AUTHOR("Florian Meier <florian.meier@koalo.de>");
+MODULE_LICENSE("GPL v2");
-diff -Nur linux-3.18.6/sound/soc/bcm/bcm2708-i2s.h linux-rpi/sound/soc/bcm/bcm2708-i2s.h
---- linux-3.18.6/sound/soc/bcm/bcm2708-i2s.h 1970-01-01 01:00:00.000000000 +0100
-+++ linux-rpi/sound/soc/bcm/bcm2708-i2s.h 2015-02-09 04:40:48.000000000 +0100
+diff -Nur linux-3.18.8/sound/soc/bcm/bcm2708-i2s.h linux-rpi/sound/soc/bcm/bcm2708-i2s.h
+--- linux-3.18.8/sound/soc/bcm/bcm2708-i2s.h 1970-01-01 01:00:00.000000000 +0100
++++ linux-rpi/sound/soc/bcm/bcm2708-i2s.h 2015-03-05 14:40:19.313715789 +0100
@@ -0,0 +1,35 @@
+/*
+ * I2S configuration for sound cards.
@@ -123278,9 +134788,9 @@ diff -Nur linux-3.18.6/sound/soc/bcm/bcm2708-i2s.h linux-rpi/sound/soc/bcm/bcm27
+extern void bcm2708_i2s_set_gpio(int gpio);
+
+#endif
-diff -Nur linux-3.18.6/sound/soc/bcm/bcm2835-i2s.c linux-rpi/sound/soc/bcm/bcm2835-i2s.c
---- linux-3.18.6/sound/soc/bcm/bcm2835-i2s.c 2015-02-06 15:53:48.000000000 +0100
-+++ linux-rpi/sound/soc/bcm/bcm2835-i2s.c 2015-02-09 04:40:48.000000000 +0100
+diff -Nur linux-3.18.8/sound/soc/bcm/bcm2835-i2s.c linux-rpi/sound/soc/bcm/bcm2835-i2s.c
+--- linux-3.18.8/sound/soc/bcm/bcm2835-i2s.c 2015-02-27 02:49:36.000000000 +0100
++++ linux-rpi/sound/soc/bcm/bcm2835-i2s.c 2015-03-05 14:40:19.313715789 +0100
@@ -861,6 +861,7 @@
{ .compatible = "brcm,bcm2835-i2s", },
{},
@@ -123289,9 +134799,9 @@ diff -Nur linux-3.18.6/sound/soc/bcm/bcm2835-i2s.c linux-rpi/sound/soc/bcm/bcm28
static struct platform_driver bcm2835_i2s_driver = {
.probe = bcm2835_i2s_probe,
-diff -Nur linux-3.18.6/sound/soc/bcm/hifiberry_amp.c linux-rpi/sound/soc/bcm/hifiberry_amp.c
---- linux-3.18.6/sound/soc/bcm/hifiberry_amp.c 1970-01-01 01:00:00.000000000 +0100
-+++ linux-rpi/sound/soc/bcm/hifiberry_amp.c 2015-02-09 04:40:48.000000000 +0100
+diff -Nur linux-3.18.8/sound/soc/bcm/hifiberry_amp.c linux-rpi/sound/soc/bcm/hifiberry_amp.c
+--- linux-3.18.8/sound/soc/bcm/hifiberry_amp.c 1970-01-01 01:00:00.000000000 +0100
++++ linux-rpi/sound/soc/bcm/hifiberry_amp.c 2015-03-05 14:40:19.317715789 +0100
@@ -0,0 +1,127 @@
+/*
+ * ASoC Driver for HifiBerry AMP
@@ -123420,9 +134930,9 @@ diff -Nur linux-3.18.6/sound/soc/bcm/hifiberry_amp.c linux-rpi/sound/soc/bcm/hif
+MODULE_AUTHOR("Sebastian Eickhoff <basti.eickhoff@googlemail.com>");
+MODULE_DESCRIPTION("ASoC driver for HiFiBerry-AMP");
+MODULE_LICENSE("GPL v2");
-diff -Nur linux-3.18.6/sound/soc/bcm/hifiberry_dac.c linux-rpi/sound/soc/bcm/hifiberry_dac.c
---- linux-3.18.6/sound/soc/bcm/hifiberry_dac.c 1970-01-01 01:00:00.000000000 +0100
-+++ linux-rpi/sound/soc/bcm/hifiberry_dac.c 2015-02-09 04:40:48.000000000 +0100
+diff -Nur linux-3.18.8/sound/soc/bcm/hifiberry_dac.c linux-rpi/sound/soc/bcm/hifiberry_dac.c
+--- linux-3.18.8/sound/soc/bcm/hifiberry_dac.c 1970-01-01 01:00:00.000000000 +0100
++++ linux-rpi/sound/soc/bcm/hifiberry_dac.c 2015-03-05 14:40:19.317715789 +0100
@@ -0,0 +1,122 @@
+/*
+ * ASoC Driver for HifiBerry DAC
@@ -123546,9 +135056,9 @@ diff -Nur linux-3.18.6/sound/soc/bcm/hifiberry_dac.c linux-rpi/sound/soc/bcm/hif
+MODULE_AUTHOR("Florian Meier <florian.meier@koalo.de>");
+MODULE_DESCRIPTION("ASoC Driver for HifiBerry DAC");
+MODULE_LICENSE("GPL v2");
-diff -Nur linux-3.18.6/sound/soc/bcm/hifiberry_dacplus.c linux-rpi/sound/soc/bcm/hifiberry_dacplus.c
---- linux-3.18.6/sound/soc/bcm/hifiberry_dacplus.c 1970-01-01 01:00:00.000000000 +0100
-+++ linux-rpi/sound/soc/bcm/hifiberry_dacplus.c 2015-02-09 04:40:48.000000000 +0100
+diff -Nur linux-3.18.8/sound/soc/bcm/hifiberry_dacplus.c linux-rpi/sound/soc/bcm/hifiberry_dacplus.c
+--- linux-3.18.8/sound/soc/bcm/hifiberry_dacplus.c 1970-01-01 01:00:00.000000000 +0100
++++ linux-rpi/sound/soc/bcm/hifiberry_dacplus.c 2015-03-05 14:40:19.317715789 +0100
@@ -0,0 +1,141 @@
+/*
+ * ASoC Driver for HiFiBerry DAC+
@@ -123691,9 +135201,9 @@ diff -Nur linux-3.18.6/sound/soc/bcm/hifiberry_dacplus.c linux-rpi/sound/soc/bcm
+MODULE_AUTHOR("Daniel Matuschek <daniel@hifiberry.com>");
+MODULE_DESCRIPTION("ASoC Driver for HiFiBerry DAC+");
+MODULE_LICENSE("GPL v2");
-diff -Nur linux-3.18.6/sound/soc/bcm/hifiberry_digi.c linux-rpi/sound/soc/bcm/hifiberry_digi.c
---- linux-3.18.6/sound/soc/bcm/hifiberry_digi.c 1970-01-01 01:00:00.000000000 +0100
-+++ linux-rpi/sound/soc/bcm/hifiberry_digi.c 2015-02-09 04:40:48.000000000 +0100
+diff -Nur linux-3.18.8/sound/soc/bcm/hifiberry_digi.c linux-rpi/sound/soc/bcm/hifiberry_digi.c
+--- linux-3.18.8/sound/soc/bcm/hifiberry_digi.c 1970-01-01 01:00:00.000000000 +0100
++++ linux-rpi/sound/soc/bcm/hifiberry_digi.c 2015-03-05 14:40:19.317715789 +0100
@@ -0,0 +1,203 @@
+/*
+ * ASoC Driver for HifiBerry Digi
@@ -123898,9 +135408,9 @@ diff -Nur linux-3.18.6/sound/soc/bcm/hifiberry_digi.c linux-rpi/sound/soc/bcm/hi
+MODULE_AUTHOR("Daniel Matuschek <info@crazy-audio.com>");
+MODULE_DESCRIPTION("ASoC Driver for HifiBerry Digi");
+MODULE_LICENSE("GPL v2");
-diff -Nur linux-3.18.6/sound/soc/bcm/iqaudio-dac.c linux-rpi/sound/soc/bcm/iqaudio-dac.c
---- linux-3.18.6/sound/soc/bcm/iqaudio-dac.c 1970-01-01 01:00:00.000000000 +0100
-+++ linux-rpi/sound/soc/bcm/iqaudio-dac.c 2015-02-09 04:40:48.000000000 +0100
+diff -Nur linux-3.18.8/sound/soc/bcm/iqaudio-dac.c linux-rpi/sound/soc/bcm/iqaudio-dac.c
+--- linux-3.18.8/sound/soc/bcm/iqaudio-dac.c 1970-01-01 01:00:00.000000000 +0100
++++ linux-rpi/sound/soc/bcm/iqaudio-dac.c 2015-03-05 14:40:19.317715789 +0100
@@ -0,0 +1,127 @@
+/*
+ * ASoC Driver for IQaudIO DAC
@@ -124029,9 +135539,9 @@ diff -Nur linux-3.18.6/sound/soc/bcm/iqaudio-dac.c linux-rpi/sound/soc/bcm/iqaud
+MODULE_AUTHOR("Florian Meier <florian.meier@koalo.de>");
+MODULE_DESCRIPTION("ASoC Driver for IQAudio DAC");
+MODULE_LICENSE("GPL v2");
-diff -Nur linux-3.18.6/sound/soc/bcm/Kconfig linux-rpi/sound/soc/bcm/Kconfig
---- linux-3.18.6/sound/soc/bcm/Kconfig 2015-02-06 15:53:48.000000000 +0100
-+++ linux-rpi/sound/soc/bcm/Kconfig 2015-02-09 04:40:48.000000000 +0100
+diff -Nur linux-3.18.8/sound/soc/bcm/Kconfig linux-rpi/sound/soc/bcm/Kconfig
+--- linux-3.18.8/sound/soc/bcm/Kconfig 2015-02-27 02:49:36.000000000 +0100
++++ linux-rpi/sound/soc/bcm/Kconfig 2015-03-05 14:40:19.313715789 +0100
@@ -7,3 +7,56 @@
Say Y or M if you want to add support for codecs attached to
the BCM2835 I2S interface. You will also need
@@ -124089,9 +135599,9 @@ diff -Nur linux-3.18.6/sound/soc/bcm/Kconfig linux-rpi/sound/soc/bcm/Kconfig
+ select SND_SOC_PCM512x_I2C
+ help
+ Say Y or M if you want to add support for IQaudIO-DAC.
-diff -Nur linux-3.18.6/sound/soc/bcm/Makefile linux-rpi/sound/soc/bcm/Makefile
---- linux-3.18.6/sound/soc/bcm/Makefile 2015-02-06 15:53:48.000000000 +0100
-+++ linux-rpi/sound/soc/bcm/Makefile 2015-02-09 04:40:48.000000000 +0100
+diff -Nur linux-3.18.8/sound/soc/bcm/Makefile linux-rpi/sound/soc/bcm/Makefile
+--- linux-3.18.8/sound/soc/bcm/Makefile 2015-02-27 02:49:36.000000000 +0100
++++ linux-rpi/sound/soc/bcm/Makefile 2015-03-05 14:40:19.313715789 +0100
@@ -3,3 +3,22 @@
obj-$(CONFIG_SND_BCM2835_SOC_I2S) += snd-soc-bcm2835-i2s.o
@@ -124115,9 +135625,9 @@ diff -Nur linux-3.18.6/sound/soc/bcm/Makefile linux-rpi/sound/soc/bcm/Makefile
+obj-$(CONFIG_SND_BCM2708_SOC_HIFIBERRY_AMP) += snd-soc-hifiberry-amp.o
+obj-$(CONFIG_SND_BCM2708_SOC_RPI_DAC) += snd-soc-rpi-dac.o
+obj-$(CONFIG_SND_BCM2708_SOC_IQAUDIO_DAC) += snd-soc-iqaudio-dac.o
-diff -Nur linux-3.18.6/sound/soc/bcm/rpi-dac.c linux-rpi/sound/soc/bcm/rpi-dac.c
---- linux-3.18.6/sound/soc/bcm/rpi-dac.c 1970-01-01 01:00:00.000000000 +0100
-+++ linux-rpi/sound/soc/bcm/rpi-dac.c 2015-02-09 04:40:48.000000000 +0100
+diff -Nur linux-3.18.8/sound/soc/bcm/rpi-dac.c linux-rpi/sound/soc/bcm/rpi-dac.c
+--- linux-3.18.8/sound/soc/bcm/rpi-dac.c 1970-01-01 01:00:00.000000000 +0100
++++ linux-rpi/sound/soc/bcm/rpi-dac.c 2015-03-05 14:40:19.317715789 +0100
@@ -0,0 +1,97 @@
+/*
+ * ASoC Driver for RPi-DAC.
@@ -124216,9 +135726,9 @@ diff -Nur linux-3.18.6/sound/soc/bcm/rpi-dac.c linux-rpi/sound/soc/bcm/rpi-dac.c
+MODULE_AUTHOR("Florian Meier <florian.meier@koalo.de>");
+MODULE_DESCRIPTION("ASoC Driver for RPi-DAC");
+MODULE_LICENSE("GPL v2");
-diff -Nur linux-3.18.6/sound/soc/codecs/Kconfig linux-rpi/sound/soc/codecs/Kconfig
---- linux-3.18.6/sound/soc/codecs/Kconfig 2015-02-06 15:53:48.000000000 +0100
-+++ linux-rpi/sound/soc/codecs/Kconfig 2015-02-09 04:40:48.000000000 +0100
+diff -Nur linux-3.18.8/sound/soc/codecs/Kconfig linux-rpi/sound/soc/codecs/Kconfig
+--- linux-3.18.8/sound/soc/codecs/Kconfig 2015-02-27 02:49:36.000000000 +0100
++++ linux-rpi/sound/soc/codecs/Kconfig 2015-03-05 14:40:19.317715789 +0100
@@ -80,6 +80,8 @@
select SND_SOC_PCM512x_I2C if I2C
select SND_SOC_PCM512x_SPI if SPI_MASTER
@@ -124259,9 +135769,9 @@ diff -Nur linux-3.18.6/sound/soc/codecs/Kconfig linux-rpi/sound/soc/codecs/Kconf
config SND_SOC_TLV320AIC23
tristate
-diff -Nur linux-3.18.6/sound/soc/codecs/Makefile linux-rpi/sound/soc/codecs/Makefile
---- linux-3.18.6/sound/soc/codecs/Makefile 2015-02-06 15:53:48.000000000 +0100
-+++ linux-rpi/sound/soc/codecs/Makefile 2015-02-09 04:40:48.000000000 +0100
+diff -Nur linux-3.18.8/sound/soc/codecs/Makefile linux-rpi/sound/soc/codecs/Makefile
+--- linux-3.18.8/sound/soc/codecs/Makefile 2015-02-27 02:49:36.000000000 +0100
++++ linux-rpi/sound/soc/codecs/Makefile 2015-03-05 14:40:19.317715789 +0100
@@ -74,6 +74,8 @@
snd-soc-pcm512x-spi-objs := pcm512x-spi.o
snd-soc-rl6231-objs := rl6231.o
@@ -124296,9 +135806,9 @@ diff -Nur linux-3.18.6/sound/soc/codecs/Makefile linux-rpi/sound/soc/codecs/Make
obj-$(CONFIG_SND_SOC_TLV320AIC23) += snd-soc-tlv320aic23.o
obj-$(CONFIG_SND_SOC_TLV320AIC23_I2C) += snd-soc-tlv320aic23-i2c.o
obj-$(CONFIG_SND_SOC_TLV320AIC23_SPI) += snd-soc-tlv320aic23-spi.o
-diff -Nur linux-3.18.6/sound/soc/codecs/pcm1794a.c linux-rpi/sound/soc/codecs/pcm1794a.c
---- linux-3.18.6/sound/soc/codecs/pcm1794a.c 1970-01-01 01:00:00.000000000 +0100
-+++ linux-rpi/sound/soc/codecs/pcm1794a.c 2015-02-09 04:40:48.000000000 +0100
+diff -Nur linux-3.18.8/sound/soc/codecs/pcm1794a.c linux-rpi/sound/soc/codecs/pcm1794a.c
+--- linux-3.18.8/sound/soc/codecs/pcm1794a.c 1970-01-01 01:00:00.000000000 +0100
++++ linux-rpi/sound/soc/codecs/pcm1794a.c 2015-03-05 14:40:19.325715789 +0100
@@ -0,0 +1,62 @@
+/*
+ * Driver for the PCM1794A codec
@@ -124362,9 +135872,9 @@ diff -Nur linux-3.18.6/sound/soc/codecs/pcm1794a.c linux-rpi/sound/soc/codecs/pc
+MODULE_DESCRIPTION("ASoC PCM1794A codec driver");
+MODULE_AUTHOR("Florian Meier <florian.meier@koalo.de>");
+MODULE_LICENSE("GPL v2");
-diff -Nur linux-3.18.6/sound/soc/codecs/pcm5102a.c linux-rpi/sound/soc/codecs/pcm5102a.c
---- linux-3.18.6/sound/soc/codecs/pcm5102a.c 1970-01-01 01:00:00.000000000 +0100
-+++ linux-rpi/sound/soc/codecs/pcm5102a.c 2015-02-09 04:40:48.000000000 +0100
+diff -Nur linux-3.18.8/sound/soc/codecs/pcm5102a.c linux-rpi/sound/soc/codecs/pcm5102a.c
+--- linux-3.18.8/sound/soc/codecs/pcm5102a.c 1970-01-01 01:00:00.000000000 +0100
++++ linux-rpi/sound/soc/codecs/pcm5102a.c 2015-03-05 14:40:19.325715789 +0100
@@ -0,0 +1,70 @@
+/*
+ * Driver for the PCM5102A codec
@@ -124436,9 +135946,9 @@ diff -Nur linux-3.18.6/sound/soc/codecs/pcm5102a.c linux-rpi/sound/soc/codecs/pc
+MODULE_DESCRIPTION("ASoC PCM5102A codec driver");
+MODULE_AUTHOR("Florian Meier <florian.meier@koalo.de>");
+MODULE_LICENSE("GPL v2");
-diff -Nur linux-3.18.6/sound/soc/codecs/pcm512x.c linux-rpi/sound/soc/codecs/pcm512x.c
---- linux-3.18.6/sound/soc/codecs/pcm512x.c 2015-02-06 15:53:48.000000000 +0100
-+++ linux-rpi/sound/soc/codecs/pcm512x.c 2015-02-09 04:40:48.000000000 +0100
+diff -Nur linux-3.18.8/sound/soc/codecs/pcm512x.c linux-rpi/sound/soc/codecs/pcm512x.c
+--- linux-3.18.8/sound/soc/codecs/pcm512x.c 2015-02-27 02:49:36.000000000 +0100
++++ linux-rpi/sound/soc/codecs/pcm512x.c 2015-03-05 14:40:19.325715789 +0100
@@ -259,8 +259,8 @@
pcm512x_ramp_step_text);
@@ -124450,9 +135960,9 @@ diff -Nur linux-3.18.6/sound/soc/codecs/pcm512x.c linux-rpi/sound/soc/codecs/pcm
SOC_DOUBLE_TLV("Playback Volume", PCM512x_ANALOG_GAIN_CTRL,
PCM512x_LAGN_SHIFT, PCM512x_RAGN_SHIFT, 1, 1, analog_tlv),
SOC_DOUBLE_TLV("Playback Boost Volume", PCM512x_ANALOG_GAIN_BOOST,
-diff -Nur linux-3.18.6/sound/soc/codecs/tas5713.c linux-rpi/sound/soc/codecs/tas5713.c
---- linux-3.18.6/sound/soc/codecs/tas5713.c 1970-01-01 01:00:00.000000000 +0100
-+++ linux-rpi/sound/soc/codecs/tas5713.c 2015-02-09 04:40:48.000000000 +0100
+diff -Nur linux-3.18.8/sound/soc/codecs/tas5713.c linux-rpi/sound/soc/codecs/tas5713.c
+--- linux-3.18.8/sound/soc/codecs/tas5713.c 1970-01-01 01:00:00.000000000 +0100
++++ linux-rpi/sound/soc/codecs/tas5713.c 2015-03-05 14:40:19.333715789 +0100
@@ -0,0 +1,369 @@
+/*
+ * ASoC Driver for TAS5713
@@ -124823,9 +136333,9 @@ diff -Nur linux-3.18.6/sound/soc/codecs/tas5713.c linux-rpi/sound/soc/codecs/tas
+MODULE_AUTHOR("Sebastian Eickhoff <basti.eickhoff@googlemail.com>");
+MODULE_DESCRIPTION("ASoC driver for TAS5713");
+MODULE_LICENSE("GPL v2");
-diff -Nur linux-3.18.6/sound/soc/codecs/tas5713.h linux-rpi/sound/soc/codecs/tas5713.h
---- linux-3.18.6/sound/soc/codecs/tas5713.h 1970-01-01 01:00:00.000000000 +0100
-+++ linux-rpi/sound/soc/codecs/tas5713.h 2015-02-09 04:40:48.000000000 +0100
+diff -Nur linux-3.18.8/sound/soc/codecs/tas5713.h linux-rpi/sound/soc/codecs/tas5713.h
+--- linux-3.18.8/sound/soc/codecs/tas5713.h 1970-01-01 01:00:00.000000000 +0100
++++ linux-rpi/sound/soc/codecs/tas5713.h 2015-03-05 14:40:19.333715789 +0100
@@ -0,0 +1,210 @@
+/*
+ * ASoC Driver for TAS5713
@@ -125037,9 +136547,9 @@ diff -Nur linux-3.18.6/sound/soc/codecs/tas5713.h linux-rpi/sound/soc/codecs/tas
+
+
+#endif /* _TAS5713_H */
-diff -Nur linux-3.18.6/sound/soc/codecs/wm8804.c linux-rpi/sound/soc/codecs/wm8804.c
---- linux-3.18.6/sound/soc/codecs/wm8804.c 2015-02-06 15:53:48.000000000 +0100
-+++ linux-rpi/sound/soc/codecs/wm8804.c 2015-02-09 04:40:48.000000000 +0100
+diff -Nur linux-3.18.8/sound/soc/codecs/wm8804.c linux-rpi/sound/soc/codecs/wm8804.c
+--- linux-3.18.8/sound/soc/codecs/wm8804.c 2015-02-27 02:49:36.000000000 +0100
++++ linux-rpi/sound/soc/codecs/wm8804.c 2015-03-05 14:40:19.341715789 +0100
@@ -278,6 +278,7 @@
blen = 0x1;
break;
diff --git a/target/arm/bcm28xx/patches/3.18.8/0002-allow-to-control-volume-for-each-channel.patch b/target/arm/bcm28xx/patches/3.18.8/0002-allow-to-control-volume-for-each-channel.patch
deleted file mode 100644
index 76634e2e8..000000000
--- a/target/arm/bcm28xx/patches/3.18.8/0002-allow-to-control-volume-for-each-channel.patch
+++ /dev/null
@@ -1,26 +0,0 @@
-From 05ca0b1b73f368564aef8cc4763e96a218cfefeb Mon Sep 17 00:00:00 2001
-From: Waldemar Brodkorb <wbrodkorb@conet.de>
-Date: Mon, 2 Feb 2015 09:51:56 +0100
-Subject: [PATCH 2/2] allow to control volume for each channel
-
-Signed-off-by: Waldemar Brodkorb <wbrodkorb@conet.de>
----
- sound/arm/bcm2835-ctl.c | 2 +-
- 1 file changed, 1 insertion(+), 1 deletion(-)
-
-diff --git a/sound/arm/bcm2835-ctl.c b/sound/arm/bcm2835-ctl.c
-index aad905f..12e77f5 100755
---- a/sound/arm/bcm2835-ctl.c
-+++ b/sound/arm/bcm2835-ctl.c
-@@ -45,7 +45,7 @@ static int snd_bcm2835_ctl_info(struct snd_kcontrol *kcontrol,
- audio_info(" ... IN\n");
- if (kcontrol->private_value == PCM_PLAYBACK_VOLUME) {
- uinfo->type = SNDRV_CTL_ELEM_TYPE_INTEGER;
-- uinfo->count = 1;
-+ uinfo->count = 2;
- uinfo->value.integer.min = CTRL_VOL_MIN;
- uinfo->value.integer.max = CTRL_VOL_MAX; /* 2303 */
- } else if (kcontrol->private_value == PCM_PLAYBACK_MUTE) {
---
-1.9.1
-
diff --git a/target/arm/bcm28xx/patches/3.18.8/0002-enable-MMAP-by-default-allow-overide-via-use_mmap.patch b/target/arm/bcm28xx/patches/3.18.8/0002-enable-MMAP-by-default-allow-overide-via-use_mmap.patch
new file mode 100644
index 000000000..a476a7825
--- /dev/null
+++ b/target/arm/bcm28xx/patches/3.18.8/0002-enable-MMAP-by-default-allow-overide-via-use_mmap.patch
@@ -0,0 +1,37 @@
+diff -Nur linux-3.18.6.orig/sound/soc/bcm/bcm2708-i2s.c linux-3.18.6/sound/soc/bcm/bcm2708-i2s.c
+--- linux-3.18.6.orig/sound/soc/bcm/bcm2708-i2s.c 2015-02-12 12:00:42.809186343 +0100
++++ linux-3.18.6/sound/soc/bcm/bcm2708-i2s.c 2015-02-12 13:35:35.929213859 +0100
+@@ -171,6 +171,11 @@
+ /* I2S pin configuration */
+ static int bcm2708_i2s_gpio=BCM2708_I2S_GPIO_AUTO;
+
++static bool use_mmap = 1;
++module_param(use_mmap, bool, S_IRUGO);
++MODULE_PARM_DESC(use_mmap, "Use MMAP");
++
++
+ /* General device struct */
+ struct bcm2708_i2s_dev {
+ struct device *dev;
+@@ -874,7 +879,7 @@
+ .name = "bcm2708-i2s-comp",
+ };
+
+-static const struct snd_pcm_hardware bcm2708_pcm_hardware = {
++static struct snd_pcm_hardware bcm2708_pcm_hardware = {
+ .info = SNDRV_PCM_INFO_INTERLEAVED |
+ SNDRV_PCM_INFO_JOINT_DUPLEX,
+ .formats = SNDRV_PCM_FMTBIT_S16_LE |
+@@ -966,6 +971,12 @@
+ return ret;
+ }
+
++ if (use_mmap) {
++ printk("Enable ALSA MMAP support for I2S\n");
++ bcm2708_pcm_hardware.info |= SNDRV_PCM_INFO_MMAP;
++ bcm2708_pcm_hardware.info |= SNDRV_PCM_INFO_MMAP_VALID;
++ }
++
+ ret = snd_dmaengine_pcm_register(&pdev->dev,
+ &bcm2708_dmaengine_pcm_config,
+ SND_DMAENGINE_PCM_FLAG_COMPAT);