From a7fb62873e9c07443c920a413add27908562ca76 Mon Sep 17 00:00:00 2001 From: Josh Boyer Date: Jun 11 2014 17:36:24 +0000 Subject: Linux v3.15-7218-g3f17ea6dea8b - Reenable debugging options. --- diff --git a/0001-ARM-sunxi-Add-driver-for-SD-MMC-hosts-found-on-Allwi.patch b/0001-ARM-sunxi-Add-driver-for-SD-MMC-hosts-found-on-Allwi.patch deleted file mode 100644 index de00606..0000000 --- a/0001-ARM-sunxi-Add-driver-for-SD-MMC-hosts-found-on-Allwi.patch +++ /dev/null @@ -1,2201 +0,0 @@ -From 528a5cd576861f90f51398c707c602a79623492d Mon Sep 17 00:00:00 2001 -From: Hans de Goede -Date: Thu, 5 Sep 2013 19:52:41 -0300 -Subject: [PATCH] ARM: sunxi: Add driver for SD/MMC hosts found on Allwinner - sunxi SoCs -MIME-Version: 1.0 -Content-Type: text/plain; charset=UTF-8 -Content-Transfer-Encoding: 8bit - -The Allwinner sunxi mmc host uses dma in bus-master mode using a built-in -designware idmac controller, which is identical to the one found in the mmc-dw -hosts. However the rest of the host is not identical to mmc-dw, it deals with -sending stop commands in hardware which makes it significantly different -from the mmc-dw devices. - -Signed-off-by: David Lanzendörfer -Signed-off-by: Emilio López -Signed-off-by: Hans de Goede ---- - .../devicetree/bindings/mmc/sunxi-mmc.txt | 43 + - arch/arm/boot/dts/Makefile | 1 + - arch/arm/boot/dts/sun4i-a10-a1000.dts | 9 + - arch/arm/boot/dts/sun4i-a10-cubieboard.dts | 9 + - arch/arm/boot/dts/sun4i-a10-hackberry.dts | 9 + - arch/arm/boot/dts/sun4i-a10-inet97fv2.dts | 9 + - arch/arm/boot/dts/sun4i-a10-mini-xplus.dts | 9 + - arch/arm/boot/dts/sun4i-a10-olinuxino-lime.dts | 9 + - arch/arm/boot/dts/sun4i-a10-pcduino.dts | 9 + - arch/arm/boot/dts/sun4i-a10.dtsi | 50 + - arch/arm/boot/dts/sun5i-a10s-olinuxino-micro.dts | 32 + - arch/arm/boot/dts/sun5i-a10s.dtsi | 41 + - arch/arm/boot/dts/sun5i-a13-olinuxino-micro.dts | 16 + - arch/arm/boot/dts/sun5i-a13-olinuxino.dts | 16 + - arch/arm/boot/dts/sun5i-a13.dtsi | 25 + - arch/arm/boot/dts/sun6i-a31-m9.dts | 46 + - arch/arm/boot/dts/sun6i-a31.dtsi | 91 ++ - arch/arm/boot/dts/sun7i-a20-cubieboard2.dts | 9 + - arch/arm/boot/dts/sun7i-a20-cubietruck.dts | 40 + - arch/arm/boot/dts/sun7i-a20-olinuxino-micro.dts | 25 + - arch/arm/boot/dts/sun7i-a20.dtsi | 57 + - drivers/clk/sunxi/clk-factors.c | 36 + - drivers/clk/sunxi/clk-sunxi.c | 36 + - drivers/mmc/host/Kconfig | 7 + - drivers/mmc/host/Makefile | 2 + - drivers/mmc/host/sunxi-mmc.c | 1125 ++++++++++++++++++++ - include/linux/clk/sunxi.h | 22 + - 27 files changed, 1783 insertions(+) - create mode 100644 Documentation/devicetree/bindings/mmc/sunxi-mmc.txt - create mode 100644 arch/arm/boot/dts/sun6i-a31-m9.dts - create mode 100644 drivers/mmc/host/sunxi-mmc.c - create mode 100644 include/linux/clk/sunxi.h - -diff --git a/Documentation/devicetree/bindings/mmc/sunxi-mmc.txt b/Documentation/devicetree/bindings/mmc/sunxi-mmc.txt -new file mode 100644 -index 0000000..f0c06e7 ---- /dev/null -+++ b/Documentation/devicetree/bindings/mmc/sunxi-mmc.txt -@@ -0,0 +1,43 @@ -+* Allwinner sunxi MMC controller -+ -+The highspeed MMC host controller on Allwinner SoCs provides an interface -+for MMC, SD and SDIO types of memory cards. -+ -+Supported maximum speeds are the ones of the eMMC standard 4.5 as well -+as the speed of SD standard 3.0. -+Absolute maximum transfer rate is 200MB/s -+ -+Required properties: -+ - compatible : "allwinner,sun4i-a10-mmc" or "allwinner,sun5i-a13-mmc" -+ - reg : mmc controller base registers -+ - clocks : a list with 2 phandle + clock specifier pairs -+ - clock-names : must contain "ahb" and "mod" -+ - interrupts : mmc controller interrupt -+ -+Optional properties: -+ - resets : phandle + reset specifier pair -+ - reset-names : must contain "ahb" -+ - for cd, bus-width and additional generic mmc parameters -+ please refer to mmc.txt within this directory -+ -+Examples: -+ - Within .dtsi: -+ mmc0: mmc@01c0f000 { -+ compatible = "allwinner,sun5i-a13-mmc"; -+ reg = <0x01c0f000 0x1000>; -+ clocks = <&ahb_gates 8>, <&mmc0_clk>; -+ clock-names = "ahb", "mod"; -+ interrupts = <0 32 4>; -+ status = "disabled"; -+ }; -+ -+ - Within dts: -+ mmc0: mmc@01c0f000 { -+ pinctrl-names = "default", "default"; -+ pinctrl-0 = <&mmc0_pins_a>; -+ pinctrl-1 = <&mmc0_cd_pin_reference_design>; -+ bus-width = <4>; -+ cd-gpios = <&pio 7 1 0>; /* PH1 */ -+ cd-inverted; -+ status = "okay"; -+ }; -diff --git a/arch/arm/boot/dts/Makefile b/arch/arm/boot/dts/Makefile -index 35c146f..1cd137d 100644 ---- a/arch/arm/boot/dts/Makefile -+++ b/arch/arm/boot/dts/Makefile -@@ -351,6 +351,7 @@ dtb-$(CONFIG_ARCH_SUNXI) += \ - sun5i-a13-olinuxino.dtb \ - sun5i-a13-olinuxino-micro.dtb \ - sun6i-a31-colombus.dtb \ -+ sun6i-a31-m9.dtb \ - sun7i-a20-cubieboard2.dtb \ - sun7i-a20-cubietruck.dtb \ - sun7i-a20-olinuxino-micro.dtb -diff --git a/arch/arm/boot/dts/sun4i-a10-a1000.dts b/arch/arm/boot/dts/sun4i-a10-a1000.dts -index fa746aea..3056db5 100644 ---- a/arch/arm/boot/dts/sun4i-a10-a1000.dts -+++ b/arch/arm/boot/dts/sun4i-a10-a1000.dts -@@ -36,6 +36,15 @@ - }; - }; - -+ mmc0: mmc@01c0f000 { -+ pinctrl-names = "default"; -+ pinctrl-0 = <&mmc0_pins_a>, <&mmc0_cd_pin_a>; -+ bus-width = <4>; -+ cd-gpios = <&pio 7 1 0>; /* PH1 */ -+ cd-inverted; -+ status = "okay"; -+ }; -+ - usbphy: phy@01c13400 { - usb1_vbus-supply = <®_usb1_vbus>; - usb2_vbus-supply = <®_usb2_vbus>; -diff --git a/arch/arm/boot/dts/sun4i-a10-cubieboard.dts b/arch/arm/boot/dts/sun4i-a10-cubieboard.dts -index 4684cbe..ad9321b 100644 ---- a/arch/arm/boot/dts/sun4i-a10-cubieboard.dts -+++ b/arch/arm/boot/dts/sun4i-a10-cubieboard.dts -@@ -34,6 +34,15 @@ - }; - }; - -+ mmc0: mmc@01c0f000 { -+ pinctrl-names = "default"; -+ pinctrl-0 = <&mmc0_pins_a>, <&mmc0_cd_pin_a>; -+ bus-width = <4>; -+ cd-gpios = <&pio 7 1 0>; /* PH1 */ -+ cd-inverted; -+ status = "okay"; -+ }; -+ - usbphy: phy@01c13400 { - usb1_vbus-supply = <®_usb1_vbus>; - usb2_vbus-supply = <®_usb2_vbus>; -diff --git a/arch/arm/boot/dts/sun4i-a10-hackberry.dts b/arch/arm/boot/dts/sun4i-a10-hackberry.dts -index d7c17e4..62defd5 100644 ---- a/arch/arm/boot/dts/sun4i-a10-hackberry.dts -+++ b/arch/arm/boot/dts/sun4i-a10-hackberry.dts -@@ -36,6 +36,15 @@ - }; - }; - -+ mmc0: mmc@01c0f000 { -+ pinctrl-names = "default"; -+ pinctrl-0 = <&mmc0_pins_a>, <&mmc0_cd_pin_a>; -+ bus-width = <4>; -+ cd-gpios = <&pio 7 1 0>; /* PH1 */ -+ cd-inverted; -+ status = "okay"; -+ }; -+ - usbphy: phy@01c13400 { - usb1_vbus-supply = <®_usb1_vbus>; - usb2_vbus-supply = <®_usb2_vbus>; -diff --git a/arch/arm/boot/dts/sun4i-a10-inet97fv2.dts b/arch/arm/boot/dts/sun4i-a10-inet97fv2.dts -index fe9272e..d1a9e34 100644 ---- a/arch/arm/boot/dts/sun4i-a10-inet97fv2.dts -+++ b/arch/arm/boot/dts/sun4i-a10-inet97fv2.dts -@@ -24,6 +24,15 @@ - }; - - soc@01c00000 { -+ mmc0: mmc@01c0f000 { -+ pinctrl-names = "default"; -+ pinctrl-0 = <&mmc0_pins_a>, <&mmc0_cd_pin_a>; -+ bus-width = <4>; -+ cd-gpios = <&pio 7 1 0>; /* PH1 */ -+ cd-inverted; -+ status = "okay"; -+ }; -+ - uart0: serial@01c28000 { - pinctrl-names = "default"; - pinctrl-0 = <&uart0_pins_a>; -diff --git a/arch/arm/boot/dts/sun4i-a10-mini-xplus.dts b/arch/arm/boot/dts/sun4i-a10-mini-xplus.dts -index dd84a9e..07a598f 100644 ---- a/arch/arm/boot/dts/sun4i-a10-mini-xplus.dts -+++ b/arch/arm/boot/dts/sun4i-a10-mini-xplus.dts -@@ -20,6 +20,15 @@ - compatible = "pineriver,mini-xplus", "allwinner,sun4i-a10"; - - soc@01c00000 { -+ mmc0: mmc@01c0f000 { -+ pinctrl-names = "default"; -+ pinctrl-0 = <&mmc0_pins_a>, <&mmc0_cd_pin_a>; -+ bus-width = <4>; -+ cd-gpios = <&pio 7 1 0>; /* PH1 */ -+ cd-inverted; -+ status = "okay"; -+ }; -+ - usbphy: phy@01c13400 { - usb1_vbus-supply = <®_usb1_vbus>; - usb2_vbus-supply = <®_usb2_vbus>; -diff --git a/arch/arm/boot/dts/sun4i-a10-olinuxino-lime.dts b/arch/arm/boot/dts/sun4i-a10-olinuxino-lime.dts -index 66cf0c7..8d5d321 100644 ---- a/arch/arm/boot/dts/sun4i-a10-olinuxino-lime.dts -+++ b/arch/arm/boot/dts/sun4i-a10-olinuxino-lime.dts -@@ -33,6 +33,15 @@ - }; - }; - -+ mmc0: mmc@01c0f000 { -+ pinctrl-names = "default"; -+ pinctrl-0 = <&mmc0_pins_a>, <&mmc0_cd_pin_a>; -+ bus-width = <4>; -+ cd-gpios = <&pio 7 1 0>; /* PH1 */ -+ cd-inverted; -+ status = "okay"; -+ }; -+ - usbphy: phy@01c13400 { - usb1_vbus-supply = <®_usb1_vbus>; - usb2_vbus-supply = <®_usb2_vbus>; -diff --git a/arch/arm/boot/dts/sun4i-a10-pcduino.dts b/arch/arm/boot/dts/sun4i-a10-pcduino.dts -index 255b47e..ce02086 100644 ---- a/arch/arm/boot/dts/sun4i-a10-pcduino.dts -+++ b/arch/arm/boot/dts/sun4i-a10-pcduino.dts -@@ -34,6 +34,15 @@ - }; - }; - -+ mmc0: mmc@01c0f000 { -+ pinctrl-names = "default"; -+ pinctrl-0 = <&mmc0_pins_a>, <&mmc0_cd_pin_a>; -+ bus-width = <4>; -+ cd-gpios = <&pio 7 1 0>; /* PH1 */ -+ cd-inverted; -+ status = "okay"; -+ }; -+ - usbphy: phy@01c13400 { - usb1_vbus-supply = <®_usb1_vbus>; - usb2_vbus-supply = <®_usb2_vbus>; -diff --git a/arch/arm/boot/dts/sun4i-a10.dtsi b/arch/arm/boot/dts/sun4i-a10.dtsi -index 9174724..29fd4f5 100644 ---- a/arch/arm/boot/dts/sun4i-a10.dtsi -+++ b/arch/arm/boot/dts/sun4i-a10.dtsi -@@ -377,6 +377,42 @@ - #size-cells = <0>; - }; - -+ mmc0: mmc@01c0f000 { -+ compatible = "allwinner,sun4i-a10-mmc"; -+ reg = <0x01c0f000 0x1000>; -+ clocks = <&ahb_gates 8>, <&mmc0_clk>; -+ clock-names = "ahb", "mod"; -+ interrupts = <32>; -+ status = "disabled"; -+ }; -+ -+ mmc1: mmc@01c10000 { -+ compatible = "allwinner,sun4i-a10-mmc"; -+ reg = <0x01c10000 0x1000>; -+ clocks = <&ahb_gates 9>, <&mmc1_clk>; -+ clock-names = "ahb", "mod"; -+ interrupts = <33>; -+ status = "disabled"; -+ }; -+ -+ mmc2: mmc@01c11000 { -+ compatible = "allwinner,sun4i-a10-mmc"; -+ reg = <0x01c11000 0x1000>; -+ clocks = <&ahb_gates 10>, <&mmc2_clk>; -+ clock-names = "ahb", "mod"; -+ interrupts = <34>; -+ status = "disabled"; -+ }; -+ -+ mmc3: mmc@01c12000 { -+ compatible = "allwinner,sun4i-a10-mmc"; -+ reg = <0x01c12000 0x1000>; -+ clocks = <&ahb_gates 11>, <&mmc3_clk>; -+ clock-names = "ahb", "mod"; -+ interrupts = <35>; -+ status = "disabled"; -+ }; -+ - usbphy: phy@01c13400 { - #phy-cells = <1>; - compatible = "allwinner,sun4i-a10-usb-phy"; -@@ -529,6 +565,20 @@ - allwinner,drive = <0>; - allwinner,pull = <0>; - }; -+ -+ mmc0_pins_a: mmc0@0 { -+ allwinner,pins = "PF0","PF1","PF2","PF3","PF4","PF5"; -+ allwinner,function = "mmc0"; -+ allwinner,drive = <2>; -+ allwinner,pull = <0>; -+ }; -+ -+ mmc0_cd_pin_a: mmc0_cd_pin@0 { -+ allwinner,pins = "PH1"; -+ allwinner,function = "gpio_in"; -+ allwinner,drive = <0>; -+ allwinner,pull = <1>; -+ }; - }; - - timer@01c20c00 { -diff --git a/arch/arm/boot/dts/sun5i-a10s-olinuxino-micro.dts b/arch/arm/boot/dts/sun5i-a10s-olinuxino-micro.dts -index 23611b7..de91308 100644 ---- a/arch/arm/boot/dts/sun5i-a10s-olinuxino-micro.dts -+++ b/arch/arm/boot/dts/sun5i-a10s-olinuxino-micro.dts -@@ -35,6 +35,24 @@ - }; - }; - -+ mmc0: mmc@01c0f000 { -+ pinctrl-names = "default"; -+ pinctrl-0 = <&mmc0_pins_a>, <&mmc0_cd_pin_olinuxino_micro>; -+ bus-width = <4>; -+ cd-gpios = <&pio 6 1 0>; /* PG1 */ -+ cd-inverted; -+ status = "okay"; -+ }; -+ -+ mmc1: mmc@01c10000 { -+ pinctrl-names = "default"; -+ pinctrl-0 = <&mmc1_pins_a>, <&mmc1_cd_pin_olinuxino_micro>; -+ bus-width = <4>; -+ cd-gpios = <&pio 6 13 0>; /* PG13 */ -+ cd-inverted; -+ status = "okay"; -+ }; -+ - usbphy: phy@01c13400 { - usb1_vbus-supply = <®_usb1_vbus>; - status = "okay"; -@@ -49,6 +67,20 @@ - }; - - pinctrl@01c20800 { -+ mmc0_cd_pin_olinuxino_micro: mmc0_cd_pin@0 { -+ allwinner,pins = "PG1"; -+ allwinner,function = "gpio_in"; -+ allwinner,drive = <0>; -+ allwinner,pull = <1>; -+ }; -+ -+ mmc1_cd_pin_olinuxino_micro: mmc1_cd_pin@0 { -+ allwinner,pins = "PG13"; -+ allwinner,function = "gpio_in"; -+ allwinner,drive = <0>; -+ allwinner,pull = <1>; -+ }; -+ - led_pins_olinuxino: led_pins@0 { - allwinner,pins = "PE3"; - allwinner,function = "gpio_out"; -diff --git a/arch/arm/boot/dts/sun5i-a10s.dtsi b/arch/arm/boot/dts/sun5i-a10s.dtsi -index 79989ed..fb345c2 100644 ---- a/arch/arm/boot/dts/sun5i-a10s.dtsi -+++ b/arch/arm/boot/dts/sun5i-a10s.dtsi -@@ -338,6 +338,33 @@ - #size-cells = <0>; - }; - -+ mmc0: mmc@01c0f000 { -+ compatible = "allwinner,sun5i-a13-mmc"; -+ reg = <0x01c0f000 0x1000>; -+ clocks = <&ahb_gates 8>, <&mmc0_clk>; -+ clock-names = "ahb", "mod"; -+ interrupts = <32>; -+ status = "disabled"; -+ }; -+ -+ mmc1: mmc@01c10000 { -+ compatible = "allwinner,sun5i-a13-mmc"; -+ reg = <0x01c10000 0x1000>; -+ clocks = <&ahb_gates 9>, <&mmc1_clk>; -+ clock-names = "ahb", "mod"; -+ interrupts = <33>; -+ status = "disabled"; -+ }; -+ -+ mmc2: mmc@01c11000 { -+ compatible = "allwinner,sun5i-a13-mmc"; -+ reg = <0x01c11000 0x1000>; -+ clocks = <&ahb_gates 10>, <&mmc2_clk>; -+ clock-names = "ahb", "mod"; -+ interrupts = <34>; -+ status = "disabled"; -+ }; -+ - usbphy: phy@01c13400 { - #phy-cells = <1>; - compatible = "allwinner,sun5i-a13-usb-phy"; -@@ -451,6 +478,20 @@ - allwinner,drive = <0>; - allwinner,pull = <0>; - }; -+ -+ mmc0_pins_a: mmc0@0 { -+ allwinner,pins = "PF0","PF1","PF2","PF3","PF4","PF5"; -+ allwinner,function = "mmc0"; -+ allwinner,drive = <2>; -+ allwinner,pull = <0>; -+ }; -+ -+ mmc1_pins_a: mmc1@0 { -+ allwinner,pins = "PG3","PG4","PG5","PG6","PG7","PG8"; -+ allwinner,function = "mmc1"; -+ allwinner,drive = <2>; -+ allwinner,pull = <0>; -+ }; - }; - - timer@01c20c00 { -diff --git a/arch/arm/boot/dts/sun5i-a13-olinuxino-micro.dts b/arch/arm/boot/dts/sun5i-a13-olinuxino-micro.dts -index 11169d5..8515f19 100644 ---- a/arch/arm/boot/dts/sun5i-a13-olinuxino-micro.dts -+++ b/arch/arm/boot/dts/sun5i-a13-olinuxino-micro.dts -@@ -21,6 +21,15 @@ - compatible = "olimex,a13-olinuxino-micro", "allwinner,sun5i-a13"; - - soc@01c00000 { -+ mmc0: mmc@01c0f000 { -+ pinctrl-names = "default"; -+ pinctrl-0 = <&mmc0_pins_a>, <&mmc0_cd_pin_olinuxinom>; -+ bus-width = <4>; -+ cd-gpios = <&pio 6 0 0>; /* PG0 */ -+ cd-inverted; -+ status = "okay"; -+ }; -+ - usbphy: phy@01c13400 { - usb1_vbus-supply = <®_usb1_vbus>; - status = "okay"; -@@ -35,6 +44,13 @@ - }; - - pinctrl@01c20800 { -+ mmc0_cd_pin_olinuxinom: mmc0_cd_pin@0 { -+ allwinner,pins = "PG0"; -+ allwinner,function = "gpio_in"; -+ allwinner,drive = <0>; -+ allwinner,pull = <1>; -+ }; -+ - led_pins_olinuxinom: led_pins@0 { - allwinner,pins = "PG9"; - allwinner,function = "gpio_out"; -diff --git a/arch/arm/boot/dts/sun5i-a13-olinuxino.dts b/arch/arm/boot/dts/sun5i-a13-olinuxino.dts -index 7a9187b..51a9438 100644 ---- a/arch/arm/boot/dts/sun5i-a13-olinuxino.dts -+++ b/arch/arm/boot/dts/sun5i-a13-olinuxino.dts -@@ -20,6 +20,15 @@ - compatible = "olimex,a13-olinuxino", "allwinner,sun5i-a13"; - - soc@01c00000 { -+ mmc0: mmc@01c0f000 { -+ pinctrl-names = "default"; -+ pinctrl-0 = <&mmc0_pins_a>, <&mmc0_cd_pin_olinuxino>; -+ bus-width = <4>; -+ cd-gpios = <&pio 6 0 0>; /* PG0 */ -+ cd-inverted; -+ status = "okay"; -+ }; -+ - usbphy: phy@01c13400 { - usb1_vbus-supply = <®_usb1_vbus>; - status = "okay"; -@@ -34,6 +43,13 @@ - }; - - pinctrl@01c20800 { -+ mmc0_cd_pin_olinuxino: mmc0_cd_pin@0 { -+ allwinner,pins = "PG0"; -+ allwinner,function = "gpio_in"; -+ allwinner,drive = <0>; -+ allwinner,pull = <1>; -+ }; -+ - led_pins_olinuxino: led_pins@0 { - allwinner,pins = "PG9"; - allwinner,function = "gpio_out"; -diff --git a/arch/arm/boot/dts/sun5i-a13.dtsi b/arch/arm/boot/dts/sun5i-a13.dtsi -index f01c315..48ffa51 100644 ---- a/arch/arm/boot/dts/sun5i-a13.dtsi -+++ b/arch/arm/boot/dts/sun5i-a13.dtsi -@@ -320,6 +320,24 @@ - #size-cells = <0>; - }; - -+ mmc0: mmc@01c0f000 { -+ compatible = "allwinner,sun5i-a13-mmc"; -+ reg = <0x01c0f000 0x1000>; -+ clocks = <&ahb_gates 8>, <&mmc0_clk>; -+ clock-names = "ahb", "mod"; -+ interrupts = <32>; -+ status = "disabled"; -+ }; -+ -+ mmc2: mmc@01c11000 { -+ compatible = "allwinner,sun5i-a13-mmc"; -+ reg = <0x01c11000 0x1000>; -+ clocks = <&ahb_gates 10>, <&mmc2_clk>; -+ clock-names = "ahb", "mod"; -+ interrupts = <34>; -+ status = "disabled"; -+ }; -+ - usbphy: phy@01c13400 { - #phy-cells = <1>; - compatible = "allwinner,sun5i-a13-usb-phy"; -@@ -415,6 +433,13 @@ - allwinner,drive = <0>; - allwinner,pull = <0>; - }; -+ -+ mmc0_pins_a: mmc0@0 { -+ allwinner,pins = "PF0","PF1","PF2","PF3","PF4","PF5"; -+ allwinner,function = "mmc0"; -+ allwinner,drive = <2>; -+ allwinner,pull = <0>; -+ }; - }; - - timer@01c20c00 { -diff --git a/arch/arm/boot/dts/sun6i-a31-m9.dts b/arch/arm/boot/dts/sun6i-a31-m9.dts -new file mode 100644 -index 0000000..a188721 ---- /dev/null -+++ b/arch/arm/boot/dts/sun6i-a31-m9.dts -@@ -0,0 +1,46 @@ -+/* -+ * Copyright 2014 Hans de Goede -+ * -+ * The code contained herein is licensed under the GNU General Public -+ * License. You may obtain a copy of the GNU General Public License -+ * Version 2 or later at the following locations: -+ * -+ * http://www.opensource.org/licenses/gpl-license.html -+ * http://www.gnu.org/copyleft/gpl.html -+ */ -+ -+/dts-v1/; -+/include/ "sun6i-a31.dtsi" -+ -+/ { -+ model = "Mele M9 / A1000G Quad top set box"; -+ compatible = "mele,m9", "allwinner,sun6i-a31"; -+ -+ chosen { -+ bootargs = "earlyprintk console=ttyS0,115200"; -+ }; -+ -+ soc@01c00000 { -+ mmc0: mmc@01c0f000 { -+ pinctrl-names = "default"; -+ pinctrl-0 = <&mmc0_pins_a>, <&mmc0_cd_pin_m9>; -+ cd-gpios = <&pio 7 22 0>; /* PH22 */ -+ status = "okay"; -+ }; -+ -+ pio: pinctrl@01c20800 { -+ mmc0_cd_pin_m9: mmc0_cd_pin@0 { -+ allwinner,pins = "PH22"; -+ allwinner,function = "gpio_in"; -+ allwinner,drive = <0>; -+ allwinner,pull = <1>; -+ }; -+ }; -+ -+ uart0: serial@01c28000 { -+ pinctrl-names = "default"; -+ pinctrl-0 = <&uart0_pins_a>; -+ status = "okay"; -+ }; -+ }; -+}; -diff --git a/arch/arm/boot/dts/sun6i-a31.dtsi b/arch/arm/boot/dts/sun6i-a31.dtsi -index d45efa7..0939fc1 100644 ---- a/arch/arm/boot/dts/sun6i-a31.dtsi -+++ b/arch/arm/boot/dts/sun6i-a31.dtsi -@@ -198,6 +198,38 @@ - "apb2_uart4", "apb2_uart5"; - }; - -+ mmc0_clk: clk@01c20088 { -+ #clock-cells = <0>; -+ compatible = "allwinner,sun4i-a10-mod0-clk"; -+ reg = <0x01c20088 0x4>; -+ clocks = <&osc24M>, <&pll6>; -+ clock-output-names = "mmc0"; -+ }; -+ -+ mmc1_clk: clk@01c2008c { -+ #clock-cells = <0>; -+ compatible = "allwinner,sun4i-a10-mod0-clk"; -+ reg = <0x01c2008c 0x4>; -+ clocks = <&osc24M>, <&pll6>; -+ clock-output-names = "mmc1"; -+ }; -+ -+ mmc2_clk: clk@01c20090 { -+ #clock-cells = <0>; -+ compatible = "allwinner,sun4i-a10-mod0-clk"; -+ reg = <0x01c20090 0x4>; -+ clocks = <&osc24M>, <&pll6>; -+ clock-output-names = "mmc2"; -+ }; -+ -+ mmc3_clk: clk@01c20094 { -+ #clock-cells = <0>; -+ compatible = "allwinner,sun4i-a10-mod0-clk"; -+ reg = <0x01c20094 0x4>; -+ clocks = <&osc24M>, <&pll6>; -+ clock-output-names = "mmc3"; -+ }; -+ - spi0_clk: clk@01c200a0 { - #clock-cells = <0>; - compatible = "allwinner,sun4i-a10-mod0-clk"; -@@ -237,6 +269,58 @@ - #size-cells = <1>; - ranges; - -+ mmc0: mmc@01c0f000 { -+ compatible = "allwinner,sun5i-a13-mmc"; -+ reg = <0x01c0f000 0x1000>; -+ clocks = <&ahb1_gates 8>, <&mmc0_clk>; -+ clock-names = "ahb", "mod"; -+ resets = <&ahb1_rst 8>; -+ reset-names = "ahb"; -+ interrupts = <0 60 4>; -+ bus-width = <4>; -+ cd-inverted; -+ status = "disabled"; -+ }; -+ -+ mmc1: mmc@01c10000 { -+ compatible = "allwinner,sun5i-a13-mmc"; -+ reg = <0x01c10000 0x1000>; -+ clocks = <&ahb1_gates 9>, <&mmc1_clk>; -+ clock-names = "ahb", "mod"; -+ resets = <&ahb1_rst 9>; -+ reset-names = "reset"; -+ interrupts = <0 61 4>; -+ bus-width = <4>; -+ cd-inverted; -+ status = "disabled"; -+ }; -+ -+ mmc2: mmc@01c11000 { -+ compatible = "allwinner,sun5i-a13-mmc"; -+ reg = <0x01c11000 0x1000>; -+ clocks = <&ahb1_gates 10>, <&mmc2_clk>; -+ clock-names = "ahb", "mod"; -+ resets = <&ahb1_rst 10>; -+ reset-names = "reset"; -+ interrupts = <0 62 4>; -+ bus-width = <4>; -+ cd-inverted; -+ status = "disabled"; -+ }; -+ -+ mmc3: mmc@01c12000 { -+ compatible = "allwinner,sun5i-a13-mmc"; -+ reg = <0x01c12000 0x1000>; -+ clocks = <&ahb1_gates 11>, <&mmc3_clk>; -+ clock-names = "ahb", "mod"; -+ resets = <&ahb1_rst 11>; -+ reset-names = "reset"; -+ interrupts = <0 63 4>; -+ bus-width = <4>; -+ cd-inverted; -+ status = "disabled"; -+ }; -+ - nmi_intc: interrupt-controller@01f00c0c { - compatible = "allwinner,sun6i-a31-sc-nmi"; - interrupt-controller; -@@ -286,6 +370,13 @@ - allwinner,drive = <0>; - allwinner,pull = <0>; - }; -+ -+ mmc0_pins_a: mmc0@0 { -+ allwinner,pins = "PF0","PF1","PF2","PF3","PF4","PF5"; -+ allwinner,function = "mmc0"; -+ allwinner,drive = <2>; -+ allwinner,pull = <0>; -+ }; - }; - - ahb1_rst: reset@01c202c0 { -diff --git a/arch/arm/boot/dts/sun7i-a20-cubieboard2.dts b/arch/arm/boot/dts/sun7i-a20-cubieboard2.dts -index 68de89f..b41aa99 100644 ---- a/arch/arm/boot/dts/sun7i-a20-cubieboard2.dts -+++ b/arch/arm/boot/dts/sun7i-a20-cubieboard2.dts -@@ -20,6 +20,15 @@ - compatible = "cubietech,cubieboard2", "allwinner,sun7i-a20"; - - soc@01c00000 { -+ mmc0: mmc@01c0f000 { -+ pinctrl-names = "default"; -+ pinctrl-0 = <&mmc0_pins_a>, <&mmc0_cd_pin_a>; -+ bus-width = <4>; -+ cd-gpios = <&pio 7 1 0>; /* PH1 */ -+ cd-inverted; -+ status = "okay"; -+ }; -+ - usbphy: phy@01c13400 { - usb1_vbus-supply = <®_usb1_vbus>; - usb2_vbus-supply = <®_usb2_vbus>; -diff --git a/arch/arm/boot/dts/sun7i-a20-cubietruck.dts b/arch/arm/boot/dts/sun7i-a20-cubietruck.dts -index cb25d3c..270bac0 100644 ---- a/arch/arm/boot/dts/sun7i-a20-cubietruck.dts -+++ b/arch/arm/boot/dts/sun7i-a20-cubietruck.dts -@@ -20,6 +20,23 @@ - compatible = "cubietech,cubietruck", "allwinner,sun7i-a20"; - - soc@01c00000 { -+ mmc0: mmc@01c0f000 { -+ pinctrl-names = "default"; -+ pinctrl-0 = <&mmc0_pins_a>, <&mmc0_cd_pin_a>; -+ bus-width = <4>; -+ cd-gpios = <&pio 7 1 0>; /* PH1 */ -+ cd-inverted; -+ status = "okay"; -+ }; -+ -+ mmc3: mmc@01c12000 { -+ pinctrl-names = "default"; -+ pinctrl-0 = <&mmc3_pins_a>; -+ vmmc-supply = <®_vmmc3>; -+ non-removable; -+ status = "okay"; -+ }; -+ - usbphy: phy@01c13400 { - usb1_vbus-supply = <®_usb1_vbus>; - usb2_vbus-supply = <®_usb2_vbus>; -@@ -48,6 +65,18 @@ - }; - - pinctrl@01c20800 { -+ mmc3_pins_a: mmc3@0 { -+ /* AP6210 requires pull-up */ -+ allwinner,pull = <1>; -+ }; -+ -+ vmmc3_pin_cubietruck: vmmc3_pin@0 { -+ allwinner,pins = "PH9"; -+ allwinner,function = "gpio_out"; -+ allwinner,drive = <0>; -+ allwinner,pull = <0>; -+ }; -+ - ahci_pwr_pin_cubietruck: ahci_pwr_pin@1 { - allwinner,pins = "PH12"; - allwinner,function = "gpio_out"; -@@ -139,4 +168,15 @@ - reg_usb2_vbus: usb2-vbus { - status = "okay"; - }; -+ -+ reg_vmmc3: vmmc3 { -+ compatible = "regulator-fixed"; -+ pinctrl-names = "default"; -+ pinctrl-0 = <&vmmc3_pin_cubietruck>; -+ regulator-name = "vmmc3"; -+ regulator-min-microvolt = <3300000>; -+ regulator-max-microvolt = <3300000>; -+ enable-active-high; -+ gpio = <&pio 7 9 0>; -+ }; - }; -diff --git a/arch/arm/boot/dts/sun7i-a20-olinuxino-micro.dts b/arch/arm/boot/dts/sun7i-a20-olinuxino-micro.dts -index eeadf76..f989554 100644 ---- a/arch/arm/boot/dts/sun7i-a20-olinuxino-micro.dts -+++ b/arch/arm/boot/dts/sun7i-a20-olinuxino-micro.dts -@@ -31,6 +31,24 @@ - status = "okay"; - }; - -+ mmc0: mmc@01c0f000 { -+ pinctrl-names = "default"; -+ pinctrl-0 = <&mmc0_pins_a>, <&mmc0_cd_pin_a>; -+ bus-width = <4>; -+ cd-gpios = <&pio 7 1 0>; /* PH1 */ -+ cd-inverted; -+ status = "okay"; -+ }; -+ -+ mmc3: mmc@01c12000 { -+ pinctrl-names = "default"; -+ pinctrl-0 = <&mmc3_pins_a>, <&mmc3_cd_pin_olinuxinom>; -+ bus-width = <4>; -+ cd-gpios = <&pio 7 11 0>; /* PH11 */ -+ cd-inverted; -+ status = "okay"; -+ }; -+ - usbphy: phy@01c13400 { - usb1_vbus-supply = <®_usb1_vbus>; - usb2_vbus-supply = <®_usb2_vbus>; -@@ -65,6 +83,13 @@ - }; - - pinctrl@01c20800 { -+ mmc3_cd_pin_olinuxinom: mmc3_cd_pin@0 { -+ allwinner,pins = "PH11"; -+ allwinner,function = "gpio_in"; -+ allwinner,drive = <0>; -+ allwinner,pull = <1>; -+ }; -+ - led_pins_olinuxino: led_pins@0 { - allwinner,pins = "PH2"; - allwinner,function = "gpio_out"; -diff --git a/arch/arm/boot/dts/sun7i-a20.dtsi b/arch/arm/boot/dts/sun7i-a20.dtsi -index 32efc10..99e8336 100644 ---- a/arch/arm/boot/dts/sun7i-a20.dtsi -+++ b/arch/arm/boot/dts/sun7i-a20.dtsi -@@ -447,6 +447,42 @@ - #size-cells = <0>; - }; - -+ mmc0: mmc@01c0f000 { -+ compatible = "allwinner,sun5i-a13-mmc"; -+ reg = <0x01c0f000 0x1000>; -+ clocks = <&ahb_gates 8>, <&mmc0_clk>; -+ clock-names = "ahb", "mod"; -+ interrupts = <0 32 4>; -+ status = "disabled"; -+ }; -+ -+ mmc1: mmc@01c10000 { -+ compatible = "allwinner,sun5i-a13-mmc"; -+ reg = <0x01c10000 0x1000>; -+ clocks = <&ahb_gates 9>, <&mmc1_clk>; -+ clock-names = "ahb", "mod"; -+ interrupts = <0 33 4>; -+ status = "disabled"; -+ }; -+ -+ mmc2: mmc@01c11000 { -+ compatible = "allwinner,sun5i-a13-mmc"; -+ reg = <0x01c11000 0x1000>; -+ clocks = <&ahb_gates 10>, <&mmc2_clk>; -+ clock-names = "ahb", "mod"; -+ interrupts = <0 34 4>; -+ status = "disabled"; -+ }; -+ -+ mmc3: mmc@01c12000 { -+ compatible = "allwinner,sun5i-a13-mmc"; -+ reg = <0x01c12000 0x1000>; -+ clocks = <&ahb_gates 11>, <&mmc3_clk>; -+ clock-names = "ahb", "mod"; -+ interrupts = <0 35 4>; -+ status = "disabled"; -+ }; -+ - usbphy: phy@01c13400 { - #phy-cells = <1>; - compatible = "allwinner,sun7i-a20-usb-phy"; -@@ -653,6 +689,27 @@ - allwinner,drive = <0>; - allwinner,pull = <0>; - }; -+ -+ mmc0_pins_a: mmc0@0 { -+ allwinner,pins = "PF0","PF1","PF2","PF3","PF4","PF5"; -+ allwinner,function = "mmc0"; -+ allwinner,drive = <2>; -+ allwinner,pull = <0>; -+ }; -+ -+ mmc0_cd_pin_a: mmc0_cd_pin@0 { -+ allwinner,pins = "PH1"; -+ allwinner,function = "gpio_in"; -+ allwinner,drive = <0>; -+ allwinner,pull = <1>; -+ }; -+ -+ mmc3_pins_a: mmc3@0 { -+ allwinner,pins = "PI4","PI5","PI6","PI7","PI8","PI9"; -+ allwinner,function = "mmc3"; -+ allwinner,drive = <2>; -+ allwinner,pull = <0>; -+ }; - }; - - timer@01c20c00 { -diff --git a/drivers/clk/sunxi/clk-factors.c b/drivers/clk/sunxi/clk-factors.c -index 9e23264..3806d97 100644 ---- a/drivers/clk/sunxi/clk-factors.c -+++ b/drivers/clk/sunxi/clk-factors.c -@@ -77,6 +77,41 @@ static long clk_factors_round_rate(struct clk_hw *hw, unsigned long rate, - return rate; - } - -+static long clk_factors_determine_rate(struct clk_hw *hw, unsigned long rate, -+ unsigned long *best_parent_rate, -+ struct clk **best_parent_p) -+{ -+ struct clk *clk = hw->clk, *parent, *best_parent = NULL; -+ int i, num_parents; -+ unsigned long parent_rate, best = 0, child_rate, best_child_rate = 0; -+ -+ /* find the parent that can help provide the fastest rate <= rate */ -+ num_parents = __clk_get_num_parents(clk); -+ for (i = 0; i < num_parents; i++) { -+ parent = clk_get_parent_by_index(clk, i); -+ if (!parent) -+ continue; -+ if (__clk_get_flags(clk) & CLK_SET_RATE_PARENT) -+ parent_rate = __clk_round_rate(parent, rate); -+ else -+ parent_rate = __clk_get_rate(parent); -+ -+ child_rate = clk_factors_round_rate(hw, rate, &parent_rate); -+ -+ if (child_rate <= rate && child_rate > best_child_rate) { -+ best_parent = parent; -+ best = parent_rate; -+ best_child_rate = child_rate; -+ } -+ } -+ -+ if (best_parent) -+ *best_parent_p = best_parent; -+ *best_parent_rate = best; -+ -+ return best_child_rate; -+} -+ - static int clk_factors_set_rate(struct clk_hw *hw, unsigned long rate, - unsigned long parent_rate) - { -@@ -113,6 +148,7 @@ static int clk_factors_set_rate(struct clk_hw *hw, unsigned long rate, - } - - const struct clk_ops clk_factors_ops = { -+ .determine_rate = clk_factors_determine_rate, - .recalc_rate = clk_factors_recalc_rate, - .round_rate = clk_factors_round_rate, - .set_rate = clk_factors_set_rate, -diff --git a/drivers/clk/sunxi/clk-sunxi.c b/drivers/clk/sunxi/clk-sunxi.c -index bd7dc73..59f9040 100644 ---- a/drivers/clk/sunxi/clk-sunxi.c -+++ b/drivers/clk/sunxi/clk-sunxi.c -@@ -507,6 +507,42 @@ CLK_OF_DECLARE(sun7i_a20_gmac, "allwinner,sun7i-a20-gmac-clk", - - - /** -+ * clk_sunxi_mmc_phase_control() - configures MMC clock phase control -+ */ -+ -+void clk_sunxi_mmc_phase_control(struct clk_hw *hw, u8 sample, u8 output) -+{ -+ #define to_clk_composite(_hw) container_of(_hw, struct clk_composite, hw) -+ #define to_clk_factors(_hw) container_of(_hw, struct clk_factors, hw) -+ -+ struct clk_composite *composite = to_clk_composite(hw); -+ struct clk_hw *rate_hw = composite->rate_hw; -+ struct clk_factors *factors = to_clk_factors(rate_hw); -+ unsigned long flags = 0; -+ u32 reg; -+ -+ if (factors->lock) -+ spin_lock_irqsave(factors->lock, flags); -+ -+ reg = readl(factors->reg); -+ -+ /* set sample clock phase control */ -+ reg &= ~(0x7 << 20); -+ reg |= ((sample & 0x7) << 20); -+ -+ /* set output clock phase control */ -+ reg &= ~(0x7 << 8); -+ reg |= ((output & 0x7) << 8); -+ -+ writel(reg, factors->reg); -+ -+ if (factors->lock) -+ spin_unlock_irqrestore(factors->lock, flags); -+} -+EXPORT_SYMBOL(clk_sunxi_mmc_phase_control); -+ -+ -+/** - * sunxi_factors_clk_setup() - Setup function for factor clocks - */ - -diff --git a/drivers/mmc/host/Kconfig b/drivers/mmc/host/Kconfig -index 8aaf8c1..d50ac1c 100644 ---- a/drivers/mmc/host/Kconfig -+++ b/drivers/mmc/host/Kconfig -@@ -694,3 +694,10 @@ config MMC_REALTEK_PCI - help - Say Y here to include driver code to support SD/MMC card interface - of Realtek PCI-E card reader -+ -+config MMC_SUNXI -+ tristate "Allwinner sunxi SD/MMC Host Controller support" -+ depends on ARCH_SUNXI -+ help -+ This selects support for the SD/MMC Host Controller on -+ Allwinner sunxi SoCs. -diff --git a/drivers/mmc/host/Makefile b/drivers/mmc/host/Makefile -index 0c8aa5e..c706c0f 100644 ---- a/drivers/mmc/host/Makefile -+++ b/drivers/mmc/host/Makefile -@@ -53,6 +53,8 @@ obj-$(CONFIG_MMC_WMT) += wmt-sdmmc.o - - obj-$(CONFIG_MMC_REALTEK_PCI) += rtsx_pci_sdmmc.o - -+obj-$(CONFIG_MMC_SUNXI) += sunxi-mmc.o -+ - obj-$(CONFIG_MMC_SDHCI_PLTFM) += sdhci-pltfm.o - obj-$(CONFIG_MMC_SDHCI_CNS3XXX) += sdhci-cns3xxx.o - obj-$(CONFIG_MMC_SDHCI_ESDHC_IMX) += sdhci-esdhc-imx.o -diff --git a/drivers/mmc/host/sunxi-mmc.c b/drivers/mmc/host/sunxi-mmc.c -new file mode 100644 -index 0000000..f1de52c ---- /dev/null -+++ b/drivers/mmc/host/sunxi-mmc.c -@@ -0,0 +1,1125 @@ -+/* -+ * Driver for sunxi SD/MMC host controllers -+ * (C) Copyright 2007-2011 Reuuimlla Technology Co., Ltd. -+ * (C) Copyright 2007-2011 Aaron Maoye -+ * (C) Copyright 2013-2014 O2S GmbH -+ * (C) Copyright 2013-2014 David Lanzend�rfer -+ * (C) Copyright 2013-2014 Hans de Goede -+ * -+ * 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. -+ */ -+ -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+ -+#include -+#include -+#include -+ -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+ -+#include -+#include -+#include -+ -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+ -+/* register offset definitions */ -+#define SDXC_REG_GCTRL (0x00) /* SMC Global Control Register */ -+#define SDXC_REG_CLKCR (0x04) /* SMC Clock Control Register */ -+#define SDXC_REG_TMOUT (0x08) /* SMC Time Out Register */ -+#define SDXC_REG_WIDTH (0x0C) /* SMC Bus Width Register */ -+#define SDXC_REG_BLKSZ (0x10) /* SMC Block Size Register */ -+#define SDXC_REG_BCNTR (0x14) /* SMC Byte Count Register */ -+#define SDXC_REG_CMDR (0x18) /* SMC Command Register */ -+#define SDXC_REG_CARG (0x1C) /* SMC Argument Register */ -+#define SDXC_REG_RESP0 (0x20) /* SMC Response Register 0 */ -+#define SDXC_REG_RESP1 (0x24) /* SMC Response Register 1 */ -+#define SDXC_REG_RESP2 (0x28) /* SMC Response Register 2 */ -+#define SDXC_REG_RESP3 (0x2C) /* SMC Response Register 3 */ -+#define SDXC_REG_IMASK (0x30) /* SMC Interrupt Mask Register */ -+#define SDXC_REG_MISTA (0x34) /* SMC Masked Interrupt Status Register */ -+#define SDXC_REG_RINTR (0x38) /* SMC Raw Interrupt Status Register */ -+#define SDXC_REG_STAS (0x3C) /* SMC Status Register */ -+#define SDXC_REG_FTRGL (0x40) /* SMC FIFO Threshold Watermark Registe */ -+#define SDXC_REG_FUNS (0x44) /* SMC Function Select Register */ -+#define SDXC_REG_CBCR (0x48) /* SMC CIU Byte Count Register */ -+#define SDXC_REG_BBCR (0x4C) /* SMC BIU Byte Count Register */ -+#define SDXC_REG_DBGC (0x50) /* SMC Debug Enable Register */ -+#define SDXC_REG_HWRST (0x78) /* SMC Card Hardware Reset for Register */ -+#define SDXC_REG_DMAC (0x80) /* SMC IDMAC Control Register */ -+#define SDXC_REG_DLBA (0x84) /* SMC IDMAC Descriptor List Base Addre */ -+#define SDXC_REG_IDST (0x88) /* SMC IDMAC Status Register */ -+#define SDXC_REG_IDIE (0x8C) /* SMC IDMAC Interrupt Enable Register */ -+#define SDXC_REG_CHDA (0x90) -+#define SDXC_REG_CBDA (0x94) -+ -+#define mci_readl(host, reg) \ -+ readl((host)->reg_base + SDXC_##reg) -+#define mci_writel(host, reg, value) \ -+ writel((value), (host)->reg_base + SDXC_##reg) -+ -+/* global control register bits */ -+#define SDXC_SOFT_RESET BIT(0) -+#define SDXC_FIFO_RESET BIT(1) -+#define SDXC_DMA_RESET BIT(2) -+#define SDXC_INTERRUPT_ENABLE_BIT BIT(4) -+#define SDXC_DMA_ENABLE_BIT BIT(5) -+#define SDXC_DEBOUNCE_ENABLE_BIT BIT(8) -+#define SDXC_POSEDGE_LATCH_DATA BIT(9) -+#define SDXC_DDR_MODE BIT(10) -+#define SDXC_MEMORY_ACCESS_DONE BIT(29) -+#define SDXC_ACCESS_DONE_DIRECT BIT(30) -+#define SDXC_ACCESS_BY_AHB BIT(31) -+#define SDXC_ACCESS_BY_DMA (0 << 31) -+#define SDXC_HARDWARE_RESET \ -+ (SDXC_SOFT_RESET | SDXC_FIFO_RESET | SDXC_DMA_RESET) -+ -+/* clock control bits */ -+#define SDXC_CARD_CLOCK_ON BIT(16) -+#define SDXC_LOW_POWER_ON BIT(17) -+ -+/* bus width */ -+#define SDXC_WIDTH1 0 -+#define SDXC_WIDTH4 1 -+#define SDXC_WIDTH8 2 -+ -+/* smc command bits */ -+#define SDXC_RESP_EXPIRE BIT(6) -+#define SDXC_LONG_RESPONSE BIT(7) -+#define SDXC_CHECK_RESPONSE_CRC BIT(8) -+#define SDXC_DATA_EXPIRE BIT(9) -+#define SDXC_WRITE BIT(10) -+#define SDXC_SEQUENCE_MODE BIT(11) -+#define SDXC_SEND_AUTO_STOP BIT(12) -+#define SDXC_WAIT_PRE_OVER BIT(13) -+#define SDXC_STOP_ABORT_CMD BIT(14) -+#define SDXC_SEND_INIT_SEQUENCE BIT(15) -+#define SDXC_UPCLK_ONLY BIT(21) -+#define SDXC_READ_CEATA_DEV BIT(22) -+#define SDXC_CCS_EXPIRE BIT(23) -+#define SDXC_ENABLE_BIT_BOOT BIT(24) -+#define SDXC_ALT_BOOT_OPTIONS BIT(25) -+#define SDXC_BOOT_ACK_EXPIRE BIT(26) -+#define SDXC_BOOT_ABORT BIT(27) -+#define SDXC_VOLTAGE_SWITCH BIT(28) -+#define SDXC_USE_HOLD_REGISTER BIT(29) -+#define SDXC_START BIT(31) -+ -+/* interrupt bits */ -+#define SDXC_RESP_ERROR BIT(1) -+#define SDXC_COMMAND_DONE BIT(2) -+#define SDXC_DATA_OVER BIT(3) -+#define SDXC_TX_DATA_REQUEST BIT(4) -+#define SDXC_RX_DATA_REQUEST BIT(5) -+#define SDXC_RESP_CRC_ERROR BIT(6) -+#define SDXC_DATA_CRC_ERROR BIT(7) -+#define SDXC_RESP_TIMEOUT BIT(8) -+#define SDXC_DATA_TIMEOUT BIT(9) -+#define SDXC_VOLTAGE_CHANGE_DONE BIT(10) -+#define SDXC_FIFO_RUN_ERROR BIT(11) -+#define SDXC_HARD_WARE_LOCKED BIT(12) -+#define SDXC_START_BIT_ERROR BIT(13) -+#define SDXC_AUTO_COMMAND_DONE BIT(14) -+#define SDXC_END_BIT_ERROR BIT(15) -+#define SDXC_SDIO_INTERRUPT BIT(16) -+#define SDXC_CARD_INSERT BIT(30) -+#define SDXC_CARD_REMOVE BIT(31) -+#define SDXC_INTERRUPT_ERROR_BIT \ -+ (SDXC_RESP_ERROR | SDXC_RESP_CRC_ERROR | SDXC_DATA_CRC_ERROR | \ -+ SDXC_RESP_TIMEOUT | SDXC_DATA_TIMEOUT | SDXC_FIFO_RUN_ERROR | \ -+ SDXC_HARD_WARE_LOCKED | SDXC_START_BIT_ERROR | SDXC_END_BIT_ERROR) -+#define SDXC_INTERRUPT_DONE_BIT \ -+ (SDXC_AUTO_COMMAND_DONE | SDXC_DATA_OVER | \ -+ SDXC_COMMAND_DONE | SDXC_VOLTAGE_CHANGE_DONE) -+ -+/* status */ -+#define SDXC_RXWL_FLAG BIT(0) -+#define SDXC_TXWL_FLAG BIT(1) -+#define SDXC_FIFO_EMPTY BIT(2) -+#define SDXC_FIFO_FULL BIT(3) -+#define SDXC_CARD_PRESENT BIT(8) -+#define SDXC_CARD_DATA_BUSY BIT(9) -+#define SDXC_DATA_FSM_BUSY BIT(10) -+#define SDXC_DMA_REQUEST BIT(31) -+#define SDXC_FIFO_SIZE 16 -+ -+/* Function select */ -+#define SDXC_CEATA_ON (0xceaa << 16) -+#define SDXC_SEND_IRQ_RESPONSE BIT(0) -+#define SDXC_SDIO_READ_WAIT BIT(1) -+#define SDXC_ABORT_READ_DATA BIT(2) -+#define SDXC_SEND_CCSD BIT(8) -+#define SDXC_SEND_AUTO_STOPCCSD BIT(9) -+#define SDXC_CEATA_DEV_IRQ_ENABLE BIT(10) -+ -+/* IDMA controller bus mod bit field */ -+#define SDXC_IDMAC_SOFT_RESET BIT(0) -+#define SDXC_IDMAC_FIX_BURST BIT(1) -+#define SDXC_IDMAC_IDMA_ON BIT(7) -+#define SDXC_IDMAC_REFETCH_DES BIT(31) -+ -+/* IDMA status bit field */ -+#define SDXC_IDMAC_TRANSMIT_INTERRUPT BIT(0) -+#define SDXC_IDMAC_RECEIVE_INTERRUPT BIT(1) -+#define SDXC_IDMAC_FATAL_BUS_ERROR BIT(2) -+#define SDXC_IDMAC_DESTINATION_INVALID BIT(4) -+#define SDXC_IDMAC_CARD_ERROR_SUM BIT(5) -+#define SDXC_IDMAC_NORMAL_INTERRUPT_SUM BIT(8) -+#define SDXC_IDMAC_ABNORMAL_INTERRUPT_SUM BIT(9) -+#define SDXC_IDMAC_HOST_ABORT_INTERRUPT BIT(10) -+#define SDXC_IDMAC_IDLE (0 << 13) -+#define SDXC_IDMAC_SUSPEND (1 << 13) -+#define SDXC_IDMAC_DESC_READ (2 << 13) -+#define SDXC_IDMAC_DESC_CHECK (3 << 13) -+#define SDXC_IDMAC_READ_REQUEST_WAIT (4 << 13) -+#define SDXC_IDMAC_WRITE_REQUEST_WAIT (5 << 13) -+#define SDXC_IDMAC_READ (6 << 13) -+#define SDXC_IDMAC_WRITE (7 << 13) -+#define SDXC_IDMAC_DESC_CLOSE (8 << 13) -+ -+/* -+* If the idma-des-size-bits of property is ie 13, bufsize bits are: -+* Bits 0-12: buf1 size -+* Bits 13-25: buf2 size -+* Bits 26-31: not used -+* Since we only ever set buf1 size, we can simply store it directly. -+*/ -+#define SDXC_IDMAC_DES0_DIC BIT(1) /* disable interrupt on completion */ -+#define SDXC_IDMAC_DES0_LD BIT(2) /* last descriptor */ -+#define SDXC_IDMAC_DES0_FD BIT(3) /* first descriptor */ -+#define SDXC_IDMAC_DES0_CH BIT(4) /* chain mode */ -+#define SDXC_IDMAC_DES0_ER BIT(5) /* end of ring */ -+#define SDXC_IDMAC_DES0_CES BIT(30) /* card error summary */ -+#define SDXC_IDMAC_DES0_OWN BIT(31) /* 1-idma owns it, 0-host owns it */ -+ -+struct sunxi_idma_des { -+ u32 config; -+ u32 buf_size; -+ u32 buf_addr_ptr1; -+ u32 buf_addr_ptr2; -+}; -+ -+struct sunxi_mmc_host { -+ struct mmc_host *mmc; -+ struct regulator *vmmc; -+ struct reset_control *reset; -+ -+ /* IO mapping base */ -+ void __iomem *reg_base; -+ -+ spinlock_t lock; -+ struct tasklet_struct manual_stop_tasklet; -+ -+ /* clock management */ -+ struct clk *clk_ahb; -+ struct clk *clk_mod; -+ -+ /* ios information */ -+ u32 clk_mod_rate; -+ u32 bus_width; -+ u32 idma_des_size_bits; -+ u32 ddr; -+ u32 voltage_switching; -+ -+ /* irq */ -+ int irq; -+ u32 int_sum; -+ u32 sdio_imask; -+ -+ /* flags */ -+ bool wait_dma; -+ -+ dma_addr_t sg_dma; -+ void *sg_cpu; -+ -+ struct mmc_request *mrq; -+ struct mmc_request *manual_stop_mrq; -+ u32 ferror; -+}; -+ -+static int sunxi_mmc_init_host(struct mmc_host *mmc) -+{ -+ u32 rval; -+ struct sunxi_mmc_host *smc_host = mmc_priv(mmc); -+ int ret; -+ -+ ret = clk_prepare_enable(smc_host->clk_ahb); -+ if (ret) { -+ dev_err(mmc_dev(smc_host->mmc), "AHB clk err %d\n", ret); -+ return ret; -+ } -+ -+ ret = clk_prepare_enable(smc_host->clk_mod); -+ if (ret) { -+ dev_err(mmc_dev(smc_host->mmc), "MOD clk err %d\n", ret); -+ clk_disable_unprepare(smc_host->clk_ahb); -+ return ret; -+ } -+ -+ if (smc_host->reset) { -+ ret = reset_control_deassert(smc_host->reset); -+ if (ret) { -+ dev_err(mmc_dev(smc_host->mmc), "reset err %d\n", ret); -+ clk_disable_unprepare(smc_host->clk_ahb); -+ clk_disable_unprepare(smc_host->clk_mod); -+ return ret; -+ } -+ } -+ -+ /* reset controller */ -+ rval = mci_readl(smc_host, REG_GCTRL); -+ rval |= SDXC_HARDWARE_RESET; -+ mci_writel(smc_host, REG_GCTRL, rval); -+ -+ mci_writel(smc_host, REG_FTRGL, 0x20070008); -+ mci_writel(smc_host, REG_TMOUT, 0xffffffff); -+ mci_writel(smc_host, REG_IMASK, smc_host->sdio_imask); -+ mci_writel(smc_host, REG_RINTR, 0xffffffff); -+ mci_writel(smc_host, REG_DBGC, 0xdeb); -+ mci_writel(smc_host, REG_FUNS, SDXC_CEATA_ON); -+ mci_writel(smc_host, REG_DLBA, smc_host->sg_dma); -+ -+ rval = mci_readl(smc_host, REG_GCTRL); -+ rval |= SDXC_INTERRUPT_ENABLE_BIT; -+ rval &= ~SDXC_ACCESS_DONE_DIRECT; -+ mci_writel(smc_host, REG_GCTRL, rval); -+ -+ return 0; -+} -+ -+static void sunxi_mmc_exit_host(struct sunxi_mmc_host *smc_host) -+{ -+ mci_writel(smc_host, REG_GCTRL, SDXC_HARDWARE_RESET); -+ -+ if (smc_host->reset) -+ reset_control_assert(smc_host->reset); -+ -+ clk_disable_unprepare(smc_host->clk_ahb); -+ clk_disable_unprepare(smc_host->clk_mod); -+} -+ -+/* /\* UHS-I Operation Modes */ -+/* * DS 25MHz 12.5MB/s 3.3V */ -+/* * HS 50MHz 25MB/s 3.3V */ -+/* * SDR12 25MHz 12.5MB/s 1.8V */ -+/* * SDR25 50MHz 25MB/s 1.8V */ -+/* * SDR50 100MHz 50MB/s 1.8V */ -+/* * SDR104 208MHz 104MB/s 1.8V */ -+/* * DDR50 50MHz 50MB/s 1.8V */ -+/* * MMC Operation Modes */ -+/* * DS 26MHz 26MB/s 3/1.8/1.2V */ -+/* * HS 52MHz 52MB/s 3/1.8/1.2V */ -+/* * HSDDR 52MHz 104MB/s 3/1.8/1.2V */ -+/* * HS200 200MHz 200MB/s 1.8/1.2V */ -+/* * */ -+/* * Spec. Timing */ -+/* * SD3.0 */ -+/* * Fcclk Tcclk Fsclk Tsclk Tis Tih odly RTis RTih */ -+/* * 400K 2.5us 24M 41ns 5ns 5ns 1 2209ns 41ns */ -+/* * 25M 40ns 600M 1.67ns 5ns 5ns 3 14.99ns 5.01ns */ -+/* * 50M 20ns 600M 1.67ns 6ns 2ns 3 14.99ns 5.01ns */ -+/* * 50MDDR 20ns 600M 1.67ns 6ns 0.8ns 2 6.67ns 3.33ns */ -+/* * 104M 9.6ns 600M 1.67ns 3ns 0.8ns 1 7.93ns 1.67ns */ -+/* * 208M 4.8ns 600M 1.67ns 1.4ns 0.8ns 1 3.33ns 1.67ns */ -+ -+/* * 25M 40ns 300M 3.33ns 5ns 5ns 2 13.34ns 6.66ns */ -+/* * 50M 20ns 300M 3.33ns 6ns 2ns 2 13.34ns 6.66ns */ -+/* * 50MDDR 20ns 300M 3.33ns 6ns 0.8ns 1 6.67ns 3.33ns */ -+/* * 104M 9.6ns 300M 3.33ns 3ns 0.8ns 0 7.93ns 1.67ns */ -+/* * 208M 4.8ns 300M 3.33ns 1.4ns 0.8ns 0 3.13ns 1.67ns */ -+ -+/* * eMMC4.5 */ -+/* * 400K 2.5us 24M 41ns 3ns 3ns 1 2209ns 41ns */ -+/* * 25M 40ns 600M 1.67ns 3ns 3ns 3 14.99ns 5.01ns */ -+/* * 50M 20ns 600M 1.67ns 3ns 3ns 3 14.99ns 5.01ns */ -+/* * 50MDDR 20ns 600M 1.67ns 2.5ns 2.5ns 2 6.67ns 3.33ns */ -+/* * 200M 5ns 600M 1.67ns 1.4ns 0.8ns 1 3.33ns 1.67ns */ -+/* *\/ */ -+ -+static void sunxi_mmc_init_idma_des(struct sunxi_mmc_host *host, -+ struct mmc_data *data) -+{ -+ struct sunxi_idma_des *pdes = (struct sunxi_idma_des *)host->sg_cpu; -+ struct sunxi_idma_des *pdes_pa = (struct sunxi_idma_des *)host->sg_dma; -+ int i, max_len = (1 << host->idma_des_size_bits); -+ -+ for (i = 0; i < data->sg_len; i++) { -+ pdes[i].config = SDXC_IDMAC_DES0_CH | SDXC_IDMAC_DES0_OWN | -+ SDXC_IDMAC_DES0_DIC; -+ -+ if (data->sg[i].length == max_len) -+ pdes[i].buf_size = 0; /* 0 == max_len */ -+ else -+ pdes[i].buf_size = data->sg[i].length; -+ -+ pdes[i].buf_addr_ptr1 = sg_dma_address(&data->sg[i]); -+ pdes[i].buf_addr_ptr2 = (u32)&pdes_pa[i + 1]; -+ } -+ -+ pdes[0].config |= SDXC_IDMAC_DES0_FD; -+ pdes[i - 1].config = SDXC_IDMAC_DES0_OWN | SDXC_IDMAC_DES0_LD; -+ -+ /* -+ * Avoid the io-store starting the idmac hitting io-mem before the -+ * descriptors hit the main-mem. -+ */ -+ wmb(); -+} -+ -+static enum dma_data_direction sunxi_mmc_get_dma_dir(struct mmc_data *data) -+{ -+ if (data->flags & MMC_DATA_WRITE) -+ return DMA_TO_DEVICE; -+ else -+ return DMA_FROM_DEVICE; -+} -+ -+static int sunxi_mmc_map_dma(struct sunxi_mmc_host *smc_host, -+ struct mmc_data *data) -+{ -+ u32 i, dma_len; -+ struct scatterlist *sg; -+ -+ dma_len = dma_map_sg(mmc_dev(smc_host->mmc), data->sg, data->sg_len, -+ sunxi_mmc_get_dma_dir(data)); -+ if (dma_len == 0) { -+ dev_err(mmc_dev(smc_host->mmc), "dma_map_sg failed\n"); -+ return -ENOMEM; -+ } -+ -+ for_each_sg(data->sg, sg, data->sg_len, i) { -+ if (sg->offset & 3 || sg->length & 3) { -+ dev_err(mmc_dev(smc_host->mmc), -+ "unaligned scatterlist: os %x length %d\n", -+ sg->offset, sg->length); -+ return -EINVAL; -+ } -+ } -+ -+ return 0; -+} -+ -+static void sunxi_mmc_start_dma(struct sunxi_mmc_host *smc_host, -+ struct mmc_data *data) -+{ -+ u32 rval; -+ -+ sunxi_mmc_init_idma_des(smc_host, data); -+ -+ rval = mci_readl(smc_host, REG_GCTRL); -+ rval |= SDXC_DMA_ENABLE_BIT; -+ mci_writel(smc_host, REG_GCTRL, rval); -+ rval |= SDXC_DMA_RESET; -+ mci_writel(smc_host, REG_GCTRL, rval); -+ -+ mci_writel(smc_host, REG_DMAC, SDXC_IDMAC_SOFT_RESET); -+ -+ if (!(data->flags & MMC_DATA_WRITE)) -+ mci_writel(smc_host, REG_IDIE, SDXC_IDMAC_RECEIVE_INTERRUPT); -+ -+ mci_writel(smc_host, REG_DMAC, -+ SDXC_IDMAC_FIX_BURST | SDXC_IDMAC_IDMA_ON); -+} -+ -+static void sunxi_mmc_send_manual_stop(struct sunxi_mmc_host *host, -+ struct mmc_request *req) -+{ -+ u32 cmd_val = SDXC_START | SDXC_RESP_EXPIRE | SDXC_STOP_ABORT_CMD -+ | SDXC_CHECK_RESPONSE_CRC | MMC_STOP_TRANSMISSION; -+ u32 ri = 0; -+ unsigned long expire = jiffies + msecs_to_jiffies(1000); -+ -+ mci_writel(host, REG_CARG, 0); -+ mci_writel(host, REG_CMDR, cmd_val); -+ -+ do { -+ ri = mci_readl(host, REG_RINTR); -+ } while (!(ri & (SDXC_COMMAND_DONE | SDXC_INTERRUPT_ERROR_BIT)) && -+ time_before(jiffies, expire)); -+ -+ if (ri & SDXC_INTERRUPT_ERROR_BIT) { -+ dev_err(mmc_dev(host->mmc), "send stop command failed\n"); -+ if (req->stop) -+ req->stop->resp[0] = -ETIMEDOUT; -+ } else { -+ if (req->stop) -+ req->stop->resp[0] = mci_readl(host, REG_RESP0); -+ } -+ -+ mci_writel(host, REG_RINTR, 0xffff); -+} -+ -+static void sunxi_mmc_dump_errinfo(struct sunxi_mmc_host *smc_host) -+{ -+ struct mmc_command *cmd = smc_host->mrq->cmd; -+ struct mmc_data *data = smc_host->mrq->data; -+ -+ /* For some cmds timeout is normal with sd/mmc cards */ -+ if ((smc_host->int_sum & SDXC_INTERRUPT_ERROR_BIT) == -+ SDXC_RESP_TIMEOUT && (cmd->opcode == SD_IO_SEND_OP_COND || -+ cmd->opcode == SD_IO_RW_DIRECT)) -+ return; -+ -+ dev_err(mmc_dev(smc_host->mmc), -+ "smc %d err, cmd %d,%s%s%s%s%s%s%s%s%s%s !!\n", -+ smc_host->mmc->index, cmd->opcode, -+ data ? (data->flags & MMC_DATA_WRITE ? " WR" : " RD") : "", -+ smc_host->int_sum & SDXC_RESP_ERROR ? " RE" : "", -+ smc_host->int_sum & SDXC_RESP_CRC_ERROR ? " RCE" : "", -+ smc_host->int_sum & SDXC_DATA_CRC_ERROR ? " DCE" : "", -+ smc_host->int_sum & SDXC_RESP_TIMEOUT ? " RTO" : "", -+ smc_host->int_sum & SDXC_DATA_TIMEOUT ? " DTO" : "", -+ smc_host->int_sum & SDXC_FIFO_RUN_ERROR ? " FE" : "", -+ smc_host->int_sum & SDXC_HARD_WARE_LOCKED ? " HL" : "", -+ smc_host->int_sum & SDXC_START_BIT_ERROR ? " SBE" : "", -+ smc_host->int_sum & SDXC_END_BIT_ERROR ? " EBE" : "" -+ ); -+} -+ -+/* Called in interrupt context! */ -+static int sunxi_mmc_finalize_request(struct sunxi_mmc_host *host) -+{ -+ struct mmc_request *mrq = host->mrq; -+ -+ mci_writel(host, REG_IMASK, host->sdio_imask); -+ mci_writel(host, REG_IDIE, 0); -+ -+ if (host->int_sum & SDXC_INTERRUPT_ERROR_BIT) { -+ sunxi_mmc_dump_errinfo(host); -+ mrq->cmd->error = -ETIMEDOUT; -+ -+ if (mrq->data) -+ mrq->data->error = -ETIMEDOUT; -+ -+ if (mrq->stop) -+ mrq->stop->error = -ETIMEDOUT; -+ } else { -+ if (mrq->cmd->flags & MMC_RSP_136) { -+ mrq->cmd->resp[0] = mci_readl(host, REG_RESP3); -+ mrq->cmd->resp[1] = mci_readl(host, REG_RESP2); -+ mrq->cmd->resp[2] = mci_readl(host, REG_RESP1); -+ mrq->cmd->resp[3] = mci_readl(host, REG_RESP0); -+ } else { -+ mrq->cmd->resp[0] = mci_readl(host, REG_RESP0); -+ } -+ -+ if (mrq->data) -+ mrq->data->bytes_xfered = -+ mrq->data->blocks * mrq->data->blksz; -+ } -+ -+ if (mrq->data) { -+ struct mmc_data *data = mrq->data; -+ u32 rval; -+ -+ mci_writel(host, REG_IDST, 0x337); -+ mci_writel(host, REG_DMAC, 0); -+ rval = mci_readl(host, REG_GCTRL); -+ rval |= SDXC_DMA_RESET; -+ mci_writel(host, REG_GCTRL, rval); -+ rval &= ~SDXC_DMA_ENABLE_BIT; -+ mci_writel(host, REG_GCTRL, rval); -+ rval |= SDXC_FIFO_RESET; -+ mci_writel(host, REG_GCTRL, rval); -+ dma_unmap_sg(mmc_dev(host->mmc), data->sg, data->sg_len, -+ sunxi_mmc_get_dma_dir(data)); -+ } -+ -+ mci_writel(host, REG_RINTR, 0xffff); -+ -+ dev_dbg(mmc_dev(host->mmc), "req done, resp %08x %08x %08x %08x\n", -+ mrq->cmd->resp[0], mrq->cmd->resp[1], -+ mrq->cmd->resp[2], mrq->cmd->resp[3]); -+ -+ host->mrq = NULL; -+ host->int_sum = 0; -+ host->wait_dma = false; -+ -+ if (mrq->data && mrq->data->error) { -+ host->manual_stop_mrq = mrq; -+ tasklet_schedule(&host->manual_stop_tasklet); -+ return -EBUSY; -+ } -+ -+ return 0; -+} -+ -+static irqreturn_t sunxi_mmc_irq(int irq, void *dev_id) -+{ -+ struct sunxi_mmc_host *host = dev_id; -+ struct mmc_request *mrq; -+ bool finalize = false; -+ bool complete = false; -+ bool sdio_int = false; -+ u32 msk_int; -+ u32 idma_int; -+ -+ spin_lock(&host->lock); -+ -+ idma_int = mci_readl(host, REG_IDST); -+ msk_int = mci_readl(host, REG_MISTA); -+ -+ dev_dbg(mmc_dev(host->mmc), "irq: rq %p mi %08x idi %08x\n", -+ host->mrq, msk_int, idma_int); -+ -+ mrq = host->mrq; -+ if (mrq) { -+ if (idma_int & SDXC_IDMAC_RECEIVE_INTERRUPT) -+ host->wait_dma = false; -+ -+ host->int_sum |= msk_int; -+ -+ /* Wait for COMMAND_DONE on RESPONSE_TIMEOUT before finalize */ -+ if ((host->int_sum & SDXC_RESP_TIMEOUT) && -+ !(host->int_sum & SDXC_COMMAND_DONE)) -+ mci_writel(host, REG_IMASK, -+ host->sdio_imask | SDXC_COMMAND_DONE); -+ /* Don't wait for dma on error */ -+ else if (host->int_sum & SDXC_INTERRUPT_ERROR_BIT) -+ finalize = true; -+ else if ((host->int_sum & SDXC_INTERRUPT_DONE_BIT) && -+ !host->wait_dma) -+ finalize = true; -+ } -+ -+ if (msk_int & SDXC_SDIO_INTERRUPT) -+ sdio_int = true; -+ -+ mci_writel(host, REG_RINTR, msk_int); -+ mci_writel(host, REG_IDST, idma_int); -+ -+ if (finalize) { -+ if (sunxi_mmc_finalize_request(host) == 0) -+ complete = true; -+ } -+ -+ spin_unlock(&host->lock); -+ -+ if (complete) -+ mmc_request_done(host->mmc, mrq); -+ -+ if (sdio_int) -+ mmc_signal_sdio_irq(host->mmc); -+ -+ return IRQ_HANDLED; -+} -+ -+static void sunxi_mmc_manual_stop_tasklet(unsigned long data) -+{ -+ struct sunxi_mmc_host *host = (struct sunxi_mmc_host *) data; -+ struct mmc_request *mrq; -+ unsigned long iflags; -+ -+ spin_lock_irqsave(&host->lock, iflags); -+ mrq = host->manual_stop_mrq; -+ spin_unlock_irqrestore(&host->lock, iflags); -+ -+ if (!mrq) { -+ dev_err(mmc_dev(host->mmc), "no request for manual stop\n"); -+ return; -+ } -+ -+ dev_err(mmc_dev(host->mmc), "data error, sending stop command\n"); -+ sunxi_mmc_send_manual_stop(host, mrq); -+ -+ spin_lock_irqsave(&host->lock, iflags); -+ host->manual_stop_mrq = NULL; -+ spin_unlock_irqrestore(&host->lock, iflags); -+ -+ mmc_request_done(host->mmc, mrq); -+} -+ -+static void sunxi_mmc_oclk_onoff(struct sunxi_mmc_host *host, u32 oclk_en) -+{ -+ unsigned long expire = jiffies + msecs_to_jiffies(2000); -+ u32 rval; -+ -+ rval = mci_readl(host, REG_CLKCR); -+ rval &= ~(SDXC_CARD_CLOCK_ON | SDXC_LOW_POWER_ON); -+ -+ if (oclk_en) -+ rval |= SDXC_CARD_CLOCK_ON; -+ -+ mci_writel(host, REG_CLKCR, rval); -+ -+ rval = SDXC_START | SDXC_UPCLK_ONLY | SDXC_WAIT_PRE_OVER; -+ if (host->voltage_switching) -+ rval |= SDXC_VOLTAGE_SWITCH; -+ mci_writel(host, REG_CMDR, rval); -+ -+ do { -+ rval = mci_readl(host, REG_CMDR); -+ } while (time_before(jiffies, expire) && (rval & SDXC_START)); -+ -+ if (rval & SDXC_START) { -+ dev_err(mmc_dev(host->mmc), "fatal err update clk timeout\n"); -+ host->ferror = 1; -+ } -+} -+ -+static void sunxi_mmc_clk_set_rate(struct sunxi_mmc_host *smc_host, -+ unsigned int rate) -+{ -+ u32 newrate, oclk_dly, rval, sclk_dly, src_clk; -+ struct clk_hw *hw = __clk_get_hw(smc_host->clk_mod); -+ -+ newrate = clk_round_rate(smc_host->clk_mod, rate); -+ if (smc_host->clk_mod_rate == newrate) { -+ dev_dbg(mmc_dev(smc_host->mmc), "clk already %d, rounded %d\n", -+ rate, newrate); -+ return; -+ } -+ -+ dev_dbg(mmc_dev(smc_host->mmc), "setting clk to %d, rounded %d\n", -+ rate, newrate); -+ -+ /* setting clock rate */ -+ clk_set_rate(smc_host->clk_mod, newrate); -+ smc_host->clk_mod_rate = clk_get_rate(smc_host->clk_mod); -+ dev_dbg(mmc_dev(smc_host->mmc), "clk is now %d\n", -+ smc_host->clk_mod_rate); -+ -+ sunxi_mmc_oclk_onoff(smc_host, 0); -+ /* clear internal divider */ -+ rval = mci_readl(smc_host, REG_CLKCR); -+ rval &= ~0xff; -+ mci_writel(smc_host, REG_CLKCR, rval); -+ -+ /* determine delays */ -+ if (rate <= 400000) { -+ oclk_dly = 0; -+ sclk_dly = 7; -+ } else if (rate <= 25000000) { -+ oclk_dly = 0; -+ sclk_dly = 5; -+ } else if (rate <= 50000000) { -+ if (smc_host->ddr) { -+ oclk_dly = 2; -+ sclk_dly = 4; -+ } else { -+ oclk_dly = 3; -+ sclk_dly = 5; -+ } -+ } else { -+ /* rate > 50000000 */ -+ oclk_dly = 2; -+ sclk_dly = 4; -+ } -+ -+ src_clk = clk_get_rate(clk_get_parent(smc_host->clk_mod)); -+ if (src_clk >= 300000000 && src_clk <= 400000000) { -+ if (oclk_dly) -+ oclk_dly--; -+ if (sclk_dly) -+ sclk_dly--; -+ } -+ -+ clk_sunxi_mmc_phase_control(hw, sclk_dly, oclk_dly); -+ sunxi_mmc_oclk_onoff(smc_host, 1); -+ -+ /* oclk_onoff sets various irq status bits, clear these */ -+ mci_writel(smc_host, REG_RINTR, -+ mci_readl(smc_host, REG_RINTR) & ~SDXC_SDIO_INTERRUPT); -+} -+ -+static void sunxi_mmc_set_ios(struct mmc_host *mmc, struct mmc_ios *ios) -+{ -+ struct sunxi_mmc_host *host = mmc_priv(mmc); -+ u32 rval; -+ s32 err; -+ -+ /* Set the power state */ -+ switch (ios->power_mode) { -+ case MMC_POWER_ON: -+ break; -+ -+ case MMC_POWER_UP: -+ if (!IS_ERR(host->vmmc)) { -+ mmc_regulator_set_ocr(host->mmc, host->vmmc, ios->vdd); -+ udelay(200); -+ } -+ -+ err = sunxi_mmc_init_host(mmc); -+ if (err) { -+ host->ferror = 1; -+ return; -+ } -+ -+ enable_irq(host->irq); -+ -+ dev_dbg(mmc_dev(host->mmc), "power on!\n"); -+ host->ferror = 0; -+ break; -+ -+ case MMC_POWER_OFF: -+ dev_dbg(mmc_dev(host->mmc), "power off!\n"); -+ disable_irq(host->irq); -+ sunxi_mmc_exit_host(host); -+ if (!IS_ERR(host->vmmc)) -+ mmc_regulator_set_ocr(host->mmc, host->vmmc, 0); -+ -+ host->ferror = 0; -+ break; -+ } -+ -+ /* set bus width */ -+ switch (ios->bus_width) { -+ case MMC_BUS_WIDTH_1: -+ mci_writel(host, REG_WIDTH, SDXC_WIDTH1); -+ host->bus_width = 1; -+ break; -+ case MMC_BUS_WIDTH_4: -+ mci_writel(host, REG_WIDTH, SDXC_WIDTH4); -+ host->bus_width = 4; -+ break; -+ case MMC_BUS_WIDTH_8: -+ mci_writel(host, REG_WIDTH, SDXC_WIDTH8); -+ host->bus_width = 8; -+ break; -+ } -+ -+ /* set ddr mode */ -+ rval = mci_readl(host, REG_GCTRL); -+ if (ios->timing == MMC_TIMING_UHS_DDR50) { -+ rval |= SDXC_DDR_MODE; -+ host->ddr = 1; -+ } else { -+ rval &= ~SDXC_DDR_MODE; -+ host->ddr = 0; -+ } -+ mci_writel(host, REG_GCTRL, rval); -+ -+ /* set up clock */ -+ if (ios->clock && ios->power_mode) { -+ dev_dbg(mmc_dev(host->mmc), "ios->clock: %d\n", ios->clock); -+ sunxi_mmc_clk_set_rate(host, ios->clock); -+ usleep_range(50000, 55000); -+ } -+} -+ -+static void sunxi_mmc_enable_sdio_irq(struct mmc_host *mmc, int enable) -+{ -+ struct sunxi_mmc_host *smc_host = mmc_priv(mmc); -+ unsigned long flags; -+ u32 imask; -+ -+ spin_lock_irqsave(&smc_host->lock, flags); -+ -+ imask = mci_readl(smc_host, REG_IMASK); -+ if (enable) { -+ smc_host->sdio_imask = SDXC_SDIO_INTERRUPT; -+ imask |= SDXC_SDIO_INTERRUPT; -+ } else { -+ smc_host->sdio_imask = 0; -+ imask &= ~SDXC_SDIO_INTERRUPT; -+ } -+ mci_writel(smc_host, REG_IMASK, imask); -+ spin_unlock_irqrestore(&smc_host->lock, flags); -+} -+ -+static void sunxi_mmc_hw_reset(struct mmc_host *mmc) -+{ -+ struct sunxi_mmc_host *smc_host = mmc_priv(mmc); -+ mci_writel(smc_host, REG_HWRST, 0); -+ udelay(10); -+ mci_writel(smc_host, REG_HWRST, 1); -+ udelay(300); -+} -+ -+static void sunxi_mmc_request(struct mmc_host *mmc, struct mmc_request *mrq) -+{ -+ struct sunxi_mmc_host *host = mmc_priv(mmc); -+ struct mmc_command *cmd = mrq->cmd; -+ struct mmc_data *data = mrq->data; -+ unsigned long iflags; -+ u32 imask = SDXC_INTERRUPT_ERROR_BIT; -+ u32 cmd_val = SDXC_START | (cmd->opcode & 0x3f); -+ int ret; -+ -+ if (!mmc_gpio_get_cd(mmc) || host->ferror) { -+ dev_dbg(mmc_dev(host->mmc), "no medium present\n"); -+ mrq->cmd->error = -ENOMEDIUM; -+ mmc_request_done(mmc, mrq); -+ return; -+ } -+ -+ if (data) { -+ ret = sunxi_mmc_map_dma(host, data); -+ if (ret < 0) { -+ dev_err(mmc_dev(host->mmc), "map DMA failed\n"); -+ cmd->error = ret; -+ cmd->data->error = ret; -+ mmc_request_done(host->mmc, mrq); -+ return; -+ } -+ } -+ -+ if (cmd->opcode == MMC_GO_IDLE_STATE) { -+ cmd_val |= SDXC_SEND_INIT_SEQUENCE; -+ imask |= SDXC_COMMAND_DONE; -+ } -+ -+ if (cmd->opcode == SD_SWITCH_VOLTAGE) { -+ cmd_val |= SDXC_VOLTAGE_SWITCH; -+ imask |= SDXC_VOLTAGE_CHANGE_DONE; -+ host->voltage_switching = 1; -+ sunxi_mmc_oclk_onoff(host, 1); -+ } -+ -+ if (cmd->flags & MMC_RSP_PRESENT) { -+ cmd_val |= SDXC_RESP_EXPIRE; -+ if (cmd->flags & MMC_RSP_136) -+ cmd_val |= SDXC_LONG_RESPONSE; -+ if (cmd->flags & MMC_RSP_CRC) -+ cmd_val |= SDXC_CHECK_RESPONSE_CRC; -+ -+ if ((cmd->flags & MMC_CMD_MASK) == MMC_CMD_ADTC) { -+ cmd_val |= SDXC_DATA_EXPIRE | SDXC_WAIT_PRE_OVER; -+ if (cmd->data->flags & MMC_DATA_STREAM) { -+ imask |= SDXC_AUTO_COMMAND_DONE; -+ cmd_val |= SDXC_SEQUENCE_MODE | -+ SDXC_SEND_AUTO_STOP; -+ } -+ -+ if (cmd->data->stop) { -+ imask |= SDXC_AUTO_COMMAND_DONE; -+ cmd_val |= SDXC_SEND_AUTO_STOP; -+ } else { -+ imask |= SDXC_DATA_OVER; -+ } -+ -+ if (cmd->data->flags & MMC_DATA_WRITE) -+ cmd_val |= SDXC_WRITE; -+ else -+ host->wait_dma = true; -+ } else { -+ imask |= SDXC_COMMAND_DONE; -+ } -+ } else { -+ imask |= SDXC_COMMAND_DONE; -+ } -+ -+ dev_dbg(mmc_dev(host->mmc), "cmd %d(%08x) arg %x ie 0x%08x len %d\n", -+ cmd_val & 0x3f, cmd_val, cmd->arg, imask, -+ mrq->data ? mrq->data->blksz * mrq->data->blocks : 0); -+ -+ spin_lock_irqsave(&host->lock, iflags); -+ -+ if (host->mrq || host->manual_stop_mrq) { -+ spin_unlock_irqrestore(&host->lock, iflags); -+ -+ if (data) -+ dma_unmap_sg(mmc_dev(host->mmc), data->sg, -+ data->sg_len, sunxi_mmc_get_dma_dir(data)); -+ -+ dev_err(mmc_dev(host->mmc), "request already pending\n"); -+ mrq->cmd->error = -EBUSY; -+ mmc_request_done(host->mmc, mrq); -+ return; -+ } -+ -+ if (data) { -+ mci_writel(host, REG_BLKSZ, data->blksz); -+ mci_writel(host, REG_BCNTR, data->blksz * data->blocks); -+ sunxi_mmc_start_dma(host, data); -+ } -+ -+ host->mrq = mrq; -+ mci_writel(host, REG_IMASK, host->sdio_imask | imask); -+ mci_writel(host, REG_CARG, cmd->arg); -+ mci_writel(host, REG_CMDR, cmd_val); -+ -+ spin_unlock_irqrestore(&host->lock, iflags); -+} -+ -+static const struct of_device_id sunxi_mmc_of_match[] = { -+ { .compatible = "allwinner,sun4i-a10-mmc", }, -+ { .compatible = "allwinner,sun5i-a13-mmc", }, -+ { /* sentinel */ } -+}; -+MODULE_DEVICE_TABLE(of, sunxi_mmc_of_match); -+ -+static struct mmc_host_ops sunxi_mmc_ops = { -+ .request = sunxi_mmc_request, -+ .set_ios = sunxi_mmc_set_ios, -+ .get_ro = mmc_gpio_get_ro, -+ .get_cd = mmc_gpio_get_cd, -+ .enable_sdio_irq = sunxi_mmc_enable_sdio_irq, -+ .hw_reset = sunxi_mmc_hw_reset, -+}; -+ -+static int sunxi_mmc_resource_request(struct sunxi_mmc_host *host, -+ struct platform_device *pdev) -+{ -+ struct device_node *np = pdev->dev.of_node; -+ int ret; -+ -+ if (of_device_is_compatible(np, "allwinner,sun4i-a10-mmc")) -+ host->idma_des_size_bits = 13; -+ else -+ host->idma_des_size_bits = 16; -+ -+ host->vmmc = devm_regulator_get_optional(&pdev->dev, "vmmc"); -+ if (IS_ERR(host->vmmc) && PTR_ERR(host->vmmc) == -EPROBE_DEFER) -+ return -EPROBE_DEFER; -+ -+ host->reg_base = devm_ioremap_resource(&pdev->dev, -+ platform_get_resource(pdev, IORESOURCE_MEM, 0)); -+ if (IS_ERR(host->reg_base)) -+ return PTR_ERR(host->reg_base); -+ -+ host->clk_ahb = devm_clk_get(&pdev->dev, "ahb"); -+ if (IS_ERR(host->clk_ahb)) { -+ dev_err(&pdev->dev, "Could not get ahb clock\n"); -+ return PTR_ERR(host->clk_ahb); -+ } -+ -+ host->clk_mod = devm_clk_get(&pdev->dev, "mod"); -+ if (IS_ERR(host->clk_mod)) { -+ dev_err(&pdev->dev, "Could not get mod clock\n"); -+ return PTR_ERR(host->clk_mod); -+ } -+ -+ host->reset = devm_reset_control_get(&pdev->dev, "ahb"); -+ if (IS_ERR(host->reset)) -+ host->reset = NULL; /* Having a reset controller is optional */ -+ -+ /* -+ * Sometimes the controller asserts the irq on boot for some reason, -+ * and since it is not clocked there is no way to clear it. So make -+ * sure the controller is in a sane state before enabling irqs. -+ */ -+ ret = sunxi_mmc_init_host(host->mmc); -+ if (ret) -+ return ret; -+ -+ host->irq = platform_get_irq(pdev, 0); -+ ret = devm_request_irq(&pdev->dev, host->irq, sunxi_mmc_irq, 0, -+ "sunxi-mmc", host); -+ if (ret == 0) -+ disable_irq(host->irq); -+ -+ /* And disable the controller again */ -+ sunxi_mmc_exit_host(host); -+ -+ return ret; -+} -+ -+static int sunxi_mmc_probe(struct platform_device *pdev) -+{ -+ struct sunxi_mmc_host *host; -+ struct mmc_host *mmc; -+ int ret; -+ -+ mmc = mmc_alloc_host(sizeof(struct sunxi_mmc_host), &pdev->dev); -+ if (!mmc) { -+ dev_err(&pdev->dev, "mmc alloc host failed\n"); -+ return -ENOMEM; -+ } -+ -+ host = mmc_priv(mmc); -+ host->mmc = mmc; -+ spin_lock_init(&host->lock); -+ tasklet_init(&host->manual_stop_tasklet, -+ sunxi_mmc_manual_stop_tasklet, (unsigned long)host); -+ -+ ret = sunxi_mmc_resource_request(host, pdev); -+ if (ret) -+ goto error_free_host; -+ -+ host->sg_cpu = dma_alloc_coherent(&pdev->dev, PAGE_SIZE, -+ &host->sg_dma, GFP_KERNEL); -+ if (!host->sg_cpu) { -+ dev_err(&pdev->dev, "Failed to allocate DMA descriptor mem\n"); -+ ret = -ENOMEM; -+ goto error_free_host; -+ } -+ -+ mmc->ops = &sunxi_mmc_ops; -+ mmc->max_blk_count = 8192; -+ mmc->max_blk_size = 4096; -+ mmc->max_segs = PAGE_SIZE / sizeof(struct sunxi_idma_des); -+ mmc->max_seg_size = (1 << host->idma_des_size_bits); -+ mmc->max_req_size = mmc->max_seg_size * mmc->max_segs; -+ /* 400kHz ~ 50MHz */ -+ mmc->f_min = 400000; -+ mmc->f_max = 50000000; -+ /* available voltages */ -+ if (!IS_ERR(host->vmmc)) -+ mmc->ocr_avail = mmc_regulator_get_ocrmask(host->vmmc); -+ else -+ mmc->ocr_avail = MMC_VDD_32_33 | MMC_VDD_33_34; -+ -+ mmc->caps |= MMC_CAP_MMC_HIGHSPEED | MMC_CAP_SD_HIGHSPEED; -+ mmc->caps2 |= MMC_CAP2_NO_PRESCAN_POWERUP; -+ -+ ret = mmc_of_parse(mmc); -+ if (ret) -+ goto error_free_dma; -+ -+ ret = mmc_add_host(mmc); -+ if (ret) -+ goto error_free_dma; -+ -+ dev_info(&pdev->dev, "base:0x%p irq:%u\n", host->reg_base, host->irq); -+ platform_set_drvdata(pdev, mmc); -+ return 0; -+ -+error_free_dma: -+ dma_free_coherent(&pdev->dev, PAGE_SIZE, host->sg_cpu, host->sg_dma); -+error_free_host: -+ mmc_free_host(mmc); -+ return ret; -+} -+ -+static int sunxi_mmc_remove(struct platform_device *pdev) -+{ -+ struct mmc_host *mmc = platform_get_drvdata(pdev); -+ struct sunxi_mmc_host *host = mmc_priv(mmc); -+ -+ mmc_remove_host(mmc); -+ sunxi_mmc_exit_host(host); -+ tasklet_disable(&host->manual_stop_tasklet); -+ dma_free_coherent(&pdev->dev, PAGE_SIZE, host->sg_cpu, host->sg_dma); -+ mmc_free_host(mmc); -+ -+ return 0; -+} -+ -+static struct platform_driver sunxi_mmc_driver = { -+ .driver = { -+ .name = "sunxi-mmc", -+ .owner = THIS_MODULE, -+ .of_match_table = of_match_ptr(sunxi_mmc_of_match), -+ }, -+ .probe = sunxi_mmc_probe, -+ .remove = sunxi_mmc_remove, -+}; -+module_platform_driver(sunxi_mmc_driver); -+ -+MODULE_DESCRIPTION("Allwinner's SD/MMC Card Controller Driver"); -+MODULE_LICENSE("GPL v2"); -+MODULE_AUTHOR("David Lanzend�rfer "); -+MODULE_ALIAS("platform:sunxi-mmc"); -diff --git a/include/linux/clk/sunxi.h b/include/linux/clk/sunxi.h -new file mode 100644 -index 0000000..1ef5c89 ---- /dev/null -+++ b/include/linux/clk/sunxi.h -@@ -0,0 +1,22 @@ -+/* -+ * Copyright 2013 - Hans de Goede -+ * -+ * 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. -+ */ -+ -+#ifndef __LINUX_CLK_SUNXI_H_ -+#define __LINUX_CLK_SUNXI_H_ -+ -+#include -+ -+void clk_sunxi_mmc_phase_control(struct clk_hw *hw, u8 sample, u8 output); -+ -+#endif --- -1.9.0 - diff --git a/0001-HID-rmi-do-not-handle-touchscreens-through-hid-rmi.patch b/0001-HID-rmi-do-not-handle-touchscreens-through-hid-rmi.patch deleted file mode 100644 index e9015c9..0000000 --- a/0001-HID-rmi-do-not-handle-touchscreens-through-hid-rmi.patch +++ /dev/null @@ -1,102 +0,0 @@ -Bugzilla: 1089583 -Upstream-status: Sent for 3.15 - -From 4cebb979af8d7bd1ec463406eaf57a44bd5b9f04 Mon Sep 17 00:00:00 2001 -From: Benjamin Tissoires -Date: Tue, 22 Apr 2014 11:21:00 -0400 -Subject: [PATCH] HID: rmi: do not handle touchscreens through hid-rmi - -Currently, hid-rmi drives every Synaptics product, but the touchscreens -on the Windows tablets should be handled through hid-multitouch. - -Instead of providing a long list of PIDs, rely on the scan_report -capability to detect which should go to hid-multitouch, and which -should not go to hid-rmi. - -We introduce a generic HID_GROUP_HAVE_SPECIAL_DRIVER which can be reused -amoung other drivers if they want to have a catch rule but still -have multitouch devices handled through hid-multitouch. - -related bug: -https://bugzilla.kernel.org/show_bug.cgi?id=74241 -https://bugzilla.redhat.com/show_bug.cgi?id=1089583 - -Signed-off-by: Benjamin Tissoires ---- - drivers/hid/hid-core.c | 10 ++++++++-- - drivers/hid/hid-rmi.c | 6 ++++-- - include/linux/hid.h | 13 +++++++++++++ - 3 files changed, 25 insertions(+), 4 deletions(-) - -diff --git a/drivers/hid/hid-core.c b/drivers/hid/hid-core.c -index 6ba2fd0..ea18639 100644 ---- a/drivers/hid/hid-core.c -+++ b/drivers/hid/hid-core.c -@@ -776,6 +776,14 @@ static int hid_scan_report(struct hid_device *hid) - (hid->group == HID_GROUP_MULTITOUCH)) - hid->group = HID_GROUP_MULTITOUCH_WIN_8; - -+ /* -+ * Vendor specific handlings -+ */ -+ if ((hid->vendor == USB_VENDOR_ID_SYNAPTICS) && -+ (hid->group == HID_GROUP_GENERIC)) -+ /* hid-rmi should take care of them, not hid-generic */ -+ hid->group = HID_GROUP_HAVE_SPECIAL_DRIVER; -+ - vfree(parser); - return 0; - } -@@ -1840,8 +1848,6 @@ static const struct hid_device_id hid_have_special_driver[] = { - { HID_USB_DEVICE(USB_VENDOR_ID_SONY, USB_DEVICE_ID_SONY_VAIO_VGP_MOUSE) }, - { HID_USB_DEVICE(USB_VENDOR_ID_STEELSERIES, USB_DEVICE_ID_STEELSERIES_SRWS1) }, - { HID_USB_DEVICE(USB_VENDOR_ID_SUNPLUS, USB_DEVICE_ID_SUNPLUS_WDESKTOP) }, -- { HID_USB_DEVICE(USB_VENDOR_ID_SYNAPTICS, HID_ANY_ID) }, -- { HID_I2C_DEVICE(USB_VENDOR_ID_SYNAPTICS, HID_ANY_ID) }, - { HID_USB_DEVICE(USB_VENDOR_ID_THINGM, USB_DEVICE_ID_BLINK1) }, - { HID_USB_DEVICE(USB_VENDOR_ID_THRUSTMASTER, 0xb300) }, - { HID_USB_DEVICE(USB_VENDOR_ID_THRUSTMASTER, 0xb304) }, -diff --git a/drivers/hid/hid-rmi.c b/drivers/hid/hid-rmi.c -index a4f04d4..a97a373 100644 ---- a/drivers/hid/hid-rmi.c -+++ b/drivers/hid/hid-rmi.c -@@ -863,8 +863,10 @@ static void rmi_remove(struct hid_device *hdev) - } - - static const struct hid_device_id rmi_id[] = { -- { HID_I2C_DEVICE(USB_VENDOR_ID_SYNAPTICS, HID_ANY_ID) }, -- { HID_USB_DEVICE(USB_VENDOR_ID_SYNAPTICS, HID_ANY_ID) }, -+ { HID_DEVICE(BUS_I2C, HID_GROUP_HAVE_SPECIAL_DRIVER, -+ USB_VENDOR_ID_SYNAPTICS, HID_ANY_ID) }, -+ { HID_DEVICE(BUS_USB, HID_GROUP_HAVE_SPECIAL_DRIVER, -+ USB_VENDOR_ID_SYNAPTICS, HID_ANY_ID) }, - { } - }; - MODULE_DEVICE_TABLE(hid, rmi_id); -diff --git a/include/linux/hid.h b/include/linux/hid.h -index 1b5f1e9..2fdd612 100644 ---- a/include/linux/hid.h -+++ b/include/linux/hid.h -@@ -299,6 +299,19 @@ struct hid_item { - #define HID_GROUP_MULTITOUCH 0x0002 - #define HID_GROUP_SENSOR_HUB 0x0003 - #define HID_GROUP_MULTITOUCH_WIN_8 0x0004 -+#define HID_GROUP_HAVE_SPECIAL_DRIVER 0xffff -+/* -+ * HID_GROUP_HAVE_SPECIAL_DRIVER should be used when the device needs to be -+ * scanned in case it is handled by either hid-multitouch, hid-generic, -+ * hid-sensor-hub or any other generic hid driver. -+ * -+ * Devices declared in hid_have_special_driver[] in hid-core.c can use -+ * HID_GROUP_ANY instead because there will be not overlap between their -+ * specific driver and a generic one. -+ * -+ * Note: HID_GROUP_ANY is declared in linux/mod_devicetable.h -+ * and has a value of 0x0000 -+ */ - - /* - * This is the global environment of the parser. This information is --- -1.9.0 - diff --git a/0001-HID-rmi-introduce-RMI-driver-for-Synaptics-touchpads.patch b/0001-HID-rmi-introduce-RMI-driver-for-Synaptics-touchpads.patch deleted file mode 100644 index 6321746..0000000 --- a/0001-HID-rmi-introduce-RMI-driver-for-Synaptics-touchpads.patch +++ /dev/null @@ -1,1001 +0,0 @@ -Bugzilla: 1048314 -Upstream-status: Queued for 3.16 - -From 39141443c8ea2900af627d688a255e064e2b6e19 Mon Sep 17 00:00:00 2001 -From: Benjamin Tissoires -Date: Wed, 9 Apr 2014 11:09:21 -0400 -Subject: [PATCH] HID: rmi: introduce RMI driver for Synaptics touchpads - -This driver add support for RMI4 over USB or I2C. -The current state is that it uses its own RMI4 implementation, but once -RMI4 is merged upstream, the driver will be a transport driver for the -RMI4 library. - -Part of this driver should be considered as temporary. Most of the RMI4 -processing and input handling will be deleted at some point. - -I based my work on Andrew's regarding its port of RMI4 over HID (see -https://github.com/mightybigcar/synaptics-rmi4/tree/rmihid ) -This repo presents how the driver may looks like at the end: -https://github.com/mightybigcar/synaptics-rmi4/blob/rmihid/drivers/input/rmi4/rmi_hid.c - -Without this temporary solution, the workaround we gave to users -is to disable i2c-hid, which leads to disabling the touchscreen on the -XPS 11 and 12 (Haswell generation). - -Related bugs: -https://bugzilla.redhat.com/show_bug.cgi?id=1048314 -https://bugs.launchpad.net/ubuntu/+source/linux/+bug/1218973 - -Signed-off-by: Andrew Duggan -Signed-off-by: Benjamin Tissoires -Signed-off-by: Jiri Kosina - -- Removed obviously wrong hid_hw_stop() at the end of probe - -Signed-off-by: Benjamin Tissoires ---- - drivers/hid/Kconfig | 8 + - drivers/hid/Makefile | 1 + - drivers/hid/hid-core.c | 2 + - drivers/hid/hid-rmi.c | 890 +++++++++++++++++++++++++++++++++++++++++++++++++ - include/linux/hid.h | 2 + - 6 files changed, 946 insertions(+) - create mode 100644 drivers/hid/hid-rmi.c - -diff --git a/drivers/hid/Kconfig b/drivers/hid/Kconfig -index 34e2d39..b2d733b 100644 ---- a/drivers/hid/Kconfig -+++ b/drivers/hid/Kconfig -@@ -645,6 +645,14 @@ config HID_SUNPLUS - ---help--- - Support for Sunplus wireless desktop. - -+config HID_RMI -+ tristate "Synaptics RMI4 device support" -+ depends on HID -+ ---help--- -+ Support for Synaptics RMI4 touchpads. -+ Say Y here if you have a Synaptics RMI4 touchpads over i2c-hid or usbhid -+ and want support for its special functionalities. -+ - config HID_GREENASIA - tristate "GreenAsia (Product ID 0x12) game controller support" - depends on HID -diff --git a/drivers/hid/Makefile b/drivers/hid/Makefile -index 30e4431..b326f79 100644 ---- a/drivers/hid/Makefile -+++ b/drivers/hid/Makefile -@@ -96,6 +96,7 @@ obj-$(CONFIG_HID_ROCCAT) += hid-roccat.o hid-roccat-common.o \ - hid-roccat-arvo.o hid-roccat-isku.o hid-roccat-kone.o \ - hid-roccat-koneplus.o hid-roccat-konepure.o hid-roccat-kovaplus.o \ - hid-roccat-lua.o hid-roccat-pyra.o hid-roccat-ryos.o hid-roccat-savu.o -+obj-$(CONFIG_HID_RMI) += hid-rmi.o - obj-$(CONFIG_HID_SAITEK) += hid-saitek.o - obj-$(CONFIG_HID_SAMSUNG) += hid-samsung.o - obj-$(CONFIG_HID_SMARTJOYPLUS) += hid-sjoy.o -diff --git a/drivers/hid/hid-core.c b/drivers/hid/hid-core.c -index 253fe23..543dd1f 100644 ---- a/drivers/hid/hid-core.c -+++ b/drivers/hid/hid-core.c -@@ -1836,6 +1836,8 @@ static const struct hid_device_id hid_have_special_driver[] = { - { HID_USB_DEVICE(USB_VENDOR_ID_SONY, USB_DEVICE_ID_SONY_VAIO_VGP_MOUSE) }, - { HID_USB_DEVICE(USB_VENDOR_ID_STEELSERIES, USB_DEVICE_ID_STEELSERIES_SRWS1) }, - { HID_USB_DEVICE(USB_VENDOR_ID_SUNPLUS, USB_DEVICE_ID_SUNPLUS_WDESKTOP) }, -+ { HID_USB_DEVICE(USB_VENDOR_ID_SYNAPTICS, HID_ANY_ID) }, -+ { HID_I2C_DEVICE(USB_VENDOR_ID_SYNAPTICS, HID_ANY_ID) }, - { HID_USB_DEVICE(USB_VENDOR_ID_THINGM, USB_DEVICE_ID_BLINK1) }, - { HID_USB_DEVICE(USB_VENDOR_ID_THRUSTMASTER, 0xb300) }, - { HID_USB_DEVICE(USB_VENDOR_ID_THRUSTMASTER, 0xb304) }, -diff --git a/drivers/hid/hid-rmi.c b/drivers/hid/hid-rmi.c -new file mode 100644 -index 0000000..a4f04d4 ---- /dev/null -+++ b/drivers/hid/hid-rmi.c -@@ -0,0 +1,890 @@ -+/* -+ * Copyright (c) 2013 Andrew Duggan -+ * Copyright (c) 2013 Synaptics Incorporated -+ * Copyright (c) 2014 Benjamin Tissoires -+ * Copyright (c) 2014 Red Hat, Inc -+ * -+ * 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. -+ */ -+ -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include "hid-ids.h" -+ -+/* removed backported compat.h include */ -+ -+#define RMI_MOUSE_REPORT_ID 0x01 /* Mouse emulation Report */ -+#define RMI_WRITE_REPORT_ID 0x09 /* Output Report */ -+#define RMI_READ_ADDR_REPORT_ID 0x0a /* Output Report */ -+#define RMI_READ_DATA_REPORT_ID 0x0b /* Input Report */ -+#define RMI_ATTN_REPORT_ID 0x0c /* Input Report */ -+#define RMI_SET_RMI_MODE_REPORT_ID 0x0f /* Feature Report */ -+ -+/* flags */ -+#define RMI_READ_REQUEST_PENDING BIT(0) -+#define RMI_READ_DATA_PENDING BIT(1) -+#define RMI_STARTED BIT(2) -+ -+enum rmi_mode_type { -+ RMI_MODE_OFF = 0, -+ RMI_MODE_ATTN_REPORTS = 1, -+ RMI_MODE_NO_PACKED_ATTN_REPORTS = 2, -+}; -+ -+struct rmi_function { -+ unsigned page; /* page of the function */ -+ u16 query_base_addr; /* base address for queries */ -+ u16 command_base_addr; /* base address for commands */ -+ u16 control_base_addr; /* base address for controls */ -+ u16 data_base_addr; /* base address for datas */ -+ unsigned int interrupt_base; /* cross-function interrupt number -+ * (uniq in the device)*/ -+ unsigned int interrupt_count; /* number of interrupts */ -+ unsigned int report_size; /* size of a report */ -+ unsigned long irq_mask; /* mask of the interrupts -+ * (to be applied against ATTN IRQ) */ -+}; -+ -+/** -+ * struct rmi_data - stores information for hid communication -+ * -+ * @page_mutex: Locks current page to avoid changing pages in unexpected ways. -+ * @page: Keeps track of the current virtual page -+ * -+ * @wait: Used for waiting for read data -+ * -+ * @writeReport: output buffer when writing RMI registers -+ * @readReport: input buffer when reading RMI registers -+ * -+ * @input_report_size: size of an input report (advertised by HID) -+ * @output_report_size: size of an output report (advertised by HID) -+ * -+ * @flags: flags for the current device (started, reading, etc...) -+ * -+ * @f11: placeholder of internal RMI function F11 description -+ * @f30: placeholder of internal RMI function F30 description -+ * -+ * @max_fingers: maximum finger count reported by the device -+ * @max_x: maximum x value reported by the device -+ * @max_y: maximum y value reported by the device -+ * -+ * @gpio_led_count: count of GPIOs + LEDs reported by F30 -+ * @button_count: actual physical buttons count -+ * @button_mask: button mask used to decode GPIO ATTN reports -+ * @button_state_mask: pull state of the buttons -+ * -+ * @input: pointer to the kernel input device -+ * -+ * @reset_work: worker which will be called in case of a mouse report -+ * @hdev: pointer to the struct hid_device -+ */ -+struct rmi_data { -+ struct mutex page_mutex; -+ int page; -+ -+ wait_queue_head_t wait; -+ -+ u8 *writeReport; -+ u8 *readReport; -+ -+ int input_report_size; -+ int output_report_size; -+ -+ unsigned long flags; -+ -+ struct rmi_function f11; -+ struct rmi_function f30; -+ -+ unsigned int max_fingers; -+ unsigned int max_x; -+ unsigned int max_y; -+ unsigned int x_size_mm; -+ unsigned int y_size_mm; -+ -+ unsigned int gpio_led_count; -+ unsigned int button_count; -+ unsigned long button_mask; -+ unsigned long button_state_mask; -+ -+ struct input_dev *input; -+ -+ struct work_struct reset_work; -+ struct hid_device *hdev; -+}; -+ -+#define RMI_PAGE(addr) (((addr) >> 8) & 0xff) -+ -+static int rmi_write_report(struct hid_device *hdev, u8 *report, int len); -+ -+/** -+ * rmi_set_page - Set RMI page -+ * @hdev: The pointer to the hid_device struct -+ * @page: The new page address. -+ * -+ * RMI devices have 16-bit addressing, but some of the physical -+ * implementations (like SMBus) only have 8-bit addressing. So RMI implements -+ * a page address at 0xff of every page so we can reliable page addresses -+ * every 256 registers. -+ * -+ * The page_mutex lock must be held when this function is entered. -+ * -+ * Returns zero on success, non-zero on failure. -+ */ -+static int rmi_set_page(struct hid_device *hdev, u8 page) -+{ -+ struct rmi_data *data = hid_get_drvdata(hdev); -+ int retval; -+ -+ data->writeReport[0] = RMI_WRITE_REPORT_ID; -+ data->writeReport[1] = 1; -+ data->writeReport[2] = 0xFF; -+ data->writeReport[4] = page; -+ -+ retval = rmi_write_report(hdev, data->writeReport, -+ data->output_report_size); -+ if (retval != data->output_report_size) { -+ dev_err(&hdev->dev, -+ "%s: set page failed: %d.", __func__, retval); -+ return retval; -+ } -+ -+ data->page = page; -+ return 0; -+} -+ -+static int rmi_set_mode(struct hid_device *hdev, u8 mode) -+{ -+ int ret; -+ u8 txbuf[2] = {RMI_SET_RMI_MODE_REPORT_ID, mode}; -+ -+ ret = hid_hw_raw_request(hdev, RMI_SET_RMI_MODE_REPORT_ID, txbuf, -+ sizeof(txbuf), HID_FEATURE_REPORT, HID_REQ_SET_REPORT); -+ if (ret < 0) { -+ dev_err(&hdev->dev, "unable to set rmi mode to %d (%d)\n", mode, -+ ret); -+ return ret; -+ } -+ -+ return 0; -+} -+ -+static int rmi_write_report(struct hid_device *hdev, u8 *report, int len) -+{ -+ int ret; -+ -+ ret = hid_hw_output_report(hdev, (void *)report, len); -+ if (ret < 0) { -+ dev_err(&hdev->dev, "failed to write hid report (%d)\n", ret); -+ return ret; -+ } -+ -+ return ret; -+} -+ -+static int rmi_read_block(struct hid_device *hdev, u16 addr, void *buf, -+ const int len) -+{ -+ struct rmi_data *data = hid_get_drvdata(hdev); -+ int ret; -+ int bytes_read; -+ int bytes_needed; -+ int retries; -+ int read_input_count; -+ -+ mutex_lock(&data->page_mutex); -+ -+ if (RMI_PAGE(addr) != data->page) { -+ ret = rmi_set_page(hdev, RMI_PAGE(addr)); -+ if (ret < 0) -+ goto exit; -+ } -+ -+ for (retries = 5; retries > 0; retries--) { -+ data->writeReport[0] = RMI_READ_ADDR_REPORT_ID; -+ data->writeReport[1] = 0; /* old 1 byte read count */ -+ data->writeReport[2] = addr & 0xFF; -+ data->writeReport[3] = (addr >> 8) & 0xFF; -+ data->writeReport[4] = len & 0xFF; -+ data->writeReport[5] = (len >> 8) & 0xFF; -+ -+ set_bit(RMI_READ_REQUEST_PENDING, &data->flags); -+ -+ ret = rmi_write_report(hdev, data->writeReport, -+ data->output_report_size); -+ if (ret != data->output_report_size) { -+ clear_bit(RMI_READ_REQUEST_PENDING, &data->flags); -+ dev_err(&hdev->dev, -+ "failed to write request output report (%d)\n", -+ ret); -+ goto exit; -+ } -+ -+ bytes_read = 0; -+ bytes_needed = len; -+ while (bytes_read < len) { -+ if (!wait_event_timeout(data->wait, -+ test_bit(RMI_READ_DATA_PENDING, &data->flags), -+ msecs_to_jiffies(1000))) { -+ hid_warn(hdev, "%s: timeout elapsed\n", -+ __func__); -+ ret = -EAGAIN; -+ break; -+ } -+ -+ read_input_count = data->readReport[1]; -+ memcpy(buf + bytes_read, &data->readReport[2], -+ read_input_count < bytes_needed ? -+ read_input_count : bytes_needed); -+ -+ bytes_read += read_input_count; -+ bytes_needed -= read_input_count; -+ clear_bit(RMI_READ_DATA_PENDING, &data->flags); -+ } -+ -+ if (ret >= 0) { -+ ret = 0; -+ break; -+ } -+ } -+ -+exit: -+ clear_bit(RMI_READ_REQUEST_PENDING, &data->flags); -+ mutex_unlock(&data->page_mutex); -+ return ret; -+} -+ -+static inline int rmi_read(struct hid_device *hdev, u16 addr, void *buf) -+{ -+ return rmi_read_block(hdev, addr, buf, 1); -+} -+ -+static void rmi_f11_process_touch(struct rmi_data *hdata, int slot, -+ u8 finger_state, u8 *touch_data) -+{ -+ int x, y, wx, wy; -+ int wide, major, minor; -+ int z; -+ -+ input_mt_slot(hdata->input, slot); -+ input_mt_report_slot_state(hdata->input, MT_TOOL_FINGER, -+ finger_state == 0x01); -+ if (finger_state == 0x01) { -+ x = (touch_data[0] << 4) | (touch_data[2] & 0x07); -+ y = (touch_data[1] << 4) | (touch_data[2] >> 4); -+ wx = touch_data[3] & 0x07; -+ wy = touch_data[3] >> 4; -+ wide = (wx > wy); -+ major = max(wx, wy); -+ minor = min(wx, wy); -+ z = touch_data[4]; -+ -+ /* y is inverted */ -+ y = hdata->max_y - y; -+ -+ input_event(hdata->input, EV_ABS, ABS_MT_POSITION_X, x); -+ input_event(hdata->input, EV_ABS, ABS_MT_POSITION_Y, y); -+ input_event(hdata->input, EV_ABS, ABS_MT_ORIENTATION, wide); -+ input_event(hdata->input, EV_ABS, ABS_MT_PRESSURE, z); -+ input_event(hdata->input, EV_ABS, ABS_MT_TOUCH_MAJOR, major); -+ input_event(hdata->input, EV_ABS, ABS_MT_TOUCH_MINOR, minor); -+ } -+} -+ -+static void rmi_reset_work(struct work_struct *work) -+{ -+ struct rmi_data *hdata = container_of(work, struct rmi_data, -+ reset_work); -+ -+ /* switch the device to RMI if we receive a generic mouse report */ -+ rmi_set_mode(hdata->hdev, RMI_MODE_ATTN_REPORTS); -+} -+ -+static inline int rmi_schedule_reset(struct hid_device *hdev) -+{ -+ struct rmi_data *hdata = hid_get_drvdata(hdev); -+ return schedule_work(&hdata->reset_work); -+} -+ -+static int rmi_f11_input_event(struct hid_device *hdev, u8 irq, u8 *data, -+ int size) -+{ -+ struct rmi_data *hdata = hid_get_drvdata(hdev); -+ int offset; -+ int i; -+ -+ if (size < hdata->f11.report_size) -+ return 0; -+ -+ if (!(irq & hdata->f11.irq_mask)) -+ return 0; -+ -+ offset = (hdata->max_fingers >> 2) + 1; -+ for (i = 0; i < hdata->max_fingers; i++) { -+ int fs_byte_position = i >> 2; -+ int fs_bit_position = (i & 0x3) << 1; -+ int finger_state = (data[fs_byte_position] >> fs_bit_position) & -+ 0x03; -+ -+ rmi_f11_process_touch(hdata, i, finger_state, -+ &data[offset + 5 * i]); -+ } -+ input_mt_sync_frame(hdata->input); -+ input_sync(hdata->input); -+ return hdata->f11.report_size; -+} -+ -+static int rmi_f30_input_event(struct hid_device *hdev, u8 irq, u8 *data, -+ int size) -+{ -+ struct rmi_data *hdata = hid_get_drvdata(hdev); -+ int i; -+ int button = 0; -+ bool value; -+ -+ if (!(irq & hdata->f30.irq_mask)) -+ return 0; -+ -+ for (i = 0; i < hdata->gpio_led_count; i++) { -+ if (test_bit(i, &hdata->button_mask)) { -+ value = (data[i / 8] >> (i & 0x07)) & BIT(0); -+ if (test_bit(i, &hdata->button_state_mask)) -+ value = !value; -+ input_event(hdata->input, EV_KEY, BTN_LEFT + button++, -+ value); -+ } -+ } -+ return hdata->f30.report_size; -+} -+ -+static int rmi_input_event(struct hid_device *hdev, u8 *data, int size) -+{ -+ struct rmi_data *hdata = hid_get_drvdata(hdev); -+ unsigned long irq_mask = 0; -+ unsigned index = 2; -+ -+ if (!(test_bit(RMI_STARTED, &hdata->flags))) -+ return 0; -+ -+ irq_mask |= hdata->f11.irq_mask; -+ irq_mask |= hdata->f30.irq_mask; -+ -+ if (data[1] & ~irq_mask) -+ hid_warn(hdev, "unknown intr source:%02lx %s:%d\n", -+ data[1] & ~irq_mask, __FILE__, __LINE__); -+ -+ if (hdata->f11.interrupt_base < hdata->f30.interrupt_base) { -+ index += rmi_f11_input_event(hdev, data[1], &data[index], -+ size - index); -+ index += rmi_f30_input_event(hdev, data[1], &data[index], -+ size - index); -+ } else { -+ index += rmi_f30_input_event(hdev, data[1], &data[index], -+ size - index); -+ index += rmi_f11_input_event(hdev, data[1], &data[index], -+ size - index); -+ } -+ -+ return 1; -+} -+ -+static int rmi_read_data_event(struct hid_device *hdev, u8 *data, int size) -+{ -+ struct rmi_data *hdata = hid_get_drvdata(hdev); -+ -+ if (!test_bit(RMI_READ_REQUEST_PENDING, &hdata->flags)) { -+ hid_err(hdev, "no read request pending\n"); -+ return 0; -+ } -+ -+ memcpy(hdata->readReport, data, size < hdata->input_report_size ? -+ size : hdata->input_report_size); -+ set_bit(RMI_READ_DATA_PENDING, &hdata->flags); -+ wake_up(&hdata->wait); -+ -+ return 1; -+} -+ -+static int rmi_raw_event(struct hid_device *hdev, -+ struct hid_report *report, u8 *data, int size) -+{ -+ switch (data[0]) { -+ case RMI_READ_DATA_REPORT_ID: -+ return rmi_read_data_event(hdev, data, size); -+ case RMI_ATTN_REPORT_ID: -+ return rmi_input_event(hdev, data, size); -+ case RMI_MOUSE_REPORT_ID: -+ rmi_schedule_reset(hdev); -+ break; -+ } -+ -+ return 0; -+} -+ -+static int rmi_post_reset(struct hid_device *hdev) -+{ -+ return rmi_set_mode(hdev, RMI_MODE_ATTN_REPORTS); -+} -+ -+static int rmi_post_resume(struct hid_device *hdev) -+{ -+ return rmi_set_mode(hdev, RMI_MODE_ATTN_REPORTS); -+} -+ -+#define RMI4_MAX_PAGE 0xff -+#define RMI4_PAGE_SIZE 0x0100 -+ -+#define PDT_START_SCAN_LOCATION 0x00e9 -+#define PDT_END_SCAN_LOCATION 0x0005 -+#define RMI4_END_OF_PDT(id) ((id) == 0x00 || (id) == 0xff) -+ -+struct pdt_entry { -+ u8 query_base_addr:8; -+ u8 command_base_addr:8; -+ u8 control_base_addr:8; -+ u8 data_base_addr:8; -+ u8 interrupt_source_count:3; -+ u8 bits3and4:2; -+ u8 function_version:2; -+ u8 bit7:1; -+ u8 function_number:8; -+} __attribute__((__packed__)); -+ -+static inline unsigned long rmi_gen_mask(unsigned irq_base, unsigned irq_count) -+{ -+ return GENMASK(irq_count + irq_base - 1, irq_base); -+} -+ -+static void rmi_register_function(struct rmi_data *data, -+ struct pdt_entry *pdt_entry, int page, unsigned interrupt_count) -+{ -+ struct rmi_function *f = NULL; -+ u16 page_base = page << 8; -+ -+ switch (pdt_entry->function_number) { -+ case 0x11: -+ f = &data->f11; -+ break; -+ case 0x30: -+ f = &data->f30; -+ break; -+ } -+ -+ if (f) { -+ f->page = page; -+ f->query_base_addr = page_base | pdt_entry->query_base_addr; -+ f->command_base_addr = page_base | pdt_entry->command_base_addr; -+ f->control_base_addr = page_base | pdt_entry->control_base_addr; -+ f->data_base_addr = page_base | pdt_entry->data_base_addr; -+ f->interrupt_base = interrupt_count; -+ f->interrupt_count = pdt_entry->interrupt_source_count; -+ f->irq_mask = rmi_gen_mask(f->interrupt_base, -+ f->interrupt_count); -+ } -+} -+ -+static int rmi_scan_pdt(struct hid_device *hdev) -+{ -+ struct rmi_data *data = hid_get_drvdata(hdev); -+ struct pdt_entry entry; -+ int page; -+ bool page_has_function; -+ int i; -+ int retval; -+ int interrupt = 0; -+ u16 page_start, pdt_start , pdt_end; -+ -+ hid_info(hdev, "Scanning PDT...\n"); -+ -+ for (page = 0; (page <= RMI4_MAX_PAGE); page++) { -+ page_start = RMI4_PAGE_SIZE * page; -+ pdt_start = page_start + PDT_START_SCAN_LOCATION; -+ pdt_end = page_start + PDT_END_SCAN_LOCATION; -+ -+ page_has_function = false; -+ for (i = pdt_start; i >= pdt_end; i -= sizeof(entry)) { -+ retval = rmi_read_block(hdev, i, &entry, sizeof(entry)); -+ if (retval) { -+ hid_err(hdev, -+ "Read of PDT entry at %#06x failed.\n", -+ i); -+ goto error_exit; -+ } -+ -+ if (RMI4_END_OF_PDT(entry.function_number)) -+ break; -+ -+ page_has_function = true; -+ -+ hid_info(hdev, "Found F%02X on page %#04x\n", -+ entry.function_number, page); -+ -+ rmi_register_function(data, &entry, page, interrupt); -+ interrupt += entry.interrupt_source_count; -+ } -+ -+ if (!page_has_function) -+ break; -+ } -+ -+ hid_info(hdev, "%s: Done with PDT scan.\n", __func__); -+ retval = 0; -+ -+error_exit: -+ return retval; -+} -+ -+static int rmi_populate_f11(struct hid_device *hdev) -+{ -+ struct rmi_data *data = hid_get_drvdata(hdev); -+ u8 buf[20]; -+ int ret; -+ bool has_query12; -+ bool has_physical_props; -+ unsigned x_size, y_size; -+ -+ if (!data->f11.query_base_addr) { -+ hid_err(hdev, "No 2D sensor found, giving up.\n"); -+ return -ENODEV; -+ } -+ -+ /* query 0 contains some useful information */ -+ ret = rmi_read(hdev, data->f11.query_base_addr, buf); -+ if (ret) { -+ hid_err(hdev, "can not get query 0: %d.\n", ret); -+ return ret; -+ } -+ has_query12 = !!(buf[0] & BIT(5)); -+ -+ /* query 1 to get the max number of fingers */ -+ ret = rmi_read(hdev, data->f11.query_base_addr + 1, buf); -+ if (ret) { -+ hid_err(hdev, "can not get NumberOfFingers: %d.\n", ret); -+ return ret; -+ } -+ data->max_fingers = (buf[0] & 0x07) + 1; -+ if (data->max_fingers > 5) -+ data->max_fingers = 10; -+ -+ data->f11.report_size = data->max_fingers * 5 + -+ DIV_ROUND_UP(data->max_fingers, 4); -+ -+ if (!(buf[0] & BIT(4))) { -+ hid_err(hdev, "No absolute events, giving up.\n"); -+ return -ENODEV; -+ } -+ -+ /* -+ * query 12 to know if the physical properties are reported -+ * (query 12 is at offset 10 for HID devices) -+ */ -+ if (has_query12) { -+ ret = rmi_read(hdev, data->f11.query_base_addr + 10, buf); -+ if (ret) { -+ hid_err(hdev, "can not get query 12: %d.\n", ret); -+ return ret; -+ } -+ has_physical_props = !!(buf[0] & BIT(5)); -+ -+ if (has_physical_props) { -+ ret = rmi_read_block(hdev, -+ data->f11.query_base_addr + 11, buf, 4); -+ if (ret) { -+ hid_err(hdev, "can not read query 15-18: %d.\n", -+ ret); -+ return ret; -+ } -+ -+ x_size = buf[0] | (buf[1] << 8); -+ y_size = buf[2] | (buf[3] << 8); -+ -+ data->x_size_mm = DIV_ROUND_CLOSEST(x_size, 10); -+ data->y_size_mm = DIV_ROUND_CLOSEST(y_size, 10); -+ -+ hid_info(hdev, "%s: size in mm: %d x %d\n", -+ __func__, data->x_size_mm, data->y_size_mm); -+ } -+ } -+ -+ /* retrieve the ctrl registers */ -+ ret = rmi_read_block(hdev, data->f11.control_base_addr, buf, 20); -+ if (ret) { -+ hid_err(hdev, "can not read ctrl block of size 20: %d.\n", ret); -+ return ret; -+ } -+ -+ data->max_x = buf[6] | (buf[7] << 8); -+ data->max_y = buf[8] | (buf[9] << 8); -+ -+ return 0; -+} -+ -+static int rmi_populate_f30(struct hid_device *hdev) -+{ -+ struct rmi_data *data = hid_get_drvdata(hdev); -+ u8 buf[20]; -+ int ret; -+ bool has_gpio, has_led; -+ unsigned bytes_per_ctrl; -+ u8 ctrl2_addr; -+ int ctrl2_3_length; -+ int i; -+ -+ /* function F30 is for physical buttons */ -+ if (!data->f30.query_base_addr) { -+ hid_err(hdev, "No GPIO/LEDs found, giving up.\n"); -+ return -ENODEV; -+ } -+ -+ ret = rmi_read_block(hdev, data->f30.query_base_addr, buf, 2); -+ if (ret) { -+ hid_err(hdev, "can not get F30 query registers: %d.\n", ret); -+ return ret; -+ } -+ -+ has_gpio = !!(buf[0] & BIT(3)); -+ has_led = !!(buf[0] & BIT(2)); -+ data->gpio_led_count = buf[1] & 0x1f; -+ -+ /* retrieve ctrl 2 & 3 registers */ -+ bytes_per_ctrl = (data->gpio_led_count + 7) / 8; -+ /* Ctrl0 is present only if both has_gpio and has_led are set*/ -+ ctrl2_addr = (has_gpio && has_led) ? bytes_per_ctrl : 0; -+ /* Ctrl1 is always be present */ -+ ctrl2_addr += bytes_per_ctrl; -+ ctrl2_3_length = 2 * bytes_per_ctrl; -+ -+ data->f30.report_size = bytes_per_ctrl; -+ -+ ret = rmi_read_block(hdev, data->f30.control_base_addr + ctrl2_addr, -+ buf, ctrl2_3_length); -+ if (ret) { -+ hid_err(hdev, "can not read ctrl 2&3 block of size %d: %d.\n", -+ ctrl2_3_length, ret); -+ return ret; -+ } -+ -+ for (i = 0; i < data->gpio_led_count; i++) { -+ int byte_position = i >> 3; -+ int bit_position = i & 0x07; -+ u8 dir_byte = buf[byte_position]; -+ u8 data_byte = buf[byte_position + bytes_per_ctrl]; -+ bool dir = (dir_byte >> bit_position) & BIT(0); -+ bool dat = (data_byte >> bit_position) & BIT(0); -+ -+ if (dir == 0) { -+ /* input mode */ -+ if (dat) { -+ /* actual buttons have pull up resistor */ -+ data->button_count++; -+ set_bit(i, &data->button_mask); -+ set_bit(i, &data->button_state_mask); -+ } -+ } -+ -+ } -+ -+ return 0; -+} -+ -+static int rmi_populate(struct hid_device *hdev) -+{ -+ int ret; -+ -+ ret = rmi_scan_pdt(hdev); -+ if (ret) { -+ hid_err(hdev, "PDT scan failed with code %d.\n", ret); -+ return ret; -+ } -+ -+ ret = rmi_populate_f11(hdev); -+ if (ret) { -+ hid_err(hdev, "Error while initializing F11 (%d).\n", ret); -+ return ret; -+ } -+ -+ ret = rmi_populate_f30(hdev); -+ if (ret) -+ hid_warn(hdev, "Error while initializing F30 (%d).\n", ret); -+ -+ return 0; -+} -+ -+static void rmi_input_configured(struct hid_device *hdev, struct hid_input *hi) -+{ -+ struct rmi_data *data = hid_get_drvdata(hdev); -+ struct input_dev *input = hi->input; -+ int ret; -+ int res_x, res_y, i; -+ -+ data->input = input; -+ -+ hid_dbg(hdev, "Opening low level driver\n"); -+ ret = hid_hw_open(hdev); -+ if (ret) -+ return; -+ -+ /* Allow incoming hid reports */ -+ hid_device_io_start(hdev); -+ -+ ret = rmi_set_mode(hdev, RMI_MODE_ATTN_REPORTS); -+ if (ret < 0) { -+ dev_err(&hdev->dev, "failed to set rmi mode\n"); -+ goto exit; -+ } -+ -+ ret = rmi_set_page(hdev, 0); -+ if (ret < 0) { -+ dev_err(&hdev->dev, "failed to set page select to 0.\n"); -+ goto exit; -+ } -+ -+ ret = rmi_populate(hdev); -+ if (ret) -+ goto exit; -+ -+ __set_bit(EV_ABS, input->evbit); -+ input_set_abs_params(input, ABS_MT_POSITION_X, 1, data->max_x, 0, 0); -+ input_set_abs_params(input, ABS_MT_POSITION_Y, 1, data->max_y, 0, 0); -+ -+ if (data->x_size_mm && data->x_size_mm) { -+ res_x = (data->max_x - 1) / data->x_size_mm; -+ res_y = (data->max_y - 1) / data->x_size_mm; -+ -+ input_abs_set_res(input, ABS_MT_POSITION_X, res_x); -+ input_abs_set_res(input, ABS_MT_POSITION_Y, res_y); -+ } -+ -+ input_set_abs_params(input, ABS_MT_ORIENTATION, 0, 1, 0, 0); -+ input_set_abs_params(input, ABS_MT_PRESSURE, 0, 0xff, 0, 0); -+ input_set_abs_params(input, ABS_MT_TOUCH_MAJOR, 0, 0x0f, 0, 0); -+ input_set_abs_params(input, ABS_MT_TOUCH_MINOR, 0, 0x0f, 0, 0); -+ -+ input_mt_init_slots(input, data->max_fingers, INPUT_MT_POINTER); -+ -+ if (data->button_count) { -+ __set_bit(EV_KEY, input->evbit); -+ for (i = 0; i < data->button_count; i++) -+ __set_bit(BTN_LEFT + i, input->keybit); -+ -+ if (data->button_count == 1) -+ __set_bit(INPUT_PROP_BUTTONPAD, input->propbit); -+ } -+ -+ set_bit(RMI_STARTED, &data->flags); -+ -+exit: -+ hid_device_io_stop(hdev); -+ hid_hw_close(hdev); -+} -+ -+static int rmi_input_mapping(struct hid_device *hdev, -+ struct hid_input *hi, struct hid_field *field, -+ struct hid_usage *usage, unsigned long **bit, int *max) -+{ -+ /* we want to make HID ignore the advertised HID collection */ -+ return -1; -+} -+ -+static int rmi_probe(struct hid_device *hdev, const struct hid_device_id *id) -+{ -+ struct rmi_data *data = NULL; -+ int ret; -+ size_t alloc_size; -+ -+ data = devm_kzalloc(&hdev->dev, sizeof(struct rmi_data), GFP_KERNEL); -+ if (!data) -+ return -ENOMEM; -+ -+ INIT_WORK(&data->reset_work, rmi_reset_work); -+ data->hdev = hdev; -+ -+ hid_set_drvdata(hdev, data); -+ -+ hdev->quirks |= HID_QUIRK_NO_INIT_REPORTS; -+ -+ ret = hid_parse(hdev); -+ if (ret) { -+ hid_err(hdev, "parse failed\n"); -+ return ret; -+ } -+ -+ data->input_report_size = (hdev->report_enum[HID_INPUT_REPORT] -+ .report_id_hash[RMI_ATTN_REPORT_ID]->size >> 3) -+ + 1 /* report id */; -+ data->output_report_size = (hdev->report_enum[HID_OUTPUT_REPORT] -+ .report_id_hash[RMI_WRITE_REPORT_ID]->size >> 3) -+ + 1 /* report id */; -+ -+ alloc_size = data->output_report_size + data->input_report_size; -+ -+ data->writeReport = devm_kzalloc(&hdev->dev, alloc_size, GFP_KERNEL); -+ if (!data->writeReport) { -+ ret = -ENOMEM; -+ return ret; -+ } -+ -+ data->readReport = data->writeReport + data->output_report_size; -+ -+ init_waitqueue_head(&data->wait); -+ -+ mutex_init(&data->page_mutex); -+ -+ ret = hid_hw_start(hdev, HID_CONNECT_DEFAULT); -+ if (ret) { -+ hid_err(hdev, "hw start failed\n"); -+ return ret; -+ } -+ -+ if (!test_bit(RMI_STARTED, &data->flags)) { -+ hid_hw_stop(hdev); -+ return -EIO; -+ } -+ -+ return 0; -+} -+ -+static void rmi_remove(struct hid_device *hdev) -+{ -+ struct rmi_data *hdata = hid_get_drvdata(hdev); -+ -+ clear_bit(RMI_STARTED, &hdata->flags); -+ -+ hid_hw_stop(hdev); -+} -+ -+static const struct hid_device_id rmi_id[] = { -+ { HID_I2C_DEVICE(USB_VENDOR_ID_SYNAPTICS, HID_ANY_ID) }, -+ { HID_USB_DEVICE(USB_VENDOR_ID_SYNAPTICS, HID_ANY_ID) }, -+ { } -+}; -+MODULE_DEVICE_TABLE(hid, rmi_id); -+ -+static struct hid_driver rmi_driver = { -+ .name = "hid-rmi", -+ .id_table = rmi_id, -+ .probe = rmi_probe, -+ .remove = rmi_remove, -+ .raw_event = rmi_raw_event, -+ .input_mapping = rmi_input_mapping, -+ .input_configured = rmi_input_configured, -+#ifdef CONFIG_PM -+ .resume = rmi_post_resume, -+ .reset_resume = rmi_post_reset, -+#endif -+}; -+ -+module_hid_driver(rmi_driver); -+ -+MODULE_AUTHOR("Andrew Duggan "); -+MODULE_DESCRIPTION("RMI HID driver"); -+MODULE_LICENSE("GPL"); -diff --git a/include/linux/hid.h b/include/linux/hid.h -index 31b9d29..1b5f1e9 100644 ---- a/include/linux/hid.h -+++ b/include/linux/hid.h -@@ -571,6 +571,8 @@ struct hid_descriptor { - .bus = BUS_USB, .vendor = (ven), .product = (prod) - #define HID_BLUETOOTH_DEVICE(ven, prod) \ - .bus = BUS_BLUETOOTH, .vendor = (ven), .product = (prod) -+#define HID_I2C_DEVICE(ven, prod) \ -+ .bus = BUS_I2C, .vendor = (ven), .product = (prod) - - #define HID_REPORT_ID(rep) \ - .report_type = (rep) --- -1.8.3.1 - diff --git a/HID-rmi-do-not-fetch-more-than-16-bytes-in-a-query.patch b/HID-rmi-do-not-fetch-more-than-16-bytes-in-a-query.patch deleted file mode 100644 index 972a1b1..0000000 --- a/HID-rmi-do-not-fetch-more-than-16-bytes-in-a-query.patch +++ /dev/null @@ -1,60 +0,0 @@ -Bugzilla: 1090161 -Upstream-status: sent https://patchwork.kernel.org/patch/4055781/ - -From patchwork Thu Apr 24 22:26:38 2014 -Content-Type: text/plain; charset="utf-8" -MIME-Version: 1.0 -Content-Transfer-Encoding: 7bit -Subject: HID: rmi: do not fetch more than 16 bytes in a query -From: Benjamin Tissoires -X-Patchwork-Id: 4055781 -Message-Id: <1398378398-24825-1-git-send-email-benjamin.tissoires@redhat.com> -To: Andrew Duggan , - Christopher Heiny , - Jiri Kosina , linux-input@vger.kernel.org, - linux-kernel@vger.kernel.org -Date: Thu, 24 Apr 2014 18:26:38 -0400 - -A firmware bug is present on the XPS Haswell edition which silently -split the request in two responses when the caller ask for a read of -more than 16 bytes. -The FW sends the first 16 then the 4 next, but it says that it answered -the 20 bytes in the first report. - -This occurs only on the retrieving of the min/max of X and Y of the F11 -function. -We only use the first 10 bytes of the Ctrl register, so we can get only -those 10 bytes to prevent the bug from happening. - -Resolves: -https://bugzilla.redhat.com/show_bug.cgi?id=1090161 - -Signed-off-by: Benjamin Tissoires - ---- -drivers/hid/hid-rmi.c | 11 ++++++++--- - 1 file changed, 8 insertions(+), 3 deletions(-) - -diff --git a/drivers/hid/hid-rmi.c b/drivers/hid/hid-rmi.c -index 7da9509..cee89c9 100644 ---- a/drivers/hid/hid-rmi.c -+++ b/drivers/hid/hid-rmi.c -@@ -613,10 +613,15 @@ static int rmi_populate_f11(struct hid_device *hdev) - } - } - -- /* retrieve the ctrl registers */ -- ret = rmi_read_block(hdev, data->f11.control_base_addr, buf, 20); -+ /* -+ * retrieve the ctrl registers -+ * the ctrl register has a size of 20 but a fw bug split it into 16 + 4, -+ * and there is no way to know if the first 20 bytes are here or not. -+ * We use only the first 10 bytes, so get only them. -+ */ -+ ret = rmi_read_block(hdev, data->f11.control_base_addr, buf, 10); - if (ret) { -- hid_err(hdev, "can not read ctrl block of size 20: %d.\n", ret); -+ hid_err(hdev, "can not read ctrl block of size 10: %d.\n", ret); - return ret; - } - diff --git a/Makefile b/Makefile index 386683b..e63bbf2 100644 --- a/Makefile +++ b/Makefile @@ -47,6 +47,7 @@ debug: @perl -pi -e 's/# CONFIG_FAULT_INJECTION_DEBUG_FS is not set/CONFIG_FAULT_INJECTION_DEBUG_FS=y/' config-nodebug @perl -pi -e 's/# CONFIG_FAULT_INJECTION_STACKTRACE_FILTER is not set/CONFIG_FAULT_INJECTION_STACKTRACE_FILTER=y/' config-nodebug @perl -pi -e 's/# CONFIG_DEBUG_SG is not set/CONFIG_DEBUG_SG=y/' config-nodebug + @perl -pi -e 's/# CONFIG_DEBUG_PI_LIST is not set/CONFIG_DEBUG_PI_LIST=y/' config-nodebug @perl -pi -e 's/# CONFIG_DEBUG_WRITECOUNT is not set/CONFIG_DEBUG_WRITECOUNT=y/' config-nodebug @perl -pi -e 's/# CONFIG_DEBUG_OBJECTS is not set/CONFIG_DEBUG_OBJECTS=y/' config-nodebug @perl -pi -e 's/# CONFIG_DEBUG_OBJECTS_FREE is not set/CONFIG_DEBUG_OBJECTS_FREE=y/' config-nodebug diff --git a/Makefile.release b/Makefile.release index 6ee755e..58a0117 100644 --- a/Makefile.release +++ b/Makefile.release @@ -27,6 +27,7 @@ config-release: @perl -pi -e 's/CONFIG_FAULT_INJECTION_DEBUG_FS=y/# CONFIG_FAULT_INJECTION_DEBUG_FS is not set/' config-nodebug @perl -pi -e 's/CONFIG_FAULT_INJECTION_STACKTRACE_FILTER=y/# CONFIG_FAULT_INJECTION_STACKTRACE_FILTER is not set/' config-nodebug @perl -pi -e 's/CONFIG_DEBUG_SG=y/# CONFIG_DEBUG_SG is not set/' config-nodebug + @perl -pi -e 's/CONFIG_DEBUG_PI_LIST=y/# CONFIG_DEBUG_PI_LIST is not set/' config-nodebug @perl -pi -e 's/CONFIG_DEBUG_WRITECOUNT=y/# CONFIG_DEBUG_WRITECOUNT is not set/' config-nodebug @perl -pi -e 's/CONFIG_DEBUG_OBJECTS=y/# CONFIG_DEBUG_OBJECTS is not set/' config-nodebug @perl -pi -e 's/CONFIG_DEBUG_OBJECTS_FREE=y/# CONFIG_DEBUG_OBJECTS_FREE is not set/' config-nodebug diff --git a/acer-wmi-Add-Aspire-5741-to-video_vendor_dmi_table.patch b/acer-wmi-Add-Aspire-5741-to-video_vendor_dmi_table.patch deleted file mode 100644 index 668fa09..0000000 --- a/acer-wmi-Add-Aspire-5741-to-video_vendor_dmi_table.patch +++ /dev/null @@ -1,40 +0,0 @@ -Bugzilla: 1012674 -Upstream-status: Queued for 3.16 - -From a94de796cd769fc5c4a9c57ebe99c0ae74b9c8a1 Mon Sep 17 00:00:00 2001 -From: Hans de Goede -Date: Mon, 2 Jun 2014 17:41:06 +0200 -Subject: [PATCH 09/14] acer-wmi: Add Aspire 5741 to video_vendor_dmi_table - -The Aspire 5741 has broken acpi-video backlight control, so add it to the -quirk table. - -https://bugzilla.redhat.com/show_bug.cgi?id=1012674 - -Signed-off-by: Hans de Goede ---- - drivers/platform/x86/acer-wmi.c | 8 ++++++++ - 1 file changed, 8 insertions(+) - -diff --git a/drivers/platform/x86/acer-wmi.c b/drivers/platform/x86/acer-wmi.c -index 3a746998f92a..bbf78b2d6d93 100644 ---- a/drivers/platform/x86/acer-wmi.c -+++ b/drivers/platform/x86/acer-wmi.c -@@ -570,6 +570,14 @@ static const struct dmi_system_id video_vendor_dmi_table[] = { - DMI_MATCH(DMI_PRODUCT_NAME, "Aspire 5750"), - }, - }, -+ { -+ .callback = video_set_backlight_video_vendor, -+ .ident = "Acer Aspire 5741", -+ .matches = { -+ DMI_MATCH(DMI_BOARD_VENDOR, "Acer"), -+ DMI_MATCH(DMI_PRODUCT_NAME, "Aspire 5741"), -+ }, -+ }, - {} - }; - --- -1.9.0 - diff --git a/acer-wmi-Switch-to-acpi_video_unregister_backlight.patch b/acer-wmi-Switch-to-acpi_video_unregister_backlight.patch deleted file mode 100644 index 310e8a2..0000000 --- a/acer-wmi-Switch-to-acpi_video_unregister_backlight.patch +++ /dev/null @@ -1,64 +0,0 @@ -Bugzilla: 1012674 -Upstream-status: Queued for 3.16 - -From d8aceabf18681a92e8031c43d3917f6826ac6691 Mon Sep 17 00:00:00 2001 -From: Hans de Goede -Date: Mon, 2 Jun 2014 17:41:05 +0200 -Subject: [PATCH 08/14] acer-wmi: Switch to acpi_video_unregister_backlight - -Switch from acpi_video_unregister(), to acpi_video_unregister_backlight(), -so that the hotkeys handler registered by acpi-video stays in place. - -Since there are no mappings for the atkbd raw codes for the brightness -keys used by newer Acer models in /lib/udev/hwdb.d/60-keyboard.hwdb, and -since we map the wmi events with a code of KE_IGNORE, we rely on acpi-video -to do the hotkey handling for us. - -For laptops such as the Acer Aspire 5750 which uses intel gfx this works -despite us calling acpi_video_unregister() because the following happens: - -1) acpi-video module gets loaded (as it is a dependency of acer-wmi and i915) -2) acpi-video does NOT call acpi_video_register() -3) acer-wmi loads (assume it loads before i915), calls -acpi_video_dmi_promote_vendor(); which sets ACPI_VIDEO_BACKLIGHT_DMI_VENDOR -4) calls acpi_video_unregister -> not registered, nop -5) i915 loads, calls acpi_video_register -6) acpi_video_register registers the acpi_notifier for the hotkeys, - does NOT register a backlight device because of ACPI_VIDEO_BACKLIGHT_DMI_VENDOR - -But on the Acer Aspire 5750G, which uses nvidia graphics the following happens: -1) acpi-video module gets loaded (as it is a dependency of acer-wmi) -2) acpi-video calls acpi_video_register() -3) acpi_video_register registers the acpi_notifier for the hotkeys, - and a backlight device -4) acer-wmi loads, calls acpi_video_dmi_promote_vendor() -5) calls acpi_video_unregister, this unregisters BOTH the acpi_notifier for - the hotkeys AND the backlight device - -And we end up without any handler for the brightness hotkeys. This patch fixes -this by switching over to acpi_video_unregister_backlight() which keeps the -hotkey handler in place. - -https://bugzilla.kernel.org/show_bug.cgi?id=35622 - -Signed-off-by: Hans de Goede ---- - drivers/platform/x86/acer-wmi.c | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - -diff --git a/drivers/platform/x86/acer-wmi.c b/drivers/platform/x86/acer-wmi.c -index c91f69b39db4..3a746998f92a 100644 ---- a/drivers/platform/x86/acer-wmi.c -+++ b/drivers/platform/x86/acer-wmi.c -@@ -2228,7 +2228,7 @@ static int __init acer_wmi_init(void) - pr_info("Brightness must be controlled by acpi video driver\n"); - } else { - pr_info("Disabling ACPI video driver\n"); -- acpi_video_unregister(); -+ acpi_video_unregister_backlight(); - } - - if (wmi_has_guid(WMID_GUID3)) { --- -1.9.0 - diff --git a/acpi-video-Add-an-acpi_video_unregister_backlight-fu.patch b/acpi-video-Add-an-acpi_video_unregister_backlight-fu.patch deleted file mode 100644 index c956ad0..0000000 --- a/acpi-video-Add-an-acpi_video_unregister_backlight-fu.patch +++ /dev/null @@ -1,112 +0,0 @@ -Bugzilla: 1012674 -Upstream-status: Queued for 3.16 - -From 4cf3eac89ed731d7cdb7d9d815a97109472af824 Mon Sep 17 00:00:00 2001 -From: Hans de Goede -Date: Mon, 2 Jun 2014 17:41:04 +0200 -Subject: [PATCH 07/14] acpi-video: Add an acpi_video_unregister_backlight - function - -Add an acpi_video_unregister_backlight function, which only unregisters -the backlight device, and leaves the acpi_notifier in place. Some acpi_vendor -driver need this as they don't want the acpi_video# backlight device, but do -need the acpi-video driver for hotkey handling. - -Chances are that this new acpi_video_unregister_backlight() is actually -what existing acpi_vendor drivers have wanted all along. Currently acpi_vendor -drivers which want to disable the acpi_video# backlight device, make 2 calls: - -acpi_video_dmi_promote_vendor(); -acpi_video_unregister(); - -The intention here is to make things independent of when acpi_video_register() -gets called. As acpi_video_register() will get called on acpi-video load time -on non intel gfx machines, while it gets called on i915 load time on intel -gfx machines. - -This leads to the following 2 interesting scenarios: - -a) intel gfx: -1) acpi-video module gets loaded (as it is a dependency of acpi_vendor and i915) -2) acpi-video does NOT call acpi_video_register() -3) acpi_vendor loads (lets assume it loads before i915), calls -acpi_video_dmi_promote_vendor(); which sets ACPI_VIDEO_BACKLIGHT_DMI_VENDOR -4) calls acpi_video_unregister -> not registered, nop -5) i915 loads, calls acpi_video_register -6) acpi_video_register registers the acpi_notifier for the hotkeys, - does NOT register a backlight device because of ACPI_VIDEO_BACKLIGHT_DMI_VENDOR - -b) non intel gfx -1) acpi-video module gets loaded (as it is a dependency acpi_vendor) -2) acpi-video calls acpi_video_register() -3) acpi_video_register registers the acpi_notifier for the hotkeys, - and a backlight device -4) acpi_vendor loads, calls acpi_video_dmi_promote_vendor() -5) calls acpi_video_unregister, this unregisters BOTH the acpi_notifier for - the hotkeys AND the backlight device - -So here we have possibly the same acpi_vendor module, making the same calls, -but with different results, in one cases acpi-video does handle hotkeys, -in the other it does not. - -Note that the a) scenario turns into b) if we assume the i915 module loads -before the vendor_acpi module, so we also have different behavior depending -on module loading order! - -So as said I believe that quite a few existing acpi_vendor modules really -always want the behavior of a), hence this patch adds a new -acpi_video_unregister_backlight() which gives the behavior of a) independent -of module loading order. - -Signed-off-by: Hans de Goede ---- - drivers/acpi/video.c | 14 ++++++++++++++ - include/acpi/video.h | 2 ++ - 2 files changed, 16 insertions(+) - -diff --git a/drivers/acpi/video.c b/drivers/acpi/video.c -index a68313720c9c..d4d6ea3ac77a 100644 ---- a/drivers/acpi/video.c -+++ b/drivers/acpi/video.c -@@ -2070,6 +2070,20 @@ void acpi_video_unregister(void) - } - EXPORT_SYMBOL(acpi_video_unregister); - -+void acpi_video_unregister_backlight(void) -+{ -+ struct acpi_video_bus *video; -+ -+ if (!register_count) -+ return; -+ -+ mutex_lock(&video_list_lock); -+ list_for_each_entry(video, &video_bus_head, entry) -+ acpi_video_bus_unregister_backlight(video); -+ mutex_unlock(&video_list_lock); -+} -+EXPORT_SYMBOL(acpi_video_unregister_backlight); -+ - /* - * This is kind of nasty. Hardware using Intel chipsets may require - * the video opregion code to be run first in order to initialise -diff --git a/include/acpi/video.h b/include/acpi/video.h -index 61109f2609fc..ea4c7bbded4d 100644 ---- a/include/acpi/video.h -+++ b/include/acpi/video.h -@@ -19,11 +19,13 @@ struct acpi_device; - #if (defined CONFIG_ACPI_VIDEO || defined CONFIG_ACPI_VIDEO_MODULE) - extern int acpi_video_register(void); - extern void acpi_video_unregister(void); -+extern void acpi_video_unregister_backlight(void); - extern int acpi_video_get_edid(struct acpi_device *device, int type, - int device_id, void **edid); - #else - static inline int acpi_video_register(void) { return 0; } - static inline void acpi_video_unregister(void) { return; } -+static inline void acpi_video_unregister_backlight(void) { return; } - static inline int acpi_video_get_edid(struct acpi_device *device, int type, - int device_id, void **edid) - { --- -1.9.0 - diff --git a/acpi-video-Don-t-register-acpi_video_resume-notifier.patch b/acpi-video-Don-t-register-acpi_video_resume-notifier.patch deleted file mode 100644 index ac40462..0000000 --- a/acpi-video-Don-t-register-acpi_video_resume-notifier.patch +++ /dev/null @@ -1,214 +0,0 @@ -Bugzilla: 1012674 -Upstream-status: Queued for 3.16 - -From 5d9b5801af7cbeaab060fa07576ca6cd7dc3be89 Mon Sep 17 00:00:00 2001 -From: Hans de Goede -Date: Mon, 2 Jun 2014 17:41:03 +0200 -Subject: [PATCH 06/14] acpi-video: Don't register acpi_video_resume notifier - without backlight devices - -If we're not going to be registering any backlight devices then -acpi_video_resume is always nop, so don't register it in that case. - -Signed-off-by: Hans de Goede - --- - -Note to reviewers the changes to acpi_video_dev_register_backlight() only -remove the "if (!acpi_video_verify_backlight_support()) {" which surrounded -the entire body of the function, as that is checked earlier now. ---- - drivers/acpi/video.c | 139 +++++++++++++++++++++++++++------------------------ - 1 file changed, 74 insertions(+), 65 deletions(-) - -diff --git a/drivers/acpi/video.c b/drivers/acpi/video.c -index f8bc5a755dda..a68313720c9c 100644 ---- a/drivers/acpi/video.c -+++ b/drivers/acpi/video.c -@@ -150,6 +150,7 @@ struct acpi_video_enumerated_device { - - struct acpi_video_bus { - struct acpi_device *device; -+ bool backlight_registered; - u8 dos_setting; - struct acpi_video_enumerated_device *attached_array; - u8 attached_count; -@@ -1658,88 +1659,89 @@ acpi_video_bus_match(acpi_handle handle, u32 level, void *context, - - static void acpi_video_dev_register_backlight(struct acpi_video_device *device) - { -- if (acpi_video_verify_backlight_support()) { -- struct backlight_properties props; -- struct pci_dev *pdev; -- acpi_handle acpi_parent; -- struct device *parent = NULL; -- int result; -- static int count; -- char *name; -- -- result = acpi_video_init_brightness(device); -- if (result) -- return; -- name = kasprintf(GFP_KERNEL, "acpi_video%d", count); -- if (!name) -- return; -- count++; -+ struct backlight_properties props; -+ struct pci_dev *pdev; -+ acpi_handle acpi_parent; -+ struct device *parent = NULL; -+ int result; -+ static int count; -+ char *name; - -- acpi_get_parent(device->dev->handle, &acpi_parent); -+ result = acpi_video_init_brightness(device); -+ if (result) -+ return; -+ name = kasprintf(GFP_KERNEL, "acpi_video%d", count); -+ if (!name) -+ return; -+ count++; - -- pdev = acpi_get_pci_dev(acpi_parent); -- if (pdev) { -- parent = &pdev->dev; -- pci_dev_put(pdev); -- } -+ acpi_get_parent(device->dev->handle, &acpi_parent); - -- memset(&props, 0, sizeof(struct backlight_properties)); -- props.type = BACKLIGHT_FIRMWARE; -- props.max_brightness = device->brightness->count - 3; -- device->backlight = backlight_device_register(name, -- parent, -- device, -- &acpi_backlight_ops, -- &props); -- kfree(name); -- if (IS_ERR(device->backlight)) -- return; -+ pdev = acpi_get_pci_dev(acpi_parent); -+ if (pdev) { -+ parent = &pdev->dev; -+ pci_dev_put(pdev); -+ } - -- /* -- * Save current brightness level in case we have to restore it -- * before acpi_video_device_lcd_set_level() is called next time. -- */ -- device->backlight->props.brightness = -- acpi_video_get_brightness(device->backlight); -+ memset(&props, 0, sizeof(struct backlight_properties)); -+ props.type = BACKLIGHT_FIRMWARE; -+ props.max_brightness = device->brightness->count - 3; -+ device->backlight = backlight_device_register(name, -+ parent, -+ device, -+ &acpi_backlight_ops, -+ &props); -+ kfree(name); -+ if (IS_ERR(device->backlight)) -+ return; - -- device->cooling_dev = thermal_cooling_device_register("LCD", -- device->dev, &video_cooling_ops); -- if (IS_ERR(device->cooling_dev)) { -- /* -- * Set cooling_dev to NULL so we don't crash trying to -- * free it. -- * Also, why the hell we are returning early and -- * not attempt to register video output if cooling -- * device registration failed? -- * -- dtor -- */ -- device->cooling_dev = NULL; -- return; -- } -+ /* -+ * Save current brightness level in case we have to restore it -+ * before acpi_video_device_lcd_set_level() is called next time. -+ */ -+ device->backlight->props.brightness = -+ acpi_video_get_brightness(device->backlight); - -- dev_info(&device->dev->dev, "registered as cooling_device%d\n", -- device->cooling_dev->id); -- result = sysfs_create_link(&device->dev->dev.kobj, -- &device->cooling_dev->device.kobj, -- "thermal_cooling"); -- if (result) -- printk(KERN_ERR PREFIX "Create sysfs link\n"); -- result = sysfs_create_link(&device->cooling_dev->device.kobj, -- &device->dev->dev.kobj, "device"); -- if (result) -- printk(KERN_ERR PREFIX "Create sysfs link\n"); -+ device->cooling_dev = thermal_cooling_device_register("LCD", -+ device->dev, &video_cooling_ops); -+ if (IS_ERR(device->cooling_dev)) { -+ /* -+ * Set cooling_dev to NULL so we don't crash trying to free it. -+ * Also, why the hell we are returning early and not attempt to -+ * register video output if cooling device registration failed? -+ * -- dtor -+ */ -+ device->cooling_dev = NULL; -+ return; - } -+ -+ dev_info(&device->dev->dev, "registered as cooling_device%d\n", -+ device->cooling_dev->id); -+ result = sysfs_create_link(&device->dev->dev.kobj, -+ &device->cooling_dev->device.kobj, -+ "thermal_cooling"); -+ if (result) -+ printk(KERN_ERR PREFIX "Create sysfs link\n"); -+ result = sysfs_create_link(&device->cooling_dev->device.kobj, -+ &device->dev->dev.kobj, "device"); -+ if (result) -+ printk(KERN_ERR PREFIX "Create sysfs link\n"); - } - - static int acpi_video_bus_register_backlight(struct acpi_video_bus *video) - { - struct acpi_video_device *dev; - -+ if (!acpi_video_verify_backlight_support()) -+ return 0; -+ - mutex_lock(&video->device_list_lock); - list_for_each_entry(dev, &video->video_device_list, entry) - acpi_video_dev_register_backlight(dev); - mutex_unlock(&video->device_list_lock); - -+ video->backlight_registered = true; -+ - video->pm_nb.notifier_call = acpi_video_resume; - video->pm_nb.priority = 0; - return register_pm_notifier(&video->pm_nb); -@@ -1767,13 +1769,20 @@ static void acpi_video_dev_unregister_backlight(struct acpi_video_device *device - static int acpi_video_bus_unregister_backlight(struct acpi_video_bus *video) - { - struct acpi_video_device *dev; -- int error = unregister_pm_notifier(&video->pm_nb); -+ int error; -+ -+ if (!video->backlight_registered) -+ return 0; -+ -+ error = unregister_pm_notifier(&video->pm_nb); - - mutex_lock(&video->device_list_lock); - list_for_each_entry(dev, &video->video_device_list, entry) - acpi_video_dev_unregister_backlight(dev); - mutex_unlock(&video->device_list_lock); - -+ video->backlight_registered = false; -+ - return error; - } - --- -1.9.0 - diff --git a/acpi-video-Unregister-the-backlight-device-if-a-raw-.patch b/acpi-video-Unregister-the-backlight-device-if-a-raw-.patch deleted file mode 100644 index f922d42..0000000 --- a/acpi-video-Unregister-the-backlight-device-if-a-raw-.patch +++ /dev/null @@ -1,130 +0,0 @@ -Bugzilla: 1093171 -Upstream-status: Queued for 3.16 - -From 7f5b3e9378c0adfdb1cf2ffde6c4f890e05517c7 Mon Sep 17 00:00:00 2001 -From: Hans de Goede -Date: Mon, 2 Jun 2014 17:41:09 +0200 -Subject: [PATCH 12/14] acpi-video: Unregister the backlight device if a raw - one shows up later - -When video.use_native_backlight=1 and non intel gfx are in use, the raw -backlight device of the gfx driver will show up after acpi-video has done its -acpi_video_verify_backlight_support() check. - -This causes video.use_native_backlight=1 to not have the desired result. - -This patch fixes this by adding a backlight notifier and when a raw -backlight is registered or unregistered re-doing the -acpi_video_verify_backlight_support() check. - -Signed-off-by: Hans de Goede ---- - drivers/acpi/video.c | 57 ++++++++++++++++++++++++++++++++++++++++++++++++++++ - 1 file changed, 57 insertions(+) - -diff --git a/drivers/acpi/video.c b/drivers/acpi/video.c -index d4d6ea3ac77a..ab7cd65ce21e 100644 ---- a/drivers/acpi/video.c -+++ b/drivers/acpi/video.c -@@ -151,6 +151,7 @@ struct acpi_video_enumerated_device { - struct acpi_video_bus { - struct acpi_device *device; - bool backlight_registered; -+ bool backlight_notifier_registered; - u8 dos_setting; - struct acpi_video_enumerated_device *attached_array; - u8 attached_count; -@@ -162,6 +163,7 @@ struct acpi_video_bus { - struct input_dev *input; - char phys[32]; /* for input device */ - struct notifier_block pm_nb; -+ struct notifier_block backlight_nb; - }; - - struct acpi_video_device_flags { -@@ -1732,6 +1734,9 @@ static int acpi_video_bus_register_backlight(struct acpi_video_bus *video) - { - struct acpi_video_device *dev; - -+ if (video->backlight_registered) -+ return 0; -+ - if (!acpi_video_verify_backlight_support()) - return 0; - -@@ -1876,6 +1881,56 @@ static void acpi_video_bus_remove_notify_handler(struct acpi_video_bus *video) - video->input = NULL; - } - -+static int acpi_video_backlight_notify(struct notifier_block *nb, -+ unsigned long val, void *bd) -+{ -+ struct backlight_device *backlight = bd; -+ struct acpi_video_bus *video; -+ -+ /* acpi_video_verify_backlight_support only cares about raw devices */ -+ if (backlight->props.type != BACKLIGHT_RAW) -+ return NOTIFY_DONE; -+ -+ video = container_of(nb, struct acpi_video_bus, backlight_nb); -+ -+ switch (val) { -+ case BACKLIGHT_REGISTERED: -+ if (!acpi_video_verify_backlight_support()) -+ acpi_video_bus_unregister_backlight(video); -+ break; -+ case BACKLIGHT_UNREGISTERED: -+ acpi_video_bus_register_backlight(video); -+ break; -+ } -+ -+ return NOTIFY_OK; -+} -+ -+static int acpi_video_bus_add_backlight_notify_handler( -+ struct acpi_video_bus *video) -+{ -+ int error; -+ -+ video->backlight_nb.notifier_call = acpi_video_backlight_notify; -+ video->backlight_nb.priority = 0; -+ error = backlight_register_notifier(&video->backlight_nb); -+ if (error == 0) -+ video->backlight_notifier_registered = true; -+ -+ return error; -+} -+ -+static int acpi_video_bus_remove_backlight_notify_handler( -+ struct acpi_video_bus *video) -+{ -+ if (!video->backlight_notifier_registered) -+ return 0; -+ -+ video->backlight_notifier_registered = false; -+ -+ return backlight_unregister_notifier(&video->backlight_nb); -+} -+ - static int acpi_video_bus_put_devices(struct acpi_video_bus *video) - { - struct acpi_video_device *dev, *next; -@@ -1957,6 +2012,7 @@ static int acpi_video_bus_add(struct acpi_device *device) - - acpi_video_bus_register_backlight(video); - acpi_video_bus_add_notify_handler(video); -+ acpi_video_bus_add_backlight_notify_handler(video); - - return 0; - -@@ -1980,6 +2036,7 @@ static int acpi_video_bus_remove(struct acpi_device *device) - - video = acpi_driver_data(device); - -+ acpi_video_bus_remove_backlight_notify_handler(video); - acpi_video_bus_remove_notify_handler(video); - acpi_video_bus_unregister_backlight(video); - acpi_video_bus_put_devices(video); --- -1.9.0 - diff --git a/backlight-Add-backlight-device-un-registration-notif.patch b/backlight-Add-backlight-device-un-registration-notif.patch deleted file mode 100644 index a411bb9..0000000 --- a/backlight-Add-backlight-device-un-registration-notif.patch +++ /dev/null @@ -1,132 +0,0 @@ -Bugzilla: 1093171 -Upstream-status: Queued for 3.16 - -From ee515e61a002b4d571407173ac8bbadadc114cf0 Mon Sep 17 00:00:00 2001 -From: Hans de Goede -Date: Mon, 2 Jun 2014 17:41:08 +0200 -Subject: [PATCH 11/14] backlight: Add backlight device (un)registration - notification - -Some firmware drivers, ie acpi-video want to get themselves out of the -way (in some cases) when their also is a raw backlight device available. - -Due to module loading ordering being unknown, acpi-video cannot be certain -that the backlight_device_registered(BACKLIGHT_RAW) it does for this is -the final verdict wrt there being a BACKLIGHT_RAW device. - -By adding notification acpi-video can listen for backlight devices showing -up after it has loaded, and unregister its backlight device if desired. - -Signed-off-by: Hans de Goede ---- - drivers/video/backlight/backlight.c | 40 +++++++++++++++++++++++++++++++++++++ - include/linux/backlight.h | 7 +++++++ - 2 files changed, 47 insertions(+) - -diff --git a/drivers/video/backlight/backlight.c b/drivers/video/backlight/backlight.c -index bd2172c2d650..428089009cd5 100644 ---- a/drivers/video/backlight/backlight.c -+++ b/drivers/video/backlight/backlight.c -@@ -23,6 +23,7 @@ - - static struct list_head backlight_dev_list; - static struct mutex backlight_dev_list_mutex; -+static struct blocking_notifier_head backlight_notifier; - - static const char *const backlight_types[] = { - [BACKLIGHT_RAW] = "raw", -@@ -370,6 +371,9 @@ struct backlight_device *backlight_device_register(const char *name, - list_add(&new_bd->entry, &backlight_dev_list); - mutex_unlock(&backlight_dev_list_mutex); - -+ blocking_notifier_call_chain(&backlight_notifier, -+ BACKLIGHT_REGISTERED, new_bd); -+ - return new_bd; - } - EXPORT_SYMBOL(backlight_device_register); -@@ -413,6 +417,10 @@ void backlight_device_unregister(struct backlight_device *bd) - pmac_backlight = NULL; - mutex_unlock(&pmac_backlight_mutex); - #endif -+ -+ blocking_notifier_call_chain(&backlight_notifier, -+ BACKLIGHT_UNREGISTERED, bd); -+ - mutex_lock(&bd->ops_lock); - bd->ops = NULL; - mutex_unlock(&bd->ops_lock); -@@ -438,6 +446,36 @@ static int devm_backlight_device_match(struct device *dev, void *res, - } - - /** -+ * backlight_register_notifier - get notified of backlight (un)registration -+ * @nb: notifier block with the notifier to call on backlight (un)registration -+ * -+ * @return 0 on success, otherwise a negative error code -+ * -+ * Register a notifier to get notified when backlight devices get registered -+ * or unregistered. -+ */ -+int backlight_register_notifier(struct notifier_block *nb) -+{ -+ return blocking_notifier_chain_register(&backlight_notifier, nb); -+} -+EXPORT_SYMBOL(backlight_register_notifier); -+ -+/** -+ * backlight_unregister_notifier - unregister a backlight notifier -+ * @nb: notifier block to unregister -+ * -+ * @return 0 on success, otherwise a negative error code -+ * -+ * Register a notifier to get notified when backlight devices get registered -+ * or unregistered. -+ */ -+int backlight_unregister_notifier(struct notifier_block *nb) -+{ -+ return blocking_notifier_chain_unregister(&backlight_notifier, nb); -+} -+EXPORT_SYMBOL(backlight_unregister_notifier); -+ -+/** - * devm_backlight_device_register - resource managed backlight_device_register() - * @dev: the device to register - * @name: the name of the device -@@ -544,6 +582,8 @@ static int __init backlight_class_init(void) - backlight_class->pm = &backlight_class_dev_pm_ops; - INIT_LIST_HEAD(&backlight_dev_list); - mutex_init(&backlight_dev_list_mutex); -+ BLOCKING_INIT_NOTIFIER_HEAD(&backlight_notifier); -+ - return 0; - } - -diff --git a/include/linux/backlight.h b/include/linux/backlight.h -index 72647429adf6..adb14a8616df 100644 ---- a/include/linux/backlight.h -+++ b/include/linux/backlight.h -@@ -40,6 +40,11 @@ enum backlight_type { - BACKLIGHT_TYPE_MAX, - }; - -+enum backlight_notification { -+ BACKLIGHT_REGISTERED, -+ BACKLIGHT_UNREGISTERED, -+}; -+ - struct backlight_device; - struct fb_info; - -@@ -133,6 +138,8 @@ extern void devm_backlight_device_unregister(struct device *dev, - extern void backlight_force_update(struct backlight_device *bd, - enum backlight_update_reason reason); - extern bool backlight_device_registered(enum backlight_type type); -+extern int backlight_register_notifier(struct notifier_block *nb); -+extern int backlight_unregister_notifier(struct notifier_block *nb); - - #define to_backlight_device(obj) container_of(obj, struct backlight_device, dev) - --- -1.9.0 - diff --git a/config-arm-generic b/config-arm-generic index c1bc653..c1280e8 100644 --- a/config-arm-generic +++ b/config-arm-generic @@ -56,11 +56,16 @@ CONFIG_FB_ARMCLCD=y # ARM VExpress CONFIG_ARCH_VEXPRESS=y CONFIG_VEXPRESS_CONFIG=y +CONFIG_MFD_VEXPRESS_SYSREG=y +CONFIG_VEXPRESS_SYSCFG=y CONFIG_COMMON_CLK_VERSATILE=y +CONFIG_CLK_SP810=y +CONFIG_CLK_VEXPRESS_OSC=y CONFIG_I2C_VERSATILE=m CONFIG_POWER_RESET_VEXPRESS=y CONFIG_REGULATOR_VEXPRESS=m CONFIG_SENSORS_VEXPRESS=m +CONFIG_CLKSRC_VERSATILE=y # Device tree CONFIG_DTC=y @@ -181,6 +186,7 @@ CONFIG_CMA_AREAS=7 # CONFIG_ARM_PTDUMP is not set # CONFIG_PATA_PLATFORM is not set +# CONFIG_USB_ULPI is not set ### turn off things which make no sense on embedded SoC @@ -234,6 +240,7 @@ CONFIG_CMA_AREAS=7 # serial # CONFIG_SERIAL_SH_SCI is not set +# CONFIG_SERIAL_EARLYCON_ARM_SEMIHOST is not set # drm # CONFIG_DRM_VMWGFX is not set diff --git a/config-arm64 b/config-arm64 index ddd5bc4..496a215 100644 --- a/config-arm64 +++ b/config-arm64 @@ -87,3 +87,21 @@ CONFIG_COMMON_CLK_XGENE=y CONFIG_AHCI_XGENE=m CONFIG_PHY_XGENE=m +CONFIG_RTC_DRV_XGENE=m + +CONFIG_EFI=y +CONFIG_EFI_VARS=y +CONFIG_EFIVAR_FS=y +CONFIG_EFI_VARS_PSTORE=y +CONFIG_EFI_VARS_PSTORE_DEFAULT_DISABLE=y + +CONFIG_ARM64_CRYPTO=y +CONFIG_CRYPTO_SHA1_ARM64_CE=m +CONFIG_CRYPTO_SHA2_ARM64_CE=m +CONFIG_CRYPTO_GHASH_ARM64_CE=m +CONFIG_CRYPTO_AES_ARM64_CE=m +CONFIG_CRYPTO_AES_ARM64_CE_CCM=m +CONFIG_CRYPTO_AES_ARM64_CE_BLK=m +CONFIG_CRYPTO_AES_ARM64_NEON_BLK=m + +# CONFIG_ARM_BIG_LITTLE_CPUFREQ is not set diff --git a/config-armv7 b/config-armv7 index 4aaa913..095c1bc 100644 --- a/config-armv7 +++ b/config-armv7 @@ -38,6 +38,7 @@ CONFIG_MV643XX_ETH=m CONFIG_PINCTRL_MVEBU=y CONFIG_PINCTRL_ARMADA_370=y CONFIG_PINCTRL_ARMADA_XP=y +# CONFIG_ARM_ARMADA_370_XP_CPUIDLE is not set CONFIG_PINCTRL_DOVE=y CONFIG_EDAC_MV64X60=m CONFIG_RTC_DRV_S35390A=m @@ -53,6 +54,7 @@ CONFIG_MMC_SDHCI_DOVE=m CONFIG_SPI_ORION=m CONFIG_USB_MV_UDC=m CONFIG_MVEBU_MBUS=y +CONFIG_USB_XHCI_MVEBU=m CONFIG_PHY_MVEBU_SATA=y CONFIG_ARMADA_THERMAL=m CONFIG_DOVE_THERMAL=m @@ -165,6 +167,7 @@ CONFIG_PINCTRL_PALMAS=y CONFIG_REGULATOR_PALMAS=y CONFIG_REGULATOR_PBIAS=m CONFIG_RTC_DRV_PALMAS=m +CONFIG_OMAP5_DSS_HDMI=y CONFIG_WL_TI=y CONFIG_WLCORE_SDIO=m @@ -351,6 +354,7 @@ CONFIG_SOC_IMX50=y CONFIG_SOC_IMX53=y CONFIG_SOC_IMX6Q=y CONFIG_SOC_IMX6SL=y +# CONFIG_SOC_IMX6SX is not set # CONFIG_SOC_VF610 is not set CONFIG_MACH_IMX51_DT=y # CONFIG_MACH_MX51_BABBAGE is not set @@ -564,6 +568,7 @@ CONFIG_SND_SOC_TEGRA20_DAS=m CONFIG_SND_SOC_TEGRA20_SPDIF=m CONFIG_SND_SOC_TEGRA30_AHUB=m CONFIG_SND_SOC_TEGRA30_I2S=m +CONFIG_SND_HDA_TEGRA=m # AC100 (PAZ00) CONFIG_MFD_NVEC=y diff --git a/config-armv7-generic b/config-armv7-generic index 1b6bea7..4114802 100644 --- a/config-armv7-generic +++ b/config-armv7-generic @@ -67,6 +67,7 @@ CONFIG_ARCH_VEXPRESS_CORTEX_A5_A9_ERRATA=y # CONFIG_ARCH_HI3xxx is not set # CONFIG_ARCH_MSM_DT is not set # CONFIG_ARCH_QCOM is not set +# CONFIG_ARCH_EXYNOS is not set # errata # v5/v6 @@ -127,6 +128,9 @@ CONFIG_IP_PNP=y CONFIG_IP_PNP_DHCP=y CONFIG_IP_PNP_BOOTP=y +# CONFIG_PCI_HOST_GENERIC is not set +# CONFIG_BRCMSTB_GISB_ARB is not set + # Root as NFS, different from mainline CONFIG_ROOT_NFS=y @@ -162,6 +166,10 @@ CONFIG_ARM_HIGHBANK_CPUFREQ=m # CONFIG_ARM_HIGHBANK_CPUIDLE is not set # Allwinner +CONFIG_MACH_SUN4I=y +CONFIG_MACH_SUN5I=y +CONFIG_MACH_SUN6I=y +CONFIG_MACH_SUN7I=y CONFIG_PINCTRL_SUNXI=y CONFIG_SUNXI_WATCHDOG=m CONFIG_MDIO_SUN4I=m @@ -178,6 +186,7 @@ CONFIG_SPI_SUN4I=m CONFIG_SPI_SUN6I=m CONFIG_MMC_SUNXI=m CONFIG_GPIO_PCA953X=m +CONFIG_POWER_RESET_SUN6I=y CONFIG_REGMAP=y CONFIG_REGMAP_I2C=m @@ -271,6 +280,7 @@ CONFIG_MFD_TPS65912_SPI=y # CONFIG_MFD_WM831X_SPI is not set # CONFIG_MFD_MC13XXX_SPI is not set # CONFIG_MFD_PM8921_CORE is not set +# CONFIG_MFD_AXP20X is not set # Pin stuff CONFIG_PINMUX=y @@ -283,6 +293,8 @@ CONFIG_GENERIC_PINCONF=y # CONFIG_PINCTRL_CAPRI is not set # CONFIG_PINCTRL_MSM8X74 is not set # CONFIG_PINCTRL_BCM281XX is not set +# CONFIG_PINCTRL_APQ8064 is not set +# CONFIG_PINCTRL_IPQ8064 is not set # GPIO # CONFIG_GPIO_EM is not set @@ -325,6 +337,7 @@ CONFIG_SPI_TLE62X0=m CONFIG_SPI_XCOMM=m CONFIG_SPI_XILINX=m # CONFIG_SPI_FSL_SPI is not set +# CONFIG_SPI_CADENCE is not set CONFIG_NFC_NCI_SPI=y @@ -332,6 +345,7 @@ CONFIG_NFC_NCI_SPI=y CONFIG_I2C_DESIGNWARE_CORE=m CONFIG_I2C_DESIGNWARE_PLATFORM=m CONFIG_I2C_MV64XXX=m +# CONFIG_I2C_CROS_EC_TUNNEL is not set # HW crypto and rng CONFIG_CRYPTO_SHA1_ARM=m @@ -397,7 +411,11 @@ CONFIG_SPI_DW_PCI=m # CONFIG_MMC_DW_EXYNOS is not set # CONFIG_MMC_DW_IDMAC is not set # CONFIG_MMC_DW_K3 is not set -CONFIG_USB_DWC2=m +CONFIG_USB_DWC2=y +CONFIG_USB_DWC2_HOST=m +CONFIG_USB_DWC2_PLATFORM=y +CONFIG_USB_DWC2_PCI=y +# CONFIG_USB_DWC2_PERIPHERAL is not set # CONFIG_USB_DWC2_DEBUG is not set # CONFIG_USB_DWC2_TRACK_MISSED_SOFS is not set CONFIG_USB_DWC3=m @@ -460,6 +478,14 @@ CONFIG_SND_SOC_GENERIC_DMAENGINE_PCM=y # CONFIG_SND_SOC_WM8903 is not set # CONFIG_SND_SOC_WM8962 is not set # CONFIG_SND_SOC_TPA6130A2 is not set +# CONFIG_SND_SOC_FSL_SAI is not set +# CONFIG_SND_SOC_FSL_SSI is not set +# CONFIG_SND_SOC_FSL_SPDIF is not set +# CONFIG_SND_SOC_FSL_ESAI is not set +# CONFIG_SND_SOC_IMX_AUDMUX is not set +# CONFIG_SND_SOC_ALC5623 is not set +# CONFIG_SND_SOC_CS42L56 is not set +# CONFIG_SND_SOC_STA350 is not set # CONFIG_SND_ATMEL_SOC is not set # Displays @@ -479,6 +505,9 @@ CONFIG_RTC_DRV_RX4581=m CONFIG_RTC_DRV_TPS65910=m CONFIG_RTC_DRV_TPS80031=m # CONFIG_RTC_DRV_DS1347 is not set +# CONFIG_RTC_DRV_DS1343 is not set +# CONFIG_RTC_DRV_MCP795 is not set +# CONFIG_RTC_DRV_XGENE is not set # Regulators CONFIG_REGULATOR=y @@ -514,6 +543,8 @@ CONFIG_REGULATOR_TPS6586X=m CONFIG_REGULATOR_TPS65910=m CONFIG_REGULATOR_TPS65912=m CONFIG_REGULATOR_TPS80031=m +CONFIG_REGULATOR_LTC3589=m +CONFIG_REGULATOR_ANATOP=m CONFIG_CHARGER_MANAGER=y CONFIG_CHARGER_BQ2415X=m @@ -621,6 +652,7 @@ CONFIG_BPF_JIT=y # CONFIG_DRM_TILCDC is not set # CONFIG_DRM_IMX is not set # CONFIG_AHCI_IMX is not set +# CONFIG_IMX_THERMAL is not set # CONFIG_CS89x0 is not set # CONFIG_DM9000 is not set # CONFIG_HW_RANDOM_ATMEL is not set diff --git a/config-armv7-lpae b/config-armv7-lpae index bc9324f..4f39ef5 100644 --- a/config-armv7-lpae +++ b/config-armv7-lpae @@ -15,6 +15,7 @@ CONFIG_ARCH_VIRT=y # CONFIG_ARCH_SOCFPGA is not set # CONFIG_ARCH_TEGRA is not set # CONFIG_ARCH_ZYNQ is not set +# CONFIG_ARCH_AXXIA is not set CONFIG_ARM_LPAE=y CONFIG_SYS_SUPPORTS_HUGETLBFS=y @@ -114,6 +115,7 @@ CONFIG_USB_DWC3_KEYSTONE=m CONFIG_GPIO_DAVINCI=y CONFIG_I2C_DAVINCI=m CONFIG_TI_AEMIF=m +CONFIG_POWER_RESET_KEYSTONE=y # CONFIG_DAVINCI_WATCHDOG is not set # CONFIG_SPI_DAVINCI is not set # CONFIG_SND_DAVINCI_SOC is not set diff --git a/config-debug b/config-debug index 6ad71f3..302280b 100644 --- a/config-debug +++ b/config-debug @@ -35,6 +35,7 @@ CONFIG_ACPI_DEBUG=y # CONFIG_ACPI_DEBUG_FUNC_TRACE is not set CONFIG_DEBUG_SG=y +CONFIG_DEBUG_PI_LIST=y # CONFIG_DEBUG_PAGEALLOC is not set diff --git a/config-generic b/config-generic index b7ece12..ca906a6 100644 --- a/config-generic +++ b/config-generic @@ -15,7 +15,7 @@ CONFIG_DEFAULT_HOSTNAME="(none)" # CONFIG_EXPERIMENTAL=y CONFIG_HOTPLUG=y -CONFIG_UEVENT_HELPER_PATH="" +# CONFIG_UEVENT_HELPER is not set CONFIG_DEVTMPFS=y CONFIG_DEVTMPFS_MOUNT=y CONFIG_STANDALONE=y @@ -1687,13 +1687,13 @@ CONFIG_B43_SDIO=y CONFIG_B43_BCMA=y # CONFIG_B43_BCMA_EXTRA is not set CONFIG_B43_BCMA_PIO=y -# CONFIG_B43_DEBUG is not set +CONFIG_B43_DEBUG=y CONFIG_B43_PHY_LP=y CONFIG_B43_PHY_N=y CONFIG_B43_PHY_HT=y # CONFIG_B43_FORCE_PIO is not set CONFIG_B43LEGACY=m -# CONFIG_B43LEGACY_DEBUG is not set +CONFIG_B43LEGACY_DEBUG=y CONFIG_B43LEGACY_DMA=y CONFIG_B43LEGACY_PIO=y CONFIG_B43LEGACY_DMA_AND_PIO_MODE=y @@ -2332,6 +2332,7 @@ CONFIG_CYCLADES=m # CONFIG_RIO is not set CONFIG_SERIAL_JSM=m # CONFIG_SERIAL_SCCNXP is not set +# CONFIG_SERIAL_SC16IS7XX is not set # CONFIG_SERIAL_MFD_HSU is not set # CONFIG_SERIAL_ALTERA_JTAGUART is not set @@ -2500,6 +2501,7 @@ CONFIG_SENSORS_MAX6650=m CONFIG_SENSORS_MAX6697=m CONFIG_SENSORS_MCP3021=m CONFIG_SENSORS_NCT6775=m +CONFIG_SENSORS_NCT6683=m CONFIG_SENSORS_NTC_THERMISTOR=m CONFIG_SENSORS_PC87360=m CONFIG_SENSORS_PC87427=m @@ -2619,15 +2621,18 @@ CONFIG_IIO_ST_GYRO_3AXIS=m CONFIG_IIO_ST_MAGN_3AXIS=m CONFIG_IIO_ST_ACCEL_3AXIS=m CONFIG_HID_SENSOR_INCLINOMETER_3D=m +CONFIG_HID_SENSOR_DEVICE_ROTATION=m # CONFIG_ADJD_S311 is not set # CONFIG_SENSORS_TSL2563 is not set # CONFIG_VCNL4000 is not set # CONFIG_AK8975 is not set # CONFIG_MAG3110 is not set # CONFIG_TMP006 is not set +# CONFIG_MLX90614 is not set # CONFIG_HID_SENSOR_PRESS is not set # CONFIG_IIO_ST_PRESS is not set # CONFIG_KXSD9 is not set +# CONFIG_MMA8452 is not set # CONFIG_AD7266 is not set # CONFIG_AD7298 is not set # CONFIG_AD7476 is not set @@ -2659,7 +2664,9 @@ CONFIG_HID_SENSOR_INCLINOMETER_3D=m # CONFIG_ADIS16480 is not set # CONFIG_DHT11 is not set # CONFIG_MPL3115 is not set +# CONFIG_MPL115 is not set # CONFIG_SI7005 is not set +# CONFIG_AS3935 is not set # staging IIO drivers # CONFIG_AD7291 is not set @@ -2857,6 +2864,7 @@ CONFIG_RTC_DRV_ISL12022=m # CONFIG_RTC_DRV_HID_SENSOR_TIME is not set # CONFIG_RTC_DRV_MOXART is not set # CONFIG_RTC_DRV_ISL12057 is not set +# CONFIG_RTC_DRV_XGENE is not set CONFIG_R3964=m # CONFIG_APPLICOM is not set @@ -3449,6 +3457,7 @@ CONFIG_SND_USB_US122L=m CONFIG_SND_USB_UA101=m CONFIG_SND_USB_6FIRE=m CONFIG_SND_USB_HIFACE=m +# CONFIG_SND_BCD2000 is not set # # PCMCIA devices @@ -3460,6 +3469,8 @@ CONFIG_SND_FIREWIRE_SPEAKERS=m CONFIG_SND_ISIGHT=m CONFIG_SND_SCS1X=m CONFIG_SND_DICE=m +# CONFIG_SND_FIREWORKS is not set +# CONFIG_SND_BEBOB is not set # # Open Sound System @@ -3514,6 +3525,7 @@ CONFIG_USB_SL811_HCD_ISO=y # CONFIG_USB_R8A66597_HCD is not set CONFIG_USB_XHCI_HCD=y # CONFIG_USB_XHCI_HCD_DEBUGGING is not set +# CONFIG_USB_MAX3421_HCD is not set # # USB Device Class drivers @@ -3660,6 +3672,7 @@ CONFIG_USB_GSPCA_MR97310A=m CONFIG_USB_GSPCA_BENQ=m CONFIG_USB_GSPCA_CONEX=m CONFIG_USB_GSPCA_CPIA1=m +CONFIG_USB_GSPCA_DTCS033=m CONFIG_USB_GSPCA_ETOMS=m CONFIG_USB_GSPCA_FINEPIX=m CONFIG_USB_GSPCA_MARS=m @@ -4351,6 +4364,7 @@ CONFIG_DEBUG_NX_TEST=m CONFIG_DEBUG_SET_MODULE_RONX=y CONFIG_DEBUG_BOOT_PARAMS=y CONFIG_DEBUG_VM=y +# CONFIG_DEBUG_VM_VMACACHE is not set # CONFIG_DEBUG_VM_RB is not set # revisit this if performance isn't horrible # CONFIG_DEBUG_STRICT_USER_COPY_CHECKS is not set CONFIG_LOCKUP_DETECTOR=y @@ -4612,7 +4626,7 @@ CONFIG_PM_DEBUG=y # CONFIG_DPM_WATCHDOG is not set # revisit this in debug CONFIG_PM_TRACE=y CONFIG_PM_TRACE_RTC=y -# CONFIG_PM_TEST_SUSPEND is not set +CONFIG_PM_TEST_SUSPEND=y CONFIG_PM_RUNTIME=y # CONFIG_PM_OPP is not set # CONFIG_PM_AUTOSLEEP is not set @@ -4962,6 +4976,7 @@ CONFIG_RTL8192E=m # CONFIG_VIDEO_CX25821 is not set # CONFIG_R8187SE is not set # CONFIG_R8188EU is not set +# CONFIG_R8192EE is not set # CONFIG_R8821AE is not set # CONFIG_RTL8192U is not set CONFIG_R8723AU=m # Jes Sorensen maintains this (rhbz 1100162) @@ -5109,6 +5124,7 @@ CONFIG_GPIO_SYSFS=y # CONFIG_GPIO_ADP5588 is not set # CONFIG_GPIO_IT8761E is not set # CONFIG SB105x is not set +# CONFIG_GPIO_SYSCON is not set # CONFIG_GPIO_TS5500 is not set CONFIG_GPIO_VIPERBOARD=m # CONFIG_GPIO_MAX7300 is not set diff --git a/config-nodebug b/config-nodebug index c6b4b79..360f418 100644 --- a/config-nodebug +++ b/config-nodebug @@ -2,100 +2,101 @@ CONFIG_SND_VERBOSE_PRINTK=y CONFIG_SND_DEBUG=y CONFIG_SND_PCM_XRUN_DEBUG=y -# CONFIG_DEBUG_ATOMIC_SLEEP is not set - -# CONFIG_DEBUG_MUTEXES is not set -# CONFIG_DEBUG_WW_MUTEX_SLOWPATH is not set -# CONFIG_DEBUG_RT_MUTEXES is not set -# CONFIG_DEBUG_LOCK_ALLOC is not set -# CONFIG_LOCK_TORTURE_TEST is not set -# CONFIG_PROVE_LOCKING is not set -# CONFIG_DEBUG_SPINLOCK is not set -# CONFIG_PROVE_RCU is not set +CONFIG_DEBUG_ATOMIC_SLEEP=y + +CONFIG_DEBUG_MUTEXES=y +CONFIG_DEBUG_WW_MUTEX_SLOWPATH=y +CONFIG_DEBUG_RT_MUTEXES=y +CONFIG_DEBUG_LOCK_ALLOC=y +CONFIG_LOCK_TORTURE_TEST=m +CONFIG_PROVE_LOCKING=y +CONFIG_DEBUG_SPINLOCK=y +CONFIG_PROVE_RCU=y # CONFIG_PROVE_RCU_REPEATEDLY is not set -# CONFIG_DEBUG_PER_CPU_MAPS is not set +CONFIG_DEBUG_PER_CPU_MAPS=y CONFIG_CPUMASK_OFFSTACK=y -# CONFIG_CPU_NOTIFIER_ERROR_INJECT is not set +CONFIG_CPU_NOTIFIER_ERROR_INJECT=m -# CONFIG_FAULT_INJECTION is not set -# CONFIG_FAILSLAB is not set -# CONFIG_FAIL_PAGE_ALLOC is not set -# CONFIG_FAIL_MAKE_REQUEST is not set -# CONFIG_FAULT_INJECTION_DEBUG_FS is not set -# CONFIG_FAULT_INJECTION_STACKTRACE_FILTER is not set -# CONFIG_FAIL_IO_TIMEOUT is not set -# CONFIG_FAIL_MMC_REQUEST is not set +CONFIG_FAULT_INJECTION=y +CONFIG_FAILSLAB=y +CONFIG_FAIL_PAGE_ALLOC=y +CONFIG_FAIL_MAKE_REQUEST=y +CONFIG_FAULT_INJECTION_DEBUG_FS=y +CONFIG_FAULT_INJECTION_STACKTRACE_FILTER=y +CONFIG_FAIL_IO_TIMEOUT=y +CONFIG_FAIL_MMC_REQUEST=y -# CONFIG_LOCK_STAT is not set +CONFIG_LOCK_STAT=y -# CONFIG_DEBUG_STACK_USAGE is not set +CONFIG_DEBUG_STACK_USAGE=y -# CONFIG_ACPI_DEBUG is not set +CONFIG_ACPI_DEBUG=y # CONFIG_ACPI_DEBUG_FUNC_TRACE is not set -# CONFIG_DEBUG_SG is not set +CONFIG_DEBUG_SG=y +CONFIG_DEBUG_PI_LIST=y # CONFIG_DEBUG_PAGEALLOC is not set -# CONFIG_DEBUG_WRITECOUNT is not set -# CONFIG_DEBUG_OBJECTS is not set +CONFIG_DEBUG_WRITECOUNT=y +CONFIG_DEBUG_OBJECTS=y # CONFIG_DEBUG_OBJECTS_SELFTEST is not set -# CONFIG_DEBUG_OBJECTS_FREE is not set -# CONFIG_DEBUG_OBJECTS_TIMERS is not set -# CONFIG_DEBUG_OBJECTS_RCU_HEAD is not set +CONFIG_DEBUG_OBJECTS_FREE=y +CONFIG_DEBUG_OBJECTS_TIMERS=y +CONFIG_DEBUG_OBJECTS_RCU_HEAD=y CONFIG_DEBUG_OBJECTS_ENABLE_DEFAULT=1 -# CONFIG_X86_PTDUMP is not set -# CONFIG_EFI_PGT_DUMP is not set +CONFIG_X86_PTDUMP=y +CONFIG_EFI_PGT_DUMP=y -# CONFIG_CAN_DEBUG_DEVICES is not set +CONFIG_CAN_DEBUG_DEVICES=y -# CONFIG_MODULE_FORCE_UNLOAD is not set +CONFIG_MODULE_FORCE_UNLOAD=y -# CONFIG_SYSCTL_SYSCALL_CHECK is not set +CONFIG_SYSCTL_SYSCALL_CHECK=y -# CONFIG_DEBUG_NOTIFIERS is not set +CONFIG_DEBUG_NOTIFIERS=y -# CONFIG_DMA_API_DEBUG is not set +CONFIG_DMA_API_DEBUG=y -# CONFIG_MMIOTRACE is not set +CONFIG_MMIOTRACE=y -# CONFIG_DEBUG_CREDENTIALS is not set +CONFIG_DEBUG_CREDENTIALS=y # off in both production debug and nodebug builds, # on in rawhide nodebug builds -# CONFIG_DEBUG_FORCE_WEAK_PER_CPU is not set +CONFIG_DEBUG_FORCE_WEAK_PER_CPU=y -# CONFIG_EXT4_DEBUG is not set +CONFIG_EXT4_DEBUG=y # CONFIG_XFS_WARN is not set -# CONFIG_DEBUG_PERF_USE_VMALLOC is not set +CONFIG_DEBUG_PERF_USE_VMALLOC=y -# CONFIG_JBD2_DEBUG is not set +CONFIG_JBD2_DEBUG=y -# CONFIG_NFSD_FAULT_INJECTION is not set +CONFIG_NFSD_FAULT_INJECTION=y -# CONFIG_DEBUG_BLK_CGROUP is not set +CONFIG_DEBUG_BLK_CGROUP=y -# CONFIG_DRBD_FAULT_INJECTION is not set +CONFIG_DRBD_FAULT_INJECTION=y -# CONFIG_ATH_DEBUG is not set -# CONFIG_CARL9170_DEBUGFS is not set -# CONFIG_IWLWIFI_DEVICE_TRACING is not set +CONFIG_ATH_DEBUG=y +CONFIG_CARL9170_DEBUGFS=y +CONFIG_IWLWIFI_DEVICE_TRACING=y # CONFIG_RTLWIFI_DEBUG is not set -# CONFIG_DEBUG_OBJECTS_WORK is not set +CONFIG_DEBUG_OBJECTS_WORK=y -# CONFIG_DMADEVICES_DEBUG is not set -# CONFIG_DMADEVICES_VDEBUG is not set +CONFIG_DMADEVICES_DEBUG=y +CONFIG_DMADEVICES_VDEBUG=y CONFIG_PM_ADVANCED_DEBUG=y -# CONFIG_CEPH_LIB_PRETTYDEBUG is not set -# CONFIG_QUOTA_DEBUG is not set +CONFIG_CEPH_LIB_PRETTYDEBUG=y +CONFIG_QUOTA_DEBUG=y CONFIG_PCI_DEFAULT_USE_CRS=y @@ -103,18 +104,18 @@ CONFIG_KGDB_KDB=y CONFIG_KDB_KEYBOARD=y CONFIG_KDB_CONTINUE_CATASTROPHIC=0 -# CONFIG_DEBUG_OBJECTS_PERCPU_COUNTER is not set +CONFIG_DEBUG_OBJECTS_PERCPU_COUNTER=y # CONFIG_PERCPU_TEST is not set -# CONFIG_TEST_LIST_SORT is not set +CONFIG_TEST_LIST_SORT=y # CONFIG_TEST_STRING_HELPERS is not set -# CONFIG_DETECT_HUNG_TASK is not set +CONFIG_DETECT_HUNG_TASK=y CONFIG_DEFAULT_HUNG_TASK_TIMEOUT=120 # CONFIG_BOOTPARAM_HUNG_TASK_PANIC is not set -# CONFIG_X86_BOOTPARAM_MEMORY_CORRUPTION_CHECK is not set +CONFIG_X86_BOOTPARAM_MEMORY_CORRUPTION_CHECK=y -# CONFIG_DEBUG_KMEMLEAK is not set +CONFIG_DEBUG_KMEMLEAK=y CONFIG_DEBUG_KMEMLEAK_EARLY_LOG_SIZE=1024 # CONFIG_DEBUG_KMEMLEAK_TEST is not set CONFIG_DEBUG_KMEMLEAK_DEFAULT_OFF=y @@ -125,7 +126,7 @@ CONFIG_DEBUG_KMEMLEAK_DEFAULT_OFF=y # CONFIG_SPI_DEBUG is not set -# CONFIG_X86_DEBUG_STATIC_CPU_HAS is not set +CONFIG_X86_DEBUG_STATIC_CPU_HAS=y # CONFIG_SCHEDSTATS is not set # CONFIG_LATENCYTOP is not set diff --git a/config-x86-32-generic b/config-x86-32-generic index 6adcfb5..b68ee60 100644 --- a/config-x86-32-generic +++ b/config-x86-32-generic @@ -230,5 +230,7 @@ CONFIG_BACKLIGHT_PWM=m # CONFIG_PINCTRL_CAPRI is not set # CONFIG_PINCTRL_MSM8X74 is not set # CONFIG_PINCTRL_BCM281XX is not set +# CONFIG_PINCTRL_APQ8064 is not set +# CONFIG_PINCTRL_IPQ8064 is not set # CONFIG_COMMON_CLK_SI570 is not set # CONFIG_COMMON_CLK_QCOM is not set diff --git a/config-x86-generic b/config-x86-generic index 92441b0..4710201 100644 --- a/config-x86-generic +++ b/config-x86-generic @@ -333,7 +333,7 @@ CONFIG_SP5100_TCO=m # CONFIG_MEMTEST is not set # CONFIG_DEBUG_TLBFLUSH is not set -# CONFIG_MAXSMP is not set +CONFIG_MAXSMP=y CONFIG_HP_ILO=m @@ -447,6 +447,8 @@ CONFIG_NFC_MICROREAD_MEI=m # Maybe enable in debug kernels? # CONFIG_DEBUG_NMI_SELFTEST is not set +# CONFIG_X86_GOLDFISH is not set + CONFIG_X86_INTEL_LPSS=y CONFIG_PWM_LPSS=m CONFIG_PINCTRL=y diff --git a/config-x86_64-generic b/config-x86_64-generic index 02883b8..2f09816 100644 --- a/config-x86_64-generic +++ b/config-x86_64-generic @@ -74,6 +74,9 @@ CONFIG_CRYPTO_SERPENT_AVX_X86_64=m CONFIG_CRYPTO_SERPENT_AVX2_X86_64=m CONFIG_CRYPTO_TWOFISH_AVX_X86_64=m CONFIG_CRYPTO_TWOFISH_AVX2_X86_64=m +# staging crypto +# CONFIG_CRYPTO_SKEIN is not set +# CONFIG_CRYPTO_THREEFISH is not set # CONFIG_I2C_ALI1535 is not set # CONFIG_I2C_ALI1563 is not set diff --git a/defaults-acpi-video.patch b/defaults-acpi-video.patch deleted file mode 100644 index c1386c0..0000000 --- a/defaults-acpi-video.patch +++ /dev/null @@ -1,16 +0,0 @@ -Bugzilla: N/A -Upstream-status: Fedora mustard (but no idea why) - -diff --git a/drivers/acpi/video.c b/drivers/acpi/video.c -index eaef02a..2029819 100644 ---- a/drivers/acpi/video.c -+++ b/drivers/acpi/video.c -@@ -69,7 +69,7 @@ MODULE_AUTHOR("Bruno Ducrot"); - MODULE_DESCRIPTION("ACPI Video Driver"); - MODULE_LICENSE("GPL"); - --static bool brightness_switch_enabled = 1; -+static bool brightness_switch_enabled = 0; - module_param(brightness_switch_enabled, bool, 0644); - - /* diff --git a/kbuild-Add-recipe-cmd-an-at-less-cmd-variant.patch b/kbuild-Add-recipe-cmd-an-at-less-cmd-variant.patch new file mode 100644 index 0000000..dc6c2dd --- /dev/null +++ b/kbuild-Add-recipe-cmd-an-at-less-cmd-variant.patch @@ -0,0 +1,84 @@ + +Delivered-To: jwboyer@gmail.com +Received: by 10.76.6.212 with SMTP id d20csp275723oaa; + Wed, 11 Jun 2014 09:20:26 -0700 (PDT) +X-Received: by 10.68.202.194 with SMTP id kk2mr6443717pbc.156.1402503625476; + Wed, 11 Jun 2014 09:20:25 -0700 (PDT) +Return-Path: +Received: from bastion.fedoraproject.org (bastion02.fedoraproject.org. [209.132.181.3]) + by mx.google.com with ESMTP id hk10si7140166pac.55.2014.06.11.09.20.25 + for ; + Wed, 11 Jun 2014 09:20:25 -0700 (PDT) +Received-SPF: softfail (google.com: domain of transitioning luto@amacapital.net does not designate 209.132.181.3 as permitted sender) client-ip=209.132.181.3; +Authentication-Results: mx.google.com; + spf=softfail (google.com: domain of transitioning luto@amacapital.net does not designate 209.132.181.3 as permitted sender) smtp.mail=luto@amacapital.net +Received: by bastion02.phx2.fedoraproject.org (Postfix) + id F167F40A24; Wed, 11 Jun 2014 16:20:24 +0000 (UTC) +Delivered-To: jwboyer@fedoraproject.org +Received: from mx1.redhat.com (ext-mx12.extmail.prod.ext.phx2.redhat.com [10.5.110.17]) + by bastion02.phx2.fedoraproject.org (Postfix) with ESMTP id E054140A1F + for ; Wed, 11 Jun 2014 16:20:24 +0000 (UTC) +Received: from mail-pd0-f174.google.com (mail-pd0-f174.google.com [209.85.192.174]) + by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id s5BGKK9D017943 + for ; Wed, 11 Jun 2014 12:20:21 -0400 +Received: by mail-pd0-f174.google.com with SMTP id y10so1503744pdj.19 + for ; Wed, 11 Jun 2014 09:20:20 -0700 (PDT) +X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; + d=1e100.net; s=20130820; + h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to + :references:in-reply-to:references; + bh=CQ9F+PXV6SvMruBV8gwiVUY2iUpI65+jqkUh4N/yL04=; + b=PJ/CK5msKabsmSWS6VSEgjtZ7jgX0BF/9CHTigKuAr0W/4IU0xN0osE/pc6Gny5slE + /0PZrvgDnSLczb+l7Ed2kovova/KZktb6EbUXeOJEYfKC9dhytsCYDG9tuLUvxEmgZfp + vOum3H1CA3ocdu+5qKvwem2WOdLu2+2t3i8KchcmsDZcWhK66eb8nro1LbbwWgdKsPSF + V5NT773uUJ23hy2/uGO6m/PiSIrc8skrgCEae6ugoL0M5r+H9UwfqvLlYB1PL+DJ2JPm + t4wLxV2XxD610nR3sXIs1urvX+/4xAG+2ZdC8NMi7+A2SVtku64rS/5UI30D00xfQoB6 + hYLg== +X-Gm-Message-State: ALoCoQnsNny2k21X9YSmrkqYkA6qcZffpVvIHQPZiz91j0A2KaYHwDQ4WNaxXqR1ZXSsLA8qPd+g +X-Received: by 10.66.172.229 with SMTP id bf5mr14570106pac.57.1402503620494; + Wed, 11 Jun 2014 09:20:20 -0700 (PDT) +Received: from localhost (50-76-60-73-ip-static.hfc.comcastbusiness.net. [50.76.60.73]) + by mx.google.com with ESMTPSA id fk4sm31444487pab.23.2014.06.11.09.20.19 + for + (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); + Wed, 11 Jun 2014 09:20:19 -0700 (PDT) +From: Andy Lutomirski +To: "H. Peter Anvin" , Josh Boyer +Cc: Michal Marek , linux-kbuild@vger.kernel.org, + "Linux-Kernel@Vger. Kernel. Org" , + Andy Lutomirski +Subject: [PATCH 1/2] kbuild: Add recipe-cmd, an @-less cmd variant +Date: Wed, 11 Jun 2014 09:20:06 -0700 +Message-Id: +X-Mailer: git-send-email 1.9.3 +In-Reply-To: +References: <5398749B.4090209@zytor.com> + +In-Reply-To: +References: +X-RedHat-Spam-Score: -2.01 (BAYES_00,DCC_REPUT_13_19,RCVD_IN_DNSWL_NONE,SPF_PASS,URIBL_BLOCKED) +X-Scanned-By: MIMEDefang 2.68 on 10.5.110.17 + +It's awkward to put $(call cmd,xyz) in a loop in a recipe because +the pesky at sign gets in the way. + +Signed-off-by: Andy Lutomirski +--- + scripts/Kbuild.include | 1 + + 1 file changed, 1 insertion(+) + +diff --git a/scripts/Kbuild.include b/scripts/Kbuild.include +index 122f95c..3e60923 100644 +--- a/scripts/Kbuild.include ++++ b/scripts/Kbuild.include +@@ -194,6 +194,7 @@ echo-cmd = $(if $($(quiet)cmd_$(1)),\ + + # printing commands + cmd = @$(echo-cmd) $(cmd_$(1)) ++recipe-cmd = $(echo-cmd) $(cmd_$(1)) + + # Add $(obj)/ for paths that are not absolute + objectify = $(foreach o,$(1),$(if $(filter /%,$(o)),$(o),$(obj)/$(o))) +-- +1.9.3 + diff --git a/kernel.spec b/kernel.spec index 08cfec2..f13e715 100644 --- a/kernel.spec +++ b/kernel.spec @@ -6,7 +6,7 @@ Summary: The Linux kernel # For a stable, released kernel, released_kernel should be 1. For rawhide # and/or a kernel built from an rc or git snapshot, released_kernel should # be 0. -%global released_kernel 1 +%global released_kernel 0 # Sign modules on x86. Make sure the config files match this setting if more # architectures are added. @@ -67,7 +67,7 @@ Summary: The Linux kernel # The rc snapshot level %define rcrev 0 # The git snapshot level -%define gitrev 0 +%define gitrev 1 # Set rpm version accordingly %define rpmversion 3.%{upstream_sublevel}.0 %endif @@ -128,7 +128,7 @@ Summary: The Linux kernel # Set debugbuildsenabled to 1 for production (build separate debug kernels) # and 0 for rawhide (all kernels are debug kernels). # See also 'make debug' and 'make release'. -%define debugbuildsenabled 1 +%define debugbuildsenabled 0 # Want to build a vanilla kernel build without any non-upstream patches? %define with_vanilla %{?_with_vanilla: 1} %{?!_with_vanilla: 0} @@ -542,8 +542,6 @@ Patch09: upstream-reverts.patch # Standalone patches -Patch390: defaults-acpi-video.patch - Patch450: input-kill-stupid-messages.patch Patch452: no-pcspkr-modalias.patch @@ -606,7 +604,6 @@ Patch21020: arm-tegra-usb-no-reset-linux33.patch # ARM i.MX6 # ARM sunxi (AllWinner) -Patch21025: 0001-ARM-sunxi-Add-driver-for-SD-MMC-hosts-found-on-Allwi.patch #rhbz 754518 Patch21235: scsi-sd_revalidate_disk-prevent-NULL-ptr-deref.patch @@ -624,21 +621,9 @@ Patch25047: drm-radeon-Disable-writeback-by-default-on-ppc.patch #rhbz 1025603 Patch25063: disable-libdw-unwind-on-non-x86.patch -#rhbz 1048314 -Patch25048: 0001-HID-rmi-introduce-RMI-driver-for-Synaptics-touchpads.patch - -#rhbz 1089583 -Patch25064: 0001-HID-rmi-do-not-handle-touchscreens-through-hid-rmi.patch - -#rhbz 1090161 -Patch25072: HID-rmi-do-not-fetch-more-than-16-bytes-in-a-query.patch - #rhbz 983342 1093120 Patch25069: 0001-acpi-video-Add-4-new-models-to-the-use_native_backli.patch -Patch25071: s390-appldata-add-slab.h-for-kzalloc-kfree.patch - - # CVE-2014-3917 rhbz 1102571 1102715 Patch25093: auditsc-audit_krule-mask-accesses-need-bounds-checking.patch @@ -650,16 +635,12 @@ Patch26002: samsung-laptop-Add-broken-acpi-video-quirk-for-NC210.patch Patch26003: ideapad-laptop-Blacklist-rfkill-control-on-the-Lenov.patch Patch26004: asus-wmi-Add-a-no-backlight-quirk.patch Patch26005: eeepc-wmi-Add-no-backlight-quirk-for-Asus-H87I-PLUS-.patch -Patch26006: acpi-video-Don-t-register-acpi_video_resume-notifier.patch -Patch26007: acpi-video-Add-an-acpi_video_unregister_backlight-fu.patch -Patch26008: acer-wmi-Switch-to-acpi_video_unregister_backlight.patch -Patch26009: acer-wmi-Add-Aspire-5741-to-video_vendor_dmi_table.patch -Patch26010: nouveau-Don-t-check-acpi_video_backlight_support-bef.patch -Patch26011: backlight-Add-backlight-device-un-registration-notif.patch -Patch26012: acpi-video-Unregister-the-backlight-device-if-a-raw-.patch Patch26013: acpi-video-Add-use-native-backlight-quirk-for-the-Th.patch Patch26014: acpi-video-Add-use_native_backlight-quirk-for-HP-Pro.patch +Patch26015: kbuild-Add-recipe-cmd-an-at-less-cmd-variant.patch +Patch26016: x86-vdso-Fix-vdso_install.patch + # END OF PATCH DEFINITIONS %endif @@ -1253,7 +1234,6 @@ ApplyPatch 0001-lib-cpumask-Make-CPUMASK_OFFSTACK-usable-without-deb.patch # ARM # ApplyPatch arm-tegra-usb-no-reset-linux33.patch -ApplyPatch 0001-ARM-sunxi-Add-driver-for-SD-MMC-hosts-found-on-Allwi.patch # # bugfixes to drivers and filesystems @@ -1274,7 +1254,6 @@ ApplyPatch 0001-ARM-sunxi-Add-driver-for-SD-MMC-hosts-found-on-Allwi.patch # WMI # ACPI -ApplyPatch defaults-acpi-video.patch # # PCI @@ -1359,21 +1338,12 @@ ApplyPatch ath9k_rx_dma_stop_check.patch ApplyPatch drm-radeon-Disable-writeback-by-default-on-ppc.patch -#rhbz 1048314 -ApplyPatch 0001-HID-rmi-introduce-RMI-driver-for-Synaptics-touchpads.patch -#rhbz 1089583 -ApplyPatch 0001-HID-rmi-do-not-handle-touchscreens-through-hid-rmi.patch -#rhbz 1090161 -ApplyPatch HID-rmi-do-not-fetch-more-than-16-bytes-in-a-query.patch - #rhbz 1025603 ApplyPatch disable-libdw-unwind-on-non-x86.patch #rhbz 983342 1093120 ApplyPatch 0001-acpi-video-Add-4-new-models-to-the-use_native_backli.patch -ApplyPatch s390-appldata-add-slab.h-for-kzalloc-kfree.patch - # CVE-2014-3917 rhbz 1102571 1102715 ApplyPatch auditsc-audit_krule-mask-accesses-need-bounds-checking.patch @@ -1385,16 +1355,12 @@ ApplyPatch samsung-laptop-Add-broken-acpi-video-quirk-for-NC210.patch ApplyPatch ideapad-laptop-Blacklist-rfkill-control-on-the-Lenov.patch ApplyPatch asus-wmi-Add-a-no-backlight-quirk.patch ApplyPatch eeepc-wmi-Add-no-backlight-quirk-for-Asus-H87I-PLUS-.patch -ApplyPatch acpi-video-Don-t-register-acpi_video_resume-notifier.patch -ApplyPatch acpi-video-Add-an-acpi_video_unregister_backlight-fu.patch -ApplyPatch acer-wmi-Switch-to-acpi_video_unregister_backlight.patch -ApplyPatch acer-wmi-Add-Aspire-5741-to-video_vendor_dmi_table.patch -ApplyPatch nouveau-Don-t-check-acpi_video_backlight_support-bef.patch -ApplyPatch backlight-Add-backlight-device-un-registration-notif.patch -ApplyPatch acpi-video-Unregister-the-backlight-device-if-a-raw-.patch ApplyPatch acpi-video-Add-use-native-backlight-quirk-for-the-Th.patch ApplyPatch acpi-video-Add-use_native_backlight-quirk-for-HP-Pro.patch +ApplyPatch kbuild-Add-recipe-cmd-an-at-less-cmd-variant.patch +ApplyPatch x86-vdso-Fix-vdso_install.patch + # END OF PATCH APPLICATIONS %endif @@ -2267,6 +2233,10 @@ fi # ||----w | # || || %changelog +* Tue Jun 10 2014 Josh Boyer - 3.16.0-0.rc0.git1.1 +- Linux v3.15-7218-g3f17ea6dea8b +- Reenable debugging options. + * Mon Jun 09 2014 Josh Boyer - 3.15.0-1 - Linux v3.15 - Disable debugging options. diff --git a/modsign-uefi.patch b/modsign-uefi.patch index af6844d..5f8cc33 100644 --- a/modsign-uefi.patch +++ b/modsign-uefi.patch @@ -1,7 +1,7 @@ Bugzilla: N/A Upstream-status: Fedora mustard for now -From 779183da2955e33a221c3f7a622766cd53e06d45 Mon Sep 17 00:00:00 2001 +From fa2bfe718da40bf24f92c85846577e9bc788882c Mon Sep 17 00:00:00 2001 From: Dave Howells Date: Tue, 23 Oct 2012 09:30:54 -0400 Subject: [PATCH 1/5] Add EFI signature data types @@ -15,12 +15,12 @@ Signed-off-by: David Howells 1 file changed, 20 insertions(+) diff --git a/include/linux/efi.h b/include/linux/efi.h -index 3a77a70fff27..4c7f7011ea19 100644 +index e73f391fd3c8..3d66a61bbbca 100644 --- a/include/linux/efi.h +++ b/include/linux/efi.h -@@ -575,6 +575,12 @@ typedef efi_status_t efi_query_variable_store_t(u32 attributes, unsigned long si - #define EFI_FILE_SYSTEM_GUID \ - EFI_GUID( 0x964e5b22, 0x6459, 0x11d2, 0x8e, 0x39, 0x00, 0xa0, 0xc9, 0x69, 0x72, 0x3b ) +@@ -578,6 +578,12 @@ typedef efi_status_t efi_query_variable_store_t(u32 attributes, unsigned long si + #define DEVICE_TREE_GUID \ + EFI_GUID( 0xb1b621d5, 0xf19c, 0x41a5, 0x83, 0x0b, 0xd9, 0x15, 0x2c, 0x69, 0xaa, 0xe0 ) +#define EFI_CERT_SHA256_GUID \ + EFI_GUID( 0xc1c41626, 0x504c, 0x4092, 0xac, 0xa9, 0x41, 0xf9, 0x36, 0x93, 0x43, 0x28 ) @@ -31,7 +31,7 @@ index 3a77a70fff27..4c7f7011ea19 100644 typedef struct { efi_guid_t guid; u64 table; -@@ -782,6 +788,20 @@ typedef struct _efi_file_io_interface { +@@ -793,6 +799,20 @@ typedef struct _efi_file_io_interface { #define EFI_INVALID_TABLE_ADDR (~0UL) @@ -53,10 +53,10 @@ index 3a77a70fff27..4c7f7011ea19 100644 * All runtime access to EFI goes through this structure: */ -- -1.9.0 +1.9.3 -From 8592d1f6a8cc8d901c94582b9d0b57d170a0940b Mon Sep 17 00:00:00 2001 +From 922e0512ce70101b596558d5bb075cd40a450322 Mon Sep 17 00:00:00 2001 From: Dave Howells Date: Tue, 23 Oct 2012 09:36:28 -0400 Subject: [PATCH 2/5] Add an EFI signature blob parser and key loader. @@ -218,12 +218,12 @@ index 000000000000..424896a0b169 + return 0; +} diff --git a/include/linux/efi.h b/include/linux/efi.h -index 4c7f7011ea19..96174a7f9e90 100644 +index 3d66a61bbbca..7854ff3c0f11 100644 --- a/include/linux/efi.h +++ b/include/linux/efi.h -@@ -883,6 +883,10 @@ extern int efi_set_rtc_mmss(const struct timespec *now); - extern void efi_reserve_boot_services(void); - extern struct efi_memory_map memmap; +@@ -901,6 +901,10 @@ extern struct efi_memory_map memmap; + (md) <= (efi_memory_desc_t *)((m)->map_end - (m)->desc_size); \ + (md) = (void *)(md) + (m)->desc_size) +struct key; +extern int __init parse_efi_signature_list(const void *data, size_t size, @@ -233,10 +233,10 @@ index 4c7f7011ea19..96174a7f9e90 100644 * efi_range_is_wc - check the WC bit on an address range * @start: starting kvirt address -- -1.9.0 +1.9.3 -From a4da3547b2eb4e0c7111eee7e5d5043413142835 Mon Sep 17 00:00:00 2001 +From 2534dedee545507c00973279d5db515e122b5104 Mon Sep 17 00:00:00 2001 From: Josh Boyer Date: Fri, 26 Oct 2012 12:36:24 -0400 Subject: [PATCH 3/5] KEYS: Add a system blacklist keyring @@ -270,10 +270,10 @@ index 8dabc399bd1d..e466de10ceec 100644 #endif /* _KEYS_SYSTEM_KEYRING_H */ diff --git a/init/Kconfig b/init/Kconfig -index 9d3585bb2a7a..932f22f7cc40 100644 +index 9d76b99af1b9..ac5f580437a0 100644 --- a/init/Kconfig +++ b/init/Kconfig -@@ -1658,6 +1658,15 @@ config SYSTEM_TRUSTED_KEYRING +@@ -1677,6 +1677,15 @@ config SYSTEM_TRUSTED_KEYRING Keys in this keyring are used by module signature checking. @@ -348,10 +348,10 @@ index 52ebc70263f4..478c4f8ec908 100644 } -- -1.9.0 +1.9.3 -From 25adb4e43fb5c23723f33a806399ad484f8dcfa5 Mon Sep 17 00:00:00 2001 +From a72ed58241f0d62b7f9fbf4e1fbbcc1e02145098 Mon Sep 17 00:00:00 2001 From: Josh Boyer Date: Fri, 26 Oct 2012 12:42:16 -0400 Subject: [PATCH 4/5] MODSIGN: Import certificates from UEFI Secure Boot @@ -379,10 +379,10 @@ Signed-off-by: Josh Boyer create mode 100644 kernel/modsign_uefi.c diff --git a/include/linux/efi.h b/include/linux/efi.h -index 96174a7f9e90..8f7466023105 100644 +index 7854ff3c0f11..31fd75e7230b 100644 --- a/include/linux/efi.h +++ b/include/linux/efi.h -@@ -581,6 +581,12 @@ typedef efi_status_t efi_query_variable_store_t(u32 attributes, unsigned long si +@@ -584,6 +584,12 @@ typedef efi_status_t efi_query_variable_store_t(u32 attributes, unsigned long si #define EFI_CERT_X509_GUID \ EFI_GUID( 0xa5c059a1, 0x94e4, 0x4aa7, 0x87, 0xb5, 0xab, 0x15, 0x5c, 0x2b, 0xf0, 0x72 ) @@ -396,10 +396,10 @@ index 96174a7f9e90..8f7466023105 100644 efi_guid_t guid; u64 table; diff --git a/init/Kconfig b/init/Kconfig -index 932f22f7cc40..6023af12ef4f 100644 +index ac5f580437a0..ca7268b594aa 100644 --- a/init/Kconfig +++ b/init/Kconfig -@@ -1812,6 +1812,15 @@ config MODULE_SIG_ALL +@@ -1831,6 +1831,15 @@ config MODULE_SIG_ALL comment "Do not forget to sign required modules with scripts/sign-file" depends on MODULE_SIG_FORCE && !MODULE_SIG_ALL @@ -535,10 +535,10 @@ index 000000000000..94b0eb38a284 +} +late_initcall(load_uefi_certs); -- -1.9.0 +1.9.3 -From 20b7de055a87e6f5555c27de8188b7c975e3e330 Mon Sep 17 00:00:00 2001 +From 11bb98e3a62de77fc66a3e2197578dd9d891b998 Mon Sep 17 00:00:00 2001 From: Josh Boyer Date: Thu, 3 Oct 2013 10:14:23 -0400 Subject: [PATCH 5/5] MODSIGN: Support not importing certs from db @@ -620,5 +620,5 @@ index 94b0eb38a284..ae28b974d49a 100644 mok = get_cert_list(L"MokListRT", &mok_var, &moksize); -- -1.9.0 +1.9.3 diff --git a/nouveau-Don-t-check-acpi_video_backlight_support-bef.patch b/nouveau-Don-t-check-acpi_video_backlight_support-bef.patch deleted file mode 100644 index b6ed45c..0000000 --- a/nouveau-Don-t-check-acpi_video_backlight_support-bef.patch +++ /dev/null @@ -1,79 +0,0 @@ -Bugzilla: 1093171 -Upstream-status: Queued for 3.16 - -From abf17f7885656ccc181a608d2a9ee770b23d9e23 Mon Sep 17 00:00:00 2001 -From: Hans de Goede -Date: Mon, 2 Jun 2014 17:41:07 +0200 -Subject: [PATCH 10/14] nouveau: Don't check acpi_video_backlight_support() - before registering backlight - -acpi_video_backlight_support() is supposed to be called by other (vendor -specific) firmware backlight controls, not by native / raw backlight controls -like nv_backlight. - -Userspace will normally prefer firmware interfaces over raw interfaces, so -if acpi_video backlight support is present it will use that even if -nv_backlight is registered as well. - -Except when video.use_native_backlight is present on the kernel cmdline -(or enabled through a dmi based quirk). As the name indicates the goal here -is to make only the raw interface available to userspace so that it will use -that (it only does this when it sees a win8 compliant bios). - -This is done by: -1) Not registering any acpi_video# backlight devices; and -2) Making acpi_video_backlight_support() return true so that other firmware -drivers, ie acer_wmi, thinkpad_acpi, dell_laptop, etc. Don't register their -own vender specific interfaces. - -Currently nouveau breaks this setup, as when acpi_video_backlight_support() -returns true, it does not register itself, resulting in no backlight control -at all. - -This is esp. going to be a problem with 3.16 which will default to -video.use_native_backlight=1, and thus nouveau based laptops with a win8 bios -will get no backlight control at all. - -This also likely explains why the previous attempt to make -video.use_native_backlight=1 the default was not a success, as without this -patch having a default of video.use_native_backlight=1 will cause regressions. - -Note this effectively reverts commit 5bead799 - -Also see: https://bugzilla.redhat.com/show_bug.cgi?id=1093171 - -Signed-off-by: Hans de Goede ---- - drivers/gpu/drm/nouveau/nouveau_backlight.c | 9 --------- - 1 file changed, 9 deletions(-) - -diff --git a/drivers/gpu/drm/nouveau/nouveau_backlight.c b/drivers/gpu/drm/nouveau/nouveau_backlight.c -index 630f6e84fc01..2c1e4aad7da3 100644 ---- a/drivers/gpu/drm/nouveau/nouveau_backlight.c -+++ b/drivers/gpu/drm/nouveau/nouveau_backlight.c -@@ -31,7 +31,6 @@ - */ - - #include --#include - - #include "nouveau_drm.h" - #include "nouveau_reg.h" -@@ -222,14 +221,6 @@ nouveau_backlight_init(struct drm_device *dev) - struct nouveau_device *device = nv_device(drm->device); - struct drm_connector *connector; - --#ifdef CONFIG_ACPI -- if (acpi_video_backlight_support()) { -- NV_INFO(drm, "ACPI backlight interface available, " -- "not registering our own\n"); -- return 0; -- } --#endif -- - list_for_each_entry(connector, &dev->mode_config.connector_list, head) { - if (connector->connector_type != DRM_MODE_CONNECTOR_LVDS && - connector->connector_type != DRM_MODE_CONNECTOR_eDP) --- -1.9.0 - diff --git a/s390-appldata-add-slab.h-for-kzalloc-kfree.patch b/s390-appldata-add-slab.h-for-kzalloc-kfree.patch deleted file mode 100644 index 3716ce8..0000000 --- a/s390-appldata-add-slab.h-for-kzalloc-kfree.patch +++ /dev/null @@ -1,28 +0,0 @@ -From 1eb5e8b7449ff017c2f358d97bd2fcd4eb87cc53 Mon Sep 17 00:00:00 2001 -From: Jeff Mahoney -Date: Sun, 27 Apr 2014 17:35:43 -0400 -Subject: s390/appldata: add slab.h for kzalloc/kfree - -This fixes: -arch/s390/appldata/appldata_mem.c:135:2: error: implicit declaration of function 'kzalloc' [-Werror=implicit-function-declaration] -arch/s390/appldata/appldata_mem.c:141:3: error: implicit declaration of function 'kfree' [-Werror=implicit-function-declaration] - -Signed-off-by: Jeff Mahoney -Signed-off-by: Heiko Carstens -Signed-off-by: Martin Schwidefsky - -diff --git a/arch/s390/appldata/appldata_mem.c b/arch/s390/appldata/appldata_mem.c -index 42be537..edcf2a7 100644 ---- a/arch/s390/appldata/appldata_mem.c -+++ b/arch/s390/appldata/appldata_mem.c -@@ -13,6 +13,7 @@ - #include - #include - #include -+#include - #include - - #include "appldata.h" --- -cgit v0.10.1 - diff --git a/sb-hibernate.patch b/sb-hibernate.patch index da7bb74..c772c30 100644 --- a/sb-hibernate.patch +++ b/sb-hibernate.patch @@ -1,7 +1,7 @@ Bugzilla: N/A Upstream-status: Fedora mustard -From ffe1ee94d526900ce1e5191cdd38934477dd209a Mon Sep 17 00:00:00 2001 +From ab0f460f8349c7ccb400b2dc8937c0682c8a0f47 Mon Sep 17 00:00:00 2001 From: Josh Boyer Date: Fri, 26 Oct 2012 14:02:09 -0400 Subject: [PATCH] hibernate: Disable in a signed modules environment @@ -19,7 +19,7 @@ Signed-off-by: Josh Boyer 3 files changed, 22 insertions(+), 2 deletions(-) diff --git a/kernel/power/hibernate.c b/kernel/power/hibernate.c -index b26f5f1..e65228b 100644 +index df88d55dc436..5c5834d7708b 100644 --- a/kernel/power/hibernate.c +++ b/kernel/power/hibernate.c @@ -28,6 +28,8 @@ @@ -31,7 +31,7 @@ index b26f5f1..e65228b 100644 #include "power.h" -@@ -632,6 +634,10 @@ int hibernate(void) +@@ -639,6 +641,10 @@ int hibernate(void) { int error; @@ -42,7 +42,7 @@ index b26f5f1..e65228b 100644 lock_system_sleep(); /* The snapshot device should not be opened while we're running */ if (!atomic_add_unless(&snapshot_device_available, -1, 0)) { -@@ -723,7 +729,7 @@ static int software_resume(void) +@@ -731,7 +737,7 @@ static int software_resume(void) /* * If the user said "noresume".. bail out early. */ @@ -51,7 +51,7 @@ index b26f5f1..e65228b 100644 return 0; /* -@@ -889,6 +895,11 @@ static ssize_t disk_show(struct kobject *kobj, struct kobj_attribute *attr, +@@ -897,6 +903,11 @@ static ssize_t disk_show(struct kobject *kobj, struct kobj_attribute *attr, int i; char *start = buf; @@ -63,7 +63,7 @@ index b26f5f1..e65228b 100644 for (i = HIBERNATION_FIRST; i <= HIBERNATION_MAX; i++) { if (!hibernation_modes[i]) continue; -@@ -923,6 +934,9 @@ static ssize_t disk_store(struct kobject *kobj, struct kobj_attribute *attr, +@@ -931,6 +942,9 @@ static ssize_t disk_store(struct kobject *kobj, struct kobj_attribute *attr, char *p; int mode = HIBERNATION_INVALID; @@ -74,7 +74,7 @@ index b26f5f1..e65228b 100644 len = p ? p - buf : n; diff --git a/kernel/power/main.c b/kernel/power/main.c -index 1d1bf63..300f300 100644 +index 573410d6647e..f5201093adc4 100644 --- a/kernel/power/main.c +++ b/kernel/power/main.c @@ -15,6 +15,7 @@ @@ -86,7 +86,7 @@ index 1d1bf63..300f300 100644 #include "power.h" @@ -301,7 +302,11 @@ static ssize_t state_show(struct kobject *kobj, struct kobj_attribute *attr, - } + #endif #ifdef CONFIG_HIBERNATION - s += sprintf(s, "%s\n", "disk"); @@ -99,7 +99,7 @@ index 1d1bf63..300f300 100644 if (s != buf) /* convert the last space to a newline */ diff --git a/kernel/power/user.c b/kernel/power/user.c -index 15cb72f..fa85ed5 100644 +index efe99dee9510..5f5d1026f1e2 100644 --- a/kernel/power/user.c +++ b/kernel/power/user.c @@ -25,6 +25,7 @@ @@ -111,5 +111,5 @@ index 15cb72f..fa85ed5 100644 #include -- -1.8.3.1 +1.9.3 diff --git a/secure-modules.patch b/secure-modules.patch index 478c62f..bcc1c99 100644 --- a/secure-modules.patch +++ b/secure-modules.patch @@ -1,7 +1,7 @@ Bugzilla: N/A Upstream-status: Fedora mustard. Replaced by securelevels, but that was nak'd -From 0f81a4461431941c17ff26fd3d5e284ede4a368a Mon Sep 17 00:00:00 2001 +From 18c06266b23a1241491e62003144ed8e74b7a725 Mon Sep 17 00:00:00 2001 From: Matthew Garrett Date: Fri, 9 Aug 2013 17:58:15 -0400 Subject: [PATCH 01/14] Add secure_modules() call @@ -42,7 +42,7 @@ index f520a767c86c..fc9b54eb779e 100644 #ifdef CONFIG_SYSFS diff --git a/kernel/module.c b/kernel/module.c -index 11869408f79b..2b9204fe055f 100644 +index 079c4615607d..90be09d5da44 100644 --- a/kernel/module.c +++ b/kernel/module.c @@ -3835,3 +3835,13 @@ void module_layout(struct module *mod, @@ -60,10 +60,10 @@ index 11869408f79b..2b9204fe055f 100644 +} +EXPORT_SYMBOL(secure_modules); -- -1.8.5.3 +1.9.3 -From 806c4ee0e6484b529b88b3d0ceb49f6edf96ae11 Mon Sep 17 00:00:00 2001 +From 6f64d0544f267a7410fde0e2062a5713248c258c Mon Sep 17 00:00:00 2001 From: Matthew Garrett Date: Thu, 8 Mar 2012 10:10:38 -0500 Subject: [PATCH 02/14] PCI: Lock down BAR access when module security is @@ -83,18 +83,18 @@ Signed-off-by: Matthew Garrett 3 files changed, 19 insertions(+), 2 deletions(-) diff --git a/drivers/pci/pci-sysfs.c b/drivers/pci/pci-sysfs.c -index 4e0acefb7565..01b56d13d021 100644 +index 84c350994b06..c4ee5c98f780 100644 --- a/drivers/pci/pci-sysfs.c +++ b/drivers/pci/pci-sysfs.c -@@ -29,6 +29,7 @@ - #include +@@ -30,6 +30,7 @@ #include #include + #include +#include #include "pci.h" static int sysfs_initialized; /* = 0 */ -@@ -652,6 +653,9 @@ pci_write_config(struct file* filp, struct kobject *kobj, +@@ -710,6 +711,9 @@ pci_write_config(struct file* filp, struct kobject *kobj, loff_t init_off = off; u8 *data = (u8*) buf; @@ -104,7 +104,7 @@ index 4e0acefb7565..01b56d13d021 100644 if (off > dev->cfg_size) return 0; if (off + count > dev->cfg_size) { -@@ -958,6 +962,9 @@ pci_mmap_resource(struct kobject *kobj, struct bin_attribute *attr, +@@ -1016,6 +1020,9 @@ pci_mmap_resource(struct kobject *kobj, struct bin_attribute *attr, resource_size_t start, end; int i; @@ -114,7 +114,7 @@ index 4e0acefb7565..01b56d13d021 100644 for (i = 0; i < PCI_ROM_RESOURCE; i++) if (res == &pdev->resource[i]) break; -@@ -1065,6 +1072,9 @@ pci_write_resource_io(struct file *filp, struct kobject *kobj, +@@ -1123,6 +1130,9 @@ pci_write_resource_io(struct file *filp, struct kobject *kobj, struct bin_attribute *attr, char *buf, loff_t off, size_t count) { @@ -179,10 +179,10 @@ index 24750a1b39b6..fa57896b97dd 100644 dev = pci_get_bus_and_slot(bus, dfn); -- -1.8.5.3 +1.9.3 -From 16ee82e2add8684e374451e6ba34be3ee41e4ef1 Mon Sep 17 00:00:00 2001 +From 9c9b7deb557fd099b7f8e4a9283003ee0bf43332 Mon Sep 17 00:00:00 2001 From: Matthew Garrett Date: Thu, 8 Mar 2012 10:35:59 -0500 Subject: [PATCH 03/14] x86: Lock down IO port access when module security is @@ -252,10 +252,10 @@ index 917403fe10da..cdf839f9defe 100644 return -EFAULT; while (count-- > 0 && i < 65536) { -- -1.8.5.3 +1.9.3 -From 2fd4b35393b19cde87e4770d3b85d12760e72f6a Mon Sep 17 00:00:00 2001 +From 2e2c456ba495b9bb3183279af630e0b36d8e2c4e Mon Sep 17 00:00:00 2001 From: Matthew Garrett Date: Fri, 9 Mar 2012 08:39:37 -0500 Subject: [PATCH 04/14] ACPI: Limit access to custom_method @@ -284,10 +284,10 @@ index c68e72414a67..4277938af700 100644 /* parse the table header to get the table length */ if (count <= sizeof(struct acpi_table_header)) -- -1.8.5.3 +1.9.3 -From 543d64276237adb782ec30a5dab67d0b21afc1d4 Mon Sep 17 00:00:00 2001 +From e604f163f62405afdf52860295767fcfabac0b05 Mon Sep 17 00:00:00 2001 From: Matthew Garrett Date: Fri, 9 Mar 2012 08:46:50 -0500 Subject: [PATCH 05/14] asus-wmi: Restrict debugfs interface when module @@ -305,10 +305,10 @@ Signed-off-by: Matthew Garrett 1 file changed, 9 insertions(+) diff --git a/drivers/platform/x86/asus-wmi.c b/drivers/platform/x86/asus-wmi.c -index c5e082fb82fa..03c57fc8de8a 100644 +index 91ef69a52263..3e6bf9075d9f 100644 --- a/drivers/platform/x86/asus-wmi.c +++ b/drivers/platform/x86/asus-wmi.c -@@ -1595,6 +1595,9 @@ static int show_dsts(struct seq_file *m, void *data) +@@ -1594,6 +1594,9 @@ static int show_dsts(struct seq_file *m, void *data) int err; u32 retval = -1; @@ -318,7 +318,7 @@ index c5e082fb82fa..03c57fc8de8a 100644 err = asus_wmi_get_devstate(asus, asus->debug.dev_id, &retval); if (err < 0) -@@ -1611,6 +1614,9 @@ static int show_devs(struct seq_file *m, void *data) +@@ -1610,6 +1613,9 @@ static int show_devs(struct seq_file *m, void *data) int err; u32 retval = -1; @@ -328,7 +328,7 @@ index c5e082fb82fa..03c57fc8de8a 100644 err = asus_wmi_set_devstate(asus->debug.dev_id, asus->debug.ctrl_param, &retval); -@@ -1635,6 +1641,9 @@ static int show_call(struct seq_file *m, void *data) +@@ -1634,6 +1640,9 @@ static int show_call(struct seq_file *m, void *data) union acpi_object *obj; acpi_status status; @@ -339,10 +339,10 @@ index c5e082fb82fa..03c57fc8de8a 100644 1, asus->debug.method_id, &input, &output); -- -1.8.5.3 +1.9.3 -From 6e2fec5547b597c43ca72e34729b8a402660a7c1 Mon Sep 17 00:00:00 2001 +From 7a27eb92368ea62098831471625d7aadf240beaa Mon Sep 17 00:00:00 2001 From: Matthew Garrett Date: Fri, 9 Mar 2012 09:28:15 -0500 Subject: [PATCH 06/14] Restrict /dev/mem and /dev/kmem when module loading is @@ -382,10 +382,10 @@ index cdf839f9defe..c63cf93b00eb 100644 unsigned long to_write = min_t(unsigned long, count, (unsigned long)high_memory - p); -- -1.8.5.3 +1.9.3 -From 358cea0a54f726fa61839b411f3f54284d4588bf Mon Sep 17 00:00:00 2001 +From 6a2a0adbe438e500fdc6d8aa4f75f0a75250629b Mon Sep 17 00:00:00 2001 From: Josh Boyer Date: Mon, 25 Jun 2012 19:57:30 -0400 Subject: [PATCH 07/14] acpi: Ignore acpi_rsdp kernel parameter when module @@ -401,7 +401,7 @@ Signed-off-by: Josh Boyer 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/drivers/acpi/osl.c b/drivers/acpi/osl.c -index f7fd72ac69cf..ccdae1c8c386 100644 +index 147bc1b91b42..b6e63bc0671c 100644 --- a/drivers/acpi/osl.c +++ b/drivers/acpi/osl.c @@ -44,6 +44,7 @@ @@ -422,10 +422,10 @@ index f7fd72ac69cf..ccdae1c8c386 100644 #endif -- -1.8.5.3 +1.9.3 -From 89751b3ad4dea7cf5b806cd14126dd70657a9148 Mon Sep 17 00:00:00 2001 +From dc797540b1dc002300c837aed6bb9a9361502db2 Mon Sep 17 00:00:00 2001 From: Matthew Garrett Date: Fri, 9 Aug 2013 03:33:56 -0400 Subject: [PATCH 08/14] kexec: Disable at runtime if the kernel enforces module @@ -441,7 +441,7 @@ Signed-off-by: Matthew Garrett 1 file changed, 8 insertions(+) diff --git a/kernel/kexec.c b/kernel/kexec.c -index c8380ad203bc..e6eb239f567a 100644 +index 6748688813d0..d4d88984bf45 100644 --- a/kernel/kexec.c +++ b/kernel/kexec.c @@ -33,6 +33,7 @@ @@ -452,7 +452,7 @@ index c8380ad203bc..e6eb239f567a 100644 #include #include -@@ -948,6 +949,13 @@ SYSCALL_DEFINE4(kexec_load, unsigned long, entry, unsigned long, nr_segments, +@@ -946,6 +947,13 @@ SYSCALL_DEFINE4(kexec_load, unsigned long, entry, unsigned long, nr_segments, return -EPERM; /* @@ -467,10 +467,10 @@ index c8380ad203bc..e6eb239f567a 100644 * This leaves us room for future extensions. */ -- -1.8.5.3 +1.9.3 -From 31174421a7103571a1c3faf7ba27d4045e5fbc18 Mon Sep 17 00:00:00 2001 +From 093851b8593880db428c36ddd897ed7cde3c9460 Mon Sep 17 00:00:00 2001 From: Matthew Garrett Date: Tue, 3 Sep 2013 11:23:29 -0400 Subject: [PATCH 09/14] uswsusp: Disable when module loading is restricted @@ -507,10 +507,10 @@ index 98d357584cd6..efe99dee9510 100644 if (!atomic_add_unless(&snapshot_device_available, -1, 0)) { -- -1.8.5.3 +1.9.3 -From ea5cf8801db979fa7d5f90ab3faf72eb22490f9b Mon Sep 17 00:00:00 2001 +From c3017981f472b25d68ffb1cbb19760374707ecaf Mon Sep 17 00:00:00 2001 From: Matthew Garrett Date: Fri, 8 Feb 2013 11:12:13 -0800 Subject: [PATCH 10/14] x86: Restrict MSR access when module loading is @@ -552,10 +552,10 @@ index c9603ac80de5..8bef43fc3f40 100644 err = -EFAULT; break; -- -1.8.5.3 +1.9.3 -From 2985684ff78972bde7ebf1e295b52afd9bea29e0 Mon Sep 17 00:00:00 2001 +From f1ce1d6cea8ac32712f7a555c47223d5350979c2 Mon Sep 17 00:00:00 2001 From: Matthew Garrett Date: Fri, 9 Aug 2013 18:36:30 -0400 Subject: [PATCH 11/14] Add option to automatically enforce module signatures @@ -591,10 +591,10 @@ index 199f453cb4de..ec38acf00b40 100644 290/040 ALL edd_mbr_sig_buffer EDD MBR signatures 2D0/A00 ALL e820_map E820 memory map table diff --git a/arch/x86/Kconfig b/arch/x86/Kconfig -index 5b8ec0f53b57..085d5eb36361 100644 +index b660088c220d..b4229b168d4e 100644 --- a/arch/x86/Kconfig +++ b/arch/x86/Kconfig -@@ -1534,6 +1534,16 @@ config EFI_MIXED +@@ -1555,6 +1555,16 @@ config EFI_MIXED If unsure, say N. @@ -612,7 +612,7 @@ index 5b8ec0f53b57..085d5eb36361 100644 def_bool y prompt "Enable seccomp to safely compute untrusted bytecode" diff --git a/arch/x86/boot/compressed/eboot.c b/arch/x86/boot/compressed/eboot.c -index 1e6146137f8e..b00745ff398a 100644 +index 0331d765c2bb..85defaf5a27c 100644 --- a/arch/x86/boot/compressed/eboot.c +++ b/arch/x86/boot/compressed/eboot.c @@ -12,6 +12,7 @@ @@ -634,7 +634,7 @@ index 1e6146137f8e..b00745ff398a 100644 + efi_guid_t var_guid = EFI_GLOBAL_VARIABLE_GUID; + efi_status_t status; + -+ status = efi_call_phys5(sys_table->runtime->get_variable, ++ status = efi_early->call((unsigned long)sys_table->runtime->get_variable, + L"SecureBoot", &var_guid, NULL, &datasize, &sb); + + if (status != EFI_SUCCESS) @@ -644,7 +644,7 @@ index 1e6146137f8e..b00745ff398a 100644 + return 0; + + -+ status = efi_call_phys5(sys_table->runtime->get_variable, ++ status = efi_early->call((unsigned long)sys_table->runtime->get_variable, + L"SetupMode", &var_guid, NULL, &datasize, + &setup); + @@ -687,7 +687,7 @@ index 225b0988043a..90dbfb73e11f 100644 * The sentinel is set to a nonzero value (0xff) in header.S. * diff --git a/arch/x86/kernel/setup.c b/arch/x86/kernel/setup.c -index 09c76d265550..5a61d732fd5c 100644 +index 78a0e6298922..8ecfec85e527 100644 --- a/arch/x86/kernel/setup.c +++ b/arch/x86/kernel/setup.c @@ -1142,6 +1142,12 @@ void __init setup_arch(char **cmdline_p) @@ -721,7 +721,7 @@ index fc9b54eb779e..7377bc851461 100644 extern int modules_disabled; /* for sysctl */ diff --git a/kernel/module.c b/kernel/module.c -index 2b9204fe055f..2b8cc2d57c16 100644 +index 90be09d5da44..452079124fb7 100644 --- a/kernel/module.c +++ b/kernel/module.c @@ -3836,6 +3836,13 @@ void module_layout(struct module *mod, @@ -739,11 +739,11 @@ index 2b9204fe055f..2b8cc2d57c16 100644 { #ifdef CONFIG_MODULE_SIG -- -1.8.5.3 +1.9.3 -From b2e4ea728ccab2befbd5fe1bd834881a7dd8f34b Mon Sep 17 00:00:00 2001 -From: Josh Boyer +From 58bd85fa405992926e9c8c6205bda6580cc150ff Mon Sep 17 00:00:00 2001 +From: Josh Boyer Date: Tue, 5 Feb 2013 19:25:05 -0500 Subject: [PATCH 12/14] efi: Disable secure boot if shim is in insecure mode @@ -753,13 +753,13 @@ MokSBState that does not have the runtime attribute set. Given that the user explicitly disabled validation, we can honor that and not enable secure boot mode if that variable is set. -Signed-off-by: Josh Boyer +Signed-off-by: Josh Boyer --- arch/x86/boot/compressed/eboot.c | 20 +++++++++++++++++++- 1 file changed, 19 insertions(+), 1 deletion(-) diff --git a/arch/x86/boot/compressed/eboot.c b/arch/x86/boot/compressed/eboot.c -index b00745ff398a..bf42cc5f083d 100644 +index 85defaf5a27c..b4013a4ba005 100644 --- a/arch/x86/boot/compressed/eboot.c +++ b/arch/x86/boot/compressed/eboot.c @@ -812,8 +812,9 @@ out: @@ -781,7 +781,7 @@ index b00745ff398a..bf42cc5f083d 100644 + * doesn't have the runtime attribute set, we might as well honor that. + */ + var_guid = EFI_SHIM_LOCK_GUID; -+ status = efi_call_phys5(sys_table->runtime->get_variable, ++ status = efi_early->call((unsigned long)sys_table->runtime->get_variable, + L"MokSBState", &var_guid, &attr, &datasize, + &moksbstate); + @@ -798,10 +798,10 @@ index b00745ff398a..bf42cc5f083d 100644 } -- -1.8.5.3 +1.9.3 -From fb418c682d01c447d30b5591a591fdbf33b1334e Mon Sep 17 00:00:00 2001 +From 156ea92ad8cb0716fda8a4b9fe7cb21b39d0e405 Mon Sep 17 00:00:00 2001 From: Josh Boyer Date: Tue, 27 Aug 2013 13:28:43 -0400 Subject: [PATCH 13/14] efi: Make EFI_SECURE_BOOT_SIG_ENFORCE depend on EFI @@ -815,10 +815,10 @@ Signed-off-by: Josh Boyer 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/arch/x86/Kconfig b/arch/x86/Kconfig -index 085d5eb36361..3e8d398a976d 100644 +index b4229b168d4e..6b08f48417b0 100644 --- a/arch/x86/Kconfig +++ b/arch/x86/Kconfig -@@ -1535,7 +1535,8 @@ config EFI_MIXED +@@ -1556,7 +1556,8 @@ config EFI_MIXED If unsure, say N. config EFI_SECURE_BOOT_SIG_ENFORCE @@ -829,10 +829,10 @@ index 085d5eb36361..3e8d398a976d 100644 ---help--- UEFI Secure Boot provides a mechanism for ensuring that the -- -1.8.5.3 +1.9.3 -From 87bf357dd4589cfca043ec4b641b912a088b1234 Mon Sep 17 00:00:00 2001 +From 8934fb355e0be514c9735bfa3afb0d28920a0210 Mon Sep 17 00:00:00 2001 From: Josh Boyer Date: Tue, 27 Aug 2013 13:33:03 -0400 Subject: [PATCH 14/14] efi: Add EFI_SECURE_BOOT bit @@ -847,7 +847,7 @@ Signed-off-by: Josh Boyer 2 files changed, 3 insertions(+) diff --git a/arch/x86/kernel/setup.c b/arch/x86/kernel/setup.c -index 5a61d732fd5c..23fe9bf3c401 100644 +index 8ecfec85e527..5ce785fc9f05 100644 --- a/arch/x86/kernel/setup.c +++ b/arch/x86/kernel/setup.c @@ -1144,7 +1144,9 @@ void __init setup_arch(char **cmdline_p) @@ -861,10 +861,10 @@ index 5a61d732fd5c..23fe9bf3c401 100644 #endif diff --git a/include/linux/efi.h b/include/linux/efi.h -index 6c100ff0cae4..3a77a70fff27 100644 +index 41bbf8ba4ba8..e73f391fd3c8 100644 --- a/include/linux/efi.h +++ b/include/linux/efi.h -@@ -899,6 +899,7 @@ extern int __init efi_setup_pcdp_console(char *); +@@ -917,6 +917,7 @@ extern int __init efi_setup_pcdp_console(char *); #define EFI_MEMMAP 4 /* Can we use EFI memory map? */ #define EFI_64BIT 5 /* Is the firmware 64-bit? */ #define EFI_ARCH_1 6 /* First arch-specific bit */ @@ -873,5 +873,5 @@ index 6c100ff0cae4..3a77a70fff27 100644 #ifdef CONFIG_EFI /* -- -1.8.5.3 +1.9.3 diff --git a/sources b/sources index b028268..6549914 100644 --- a/sources +++ b/sources @@ -1,2 +1,3 @@ 97ca1625bb40368dc41b9a7971549071 linux-3.15.tar.xz ef8f4db937f521a7e323ec589536ba25 perf-man-3.15.tar.gz +95407bd4c78733772a0fe8dea00be3b7 patch-3.15-git1.xz diff --git a/sysrq-secure-boot.patch b/sysrq-secure-boot.patch index c73e3d2..1b13993 100644 --- a/sysrq-secure-boot.patch +++ b/sysrq-secure-boot.patch @@ -1,7 +1,7 @@ Bugzilla: N/A Upstream-status: Fedora mustard -From 29c1f71a2d0845a71ea2ebd2fb33542373dc52dd Mon Sep 17 00:00:00 2001 +From 603230771bdbca78e6530d29dbe8b239cdcc8473 Mon Sep 17 00:00:00 2001 From: Kyle McMartin Date: Fri, 30 Aug 2013 09:28:51 -0400 Subject: [PATCH] Add sysrq option to disable secure boot mode @@ -17,7 +17,7 @@ Subject: [PATCH] Add sysrq option to disable secure boot mode 7 files changed, 65 insertions(+), 10 deletions(-) diff --git a/arch/x86/kernel/setup.c b/arch/x86/kernel/setup.c -index c773add..92c480c 100644 +index 5ce785fc9f05..2024cbb7169b 100644 --- a/arch/x86/kernel/setup.c +++ b/arch/x86/kernel/setup.c @@ -70,6 +70,11 @@ @@ -32,7 +32,7 @@ index c773add..92c480c 100644 #include