[Armadeus-commitlog] armadeus branch, master, updated. armadeus-5.3-217-g30fd948
Brought to you by:
sszy
|
From: Sébastien S. <ss...@us...> - 2014-04-11 14:21:09
|
This is an automated email from the git hooks/post-receive script. It was
generated because a ref change was pushed to the repository containing
the project "armadeus".
The branch, master has been updated
via 30fd948ed6b2da5b4539928d3628f4a1bc77c951 (commit)
via d955bffcc773f46d7101bcadee79d1b2d0853bf6 (commit)
from 3c5da1522acb95b4f41facde82063b18aa389f57 (commit)
Those revisions listed above that are new to this repository have
not appeared on any other notification email; so we list those
revisions in full, below.
- Log -----------------------------------------------------------------
commit 30fd948ed6b2da5b4539928d3628f4a1bc77c951
Author: Sébastien Szymanski <ss...@us...>
Date: Fri Apr 11 16:14:34 2014 +0200
[LINUX] 3.14: apf6: dts: update device trees
- Add new devices: rtc, touchscreen controller, tft, sound.
- Make pinctrl nodes board specific. See [1].
[1] https://git.kernel.org/cgit/linux/kernel/git/next/linux-next.git/commit/arch/arm/boot/dts/imx6qdl.dtsi?id=817c27a128e18aed840adc295f988e1656fed7d1
commit d955bffcc773f46d7101bcadee79d1b2d0853bf6
Author: Sébastien Szymanski <ss...@us...>
Date: Fri Apr 11 16:13:06 2014 +0200
[LINUX] 3.14: apf6: add driver for rtc and touchscreen controller.
-----------------------------------------------------------------------
Summary of changes:
.../device/armadeus/apf6/apf6-linux-3.14.config | 10 +-
...rmadeus-add-apf6q-and-apf6dl-device-trees.patch | 460 +++++++++++++++---
...04-armadeus-add_sx8674_touchscreen_driver.patch | 516 ++++++++++++++++++++
.../0505-armadeus-add_mcp7940x_rtc_driver.patch} | 134 +++---
4 files changed, 976 insertions(+), 144 deletions(-)
create mode 100644 patches/linux/3.14/0504-armadeus-add_sx8674_touchscreen_driver.patch
copy patches/linux/{common/000-armadeus-add_mcp7940x_rtc_driver.patch => 3.14/0505-armadeus-add_mcp7940x_rtc_driver.patch} (87%)
diff --git a/buildroot/target/device/armadeus/apf6/apf6-linux-3.14.config b/buildroot/target/device/armadeus/apf6/apf6-linux-3.14.config
index 5cef7a5..5c39d1f 100644
--- a/buildroot/target/device/armadeus/apf6/apf6-linux-3.14.config
+++ b/buildroot/target/device/armadeus/apf6/apf6-linux-3.14.config
@@ -73,6 +73,7 @@ CONFIG_DEVTMPFS_MOUNT=y
# CONFIG_STANDALONE is not set
CONFIG_IMX_WEIM=y
CONFIG_CONNECTOR=y
+CONFIG_PROC_DEVICETREE=y
CONFIG_BLK_DEV_LOOP=y
CONFIG_BLK_DEV_RAM=y
CONFIG_BLK_DEV_RAM_SIZE=65536
@@ -117,7 +118,7 @@ CONFIG_KEYBOARD_IMX=y
CONFIG_MOUSE_PS2=m
CONFIG_MOUSE_PS2_ELANTECH=y
CONFIG_INPUT_TOUCHSCREEN=y
-CONFIG_TOUCHSCREEN_EGALAX=y
+CONFIG_TOUCHSCREEN_SX8674=m
CONFIG_INPUT_MISC=y
CONFIG_INPUT_MMA8450=y
CONFIG_SERIO_SERPORT=m
@@ -127,8 +128,7 @@ CONFIG_SERIAL_IMX=y
CONFIG_SERIAL_IMX_CONSOLE=y
CONFIG_SERIAL_FSL_LPUART=y
CONFIG_SERIAL_FSL_LPUART_CONSOLE=y
-CONFIG_HW_RANDOM=y
-CONFIG_HW_RANDOM_MXC_RNGA=y
+# CONFIG_HW_RANDOM is not set
# CONFIG_I2C_COMPAT is not set
CONFIG_I2C_CHARDEV=y
# CONFIG_I2C_HELPER_AUTO is not set
@@ -163,6 +163,7 @@ CONFIG_VIDEO_CODA=y
# CONFIG_DVB_TUNER_DIB0090 is not set
# CONFIG_VGA_ARB is not set
CONFIG_DRM=y
+CONFIG_FB_MODE_HELPERS=y
# CONFIG_FB_MX3 is not set
CONFIG_BACKLIGHT_LCD_SUPPORT=y
CONFIG_LCD_CLASS_DEVICE=y
@@ -215,8 +216,7 @@ CONFIG_LEDS_TRIGGER_BACKLIGHT=y
CONFIG_LEDS_TRIGGER_GPIO=y
CONFIG_RTC_CLASS=y
CONFIG_RTC_INTF_DEV_UIE_EMUL=y
-CONFIG_RTC_DRV_MC13XXX=y
-CONFIG_RTC_DRV_MXC=y
+CONFIG_RTC_DRV_MCP7940X=m
CONFIG_RTC_DRV_SNVS=y
CONFIG_DMADEVICES=y
CONFIG_IMX_SDMA=y
diff --git a/patches/linux/3.14/0450-armadeus-add-apf6q-and-apf6dl-device-trees.patch b/patches/linux/3.14/0450-armadeus-add-apf6q-and-apf6dl-device-trees.patch
index 0c87e22..ee794ef 100644
--- a/patches/linux/3.14/0450-armadeus-add-apf6q-and-apf6dl-device-trees.patch
+++ b/patches/linux/3.14/0450-armadeus-add-apf6q-and-apf6dl-device-trees.patch
@@ -1,7 +1,7 @@
-Index: linux-3.14-rc3/arch/arm/boot/dts/imx6q-apf6dev.dts
+Index: linux-3.14/arch/arm/boot/dts/imx6q-apf6dev.dts
===================================================================
--- /dev/null
-+++ linux-3.14-rc3/arch/arm/boot/dts/imx6q-apf6dev.dts
++++ linux-3.14/arch/arm/boot/dts/imx6q-apf6dev.dts
@@ -0,0 +1,28 @@
+/*
+ * Copyright 2014 Armadeus Systems
@@ -31,11 +31,11 @@ Index: linux-3.14-rc3/arch/arm/boot/dts/imx6q-apf6dev.dts
+&sata {
+ status = "okay";
+};
-Index: linux-3.14-rc3/arch/arm/boot/dts/imx6qdl-apf6.dtsi
+Index: linux-3.14/arch/arm/boot/dts/imx6qdl-apf6.dtsi
===================================================================
--- /dev/null
-+++ linux-3.14-rc3/arch/arm/boot/dts/imx6qdl-apf6.dtsi
-@@ -0,0 +1,87 @@
++++ linux-3.14/arch/arm/boot/dts/imx6qdl-apf6.dtsi
+@@ -0,0 +1,129 @@
+/*
+ * Copyright 2014 Armadeus Systems
+ *
@@ -48,6 +48,7 @@ Index: linux-3.14-rc3/arch/arm/boot/dts/imx6qdl-apf6.dtsi
+ */
+
+#include <dt-bindings/interrupt-controller/irq.h>
++#include <dt-bindings/gpio/gpio.h>
+
+/ {
+ wlan {
@@ -71,63 +72,104 @@ Index: linux-3.14-rc3/arch/arm/boot/dts/imx6qdl-apf6.dtsi
+ };
+};
+
-+&iomuxc {
++&fec {
+ pinctrl-names = "default";
-+ pinctrl-0 = <&pinctrl_hog>;
++ pinctrl-0 = <&pinctrl_enet>;
++ phy-mode = "rgmii";
++ phy-reset-gpios = <&gpio1 24 GPIO_ACTIVE_HIGH>;
++ status = "okay";
++};
+
-+ hog {
-+ pinctrl_hog: hoggrp {
++&iomuxc {
++ apf6 {
++ pinctrl_enet: enetgrp {
+ fsl,pins = <
-+ MX6QDL_PAD_SD4_DAT0__GPIO2_IO08 0x80000000 /* WL_EN */
-+ MX6QDL_PAD_SD4_DAT2__GPIO2_IO10 0x80000000 /* WL_IRQ */
-+ MX6QDL_PAD_SD4_DAT3__GPIO2_IO11 0x80000000 /* BT_EN */
++ MX6QDL_PAD_ENET_MDIO__ENET_MDIO 0x1b0b0
++ MX6QDL_PAD_ENET_MDC__ENET_MDC 0x1b0b0
++ MX6QDL_PAD_RGMII_TXC__RGMII_TXC 0x1b0b0
++ MX6QDL_PAD_RGMII_TD0__RGMII_TD0 0x1b0b0
++ MX6QDL_PAD_RGMII_TD1__RGMII_TD1 0x1b0b0
++ MX6QDL_PAD_RGMII_TD2__RGMII_TD2 0x1b0b0
++ MX6QDL_PAD_RGMII_TD3__RGMII_TD3 0x1b0b0
++ MX6QDL_PAD_RGMII_TX_CTL__RGMII_TX_CTL 0x1b0b0
++ MX6QDL_PAD_ENET_REF_CLK__ENET_TX_CLK 0x1b0b0
++ MX6QDL_PAD_RGMII_RXC__RGMII_RXC 0x1b0b0
++ MX6QDL_PAD_RGMII_RD0__RGMII_RD0 0x1b0b0
++ MX6QDL_PAD_RGMII_RD1__RGMII_RD1 0x1b0b0
++ MX6QDL_PAD_RGMII_RD2__RGMII_RD2 0x1b0b0
++ MX6QDL_PAD_RGMII_RD3__RGMII_RD3 0x1b0b0
++ MX6QDL_PAD_RGMII_RX_CTL__RGMII_RX_CTL 0x1b0b0
++ MX6QDL_PAD_ENET_TX_EN__ENET_TX_EN 0x1b0b0
++ MX6QDL_PAD_ENET_RX_ER__GPIO1_IO24 0x80000000
+ >;
+ };
+
-+ pinctrl_uart2_3: uart2grp-3 {
++ pinctrl_uart2: uart2grp {
+ fsl,pins = <
-+ MX6QDL_PAD_SD4_DAT4__UART2_RX_DATA 0x1b0b1
-+ MX6QDL_PAD_SD4_DAT5__UART2_RTS_B 0x1b0b1
-+ MX6QDL_PAD_SD4_DAT6__UART2_CTS_B 0x1b0b1
-+ MX6QDL_PAD_SD4_DAT7__UART2_TX_DATA 0x1b0b1
++ MX6QDL_PAD_SD4_DAT4__UART2_RX_DATA 0x1b0b1
++ MX6QDL_PAD_SD4_DAT5__UART2_RTS_B 0x1b0b1
++ MX6QDL_PAD_SD4_DAT6__UART2_CTS_B 0x1b0b1
++ MX6QDL_PAD_SD4_DAT7__UART2_TX_DATA 0x1b0b1
++ MX6QDL_PAD_SD4_DAT3__GPIO2_IO11 0x80000000 /* BT_EN */
+ >;
+ };
-+ };
-+};
+
-+&fec {
-+ pinctrl-names = "default";
-+ pinctrl-0 = <&pinctrl_enet_1>;
-+ phy-mode = "rgmii";
-+ status = "okay";
++ pinctrl_usdhc1: usdhc1grp {
++ fsl,pins = <
++ MX6QDL_PAD_SD1_CMD__SD1_CMD 0x17059
++ MX6QDL_PAD_SD1_CLK__SD1_CLK 0x10059
++ MX6QDL_PAD_SD1_DAT0__SD1_DATA0 0x17059
++ MX6QDL_PAD_SD1_DAT1__SD1_DATA1 0x17059
++ MX6QDL_PAD_SD1_DAT2__SD1_DATA2 0x17059
++ MX6QDL_PAD_SD1_DAT3__SD1_DATA3 0x17059
++ MX6QDL_PAD_SD4_DAT0__GPIO2_IO08 0x80000000 /* WL_EN */
++ MX6QDL_PAD_SD4_DAT2__GPIO2_IO10 0x80000000 /* WL_IRQ */
++ >;
++ };
++
++ pinctrl_usdhc3: usdhc3grp {
++ fsl,pins = <
++ MX6QDL_PAD_SD3_CMD__SD3_CMD 0x17059
++ MX6QDL_PAD_SD3_CLK__SD3_CLK 0x10059
++ MX6QDL_PAD_SD3_DAT0__SD3_DATA0 0x17059
++ MX6QDL_PAD_SD3_DAT1__SD3_DATA1 0x17059
++ MX6QDL_PAD_SD3_DAT2__SD3_DATA2 0x17059
++ MX6QDL_PAD_SD3_DAT3__SD3_DATA3 0x17059
++ MX6QDL_PAD_SD3_DAT4__SD3_DATA4 0x17059
++ MX6QDL_PAD_SD3_DAT5__SD3_DATA5 0x17059
++ MX6QDL_PAD_SD3_DAT6__SD3_DATA6 0x17059
++ MX6QDL_PAD_SD3_DAT7__SD3_DATA7 0x17059
++ >;
++ };
++ };
+};
+
+/* Bluetooth */
+&uart2 {
+ pinctrl-names = "default";
-+ pinctrl-0 = <&pinctrl_uart2_3>;
++ pinctrl-0 = <&pinctrl_uart2>;
+ status = "okay";
+};
+
+/* Wi-Fi */
+&usdhc1 {
+ pinctrl-names = "default";
-+ pinctrl-0 = <&pinctrl_usdhc1_2>;
++ pinctrl-0 = <&pinctrl_usdhc1>;
+ status = "okay";
+};
+
+/* eMMC */
+&usdhc3 {
+ pinctrl-names = "default";
-+ pinctrl-0 = <&pinctrl_usdhc3_1>;
++ pinctrl-0 = <&pinctrl_usdhc3>;
+ //non-removable;
+ status = "okay";
+};
-Index: linux-3.14-rc3/arch/arm/boot/dts/imx6qdl-apf6dev.dtsi
+Index: linux-3.14/arch/arm/boot/dts/imx6qdl-apf6dev.dtsi
===================================================================
--- /dev/null
-+++ linux-3.14-rc3/arch/arm/boot/dts/imx6qdl-apf6dev.dtsi
-@@ -0,0 +1,172 @@
++++ linux-3.14/arch/arm/boot/dts/imx6qdl-apf6dev.dtsi
+@@ -0,0 +1,434 @@
+/*
+ * Copyright 2014 Armadeus Systems
+ *
@@ -139,79 +181,184 @@ Index: linux-3.14-rc3/arch/arm/boot/dts/imx6qdl-apf6dev.dtsi
+ *
+ */
+
-+/ {
-+ regulators {
-+ compatible = "simple-bus";
++#include <dt-bindings/interrupt-controller/irq.h>
++#include <dt-bindings/gpio/gpio.h>
+
-+ reg_2p5v: 2p5v {
-+ compatible = "regulator-fixed";
-+ regulator-name = "2P5V";
-+ regulator-min-microvolt = <2500000>;
-+ regulator-max-microvolt = <2500000>;
-+ regulator-always-on;
++/ {
++ display@di0 {
++ compatible = "fsl,imx-parallel-display";
++ crtcs = <&ipu1 0>;
++ interface-pix-fmt = "bgr666";
++ pinctrl-names = "default";
++ pinctrl-0 = <&pinctrl_ipu1>;
++
++ display-timings {
++ lw700 {
++ clock-frequency = <33000033>;
++ hactive = <800>;
++ vactive = <480>;
++ hback-porch = <96>;
++ hfront-porch = <96>;
++ vback-porch = <20>;
++ vfront-porch = <21>;
++ hsync-len = <64>;
++ vsync-len = <4>;
++ hsync-active = <1>;
++ vsync-active = <1>;
++ de-active = <1>;
++ pixelclk-active = <0>;
++ };
+ };
++ };
+
-+ reg_3p3v: 3p3v {
-+ compatible = "regulator-fixed";
-+ regulator-name = "3P3V";
-+ regulator-min-microvolt = <3300000>;
-+ regulator-max-microvolt = <3300000>;
-+ regulator-always-on;
++ keys {
++ compatible = "gpio-keys";
++ pinctrl-names = "default";
++ pinctrl-0 = <&pinctrl_gpio_keys>;
++
++ user-button {
++ label = "User button";
++ gpios = <&gpio1 9 GPIO_ACTIVE_HIGH>;
++ linux,code = <100>;
+ };
+ };
+
+ leds {
+ compatible = "gpio-leds";
++ pinctrl-names = "default";
++ pinctrl-0 = <&pinctrl_gpio_leds>;
+
+ user-led {
+ label = "User LED";
-+ gpios = <&gpio7 12 0>;
++ gpios = <&gpio7 12 GPIO_ACTIVE_HIGH>;
+ linux,default-trigger = "heartbeat";
+ default-state = "on";
+ };
+ };
+
-+ keys {
-+ compatible = "gpio-keys";
++ regulators {
++ compatible = "simple-bus";
+
-+ user-button {
-+ label = "User button";
-+ gpios = <&gpio1 9 0>;
-+ linux,code = <100>;
++ reg_3p3v: 3p3v {
++ compatible = "regulator-fixed";
++ regulator-name = "3P3V";
++ regulator-min-microvolt = <3300000>;
++ regulator-max-microvolt = <3300000>;
++ regulator-always-on;
++ };
++
++ reg_usbh1_vbus: usb-h1-vbus {
++ compatible = "regulator-fixed";
++ regulator-name = "usb_h1_vbus";
++ regulator-min-microvolt = <5000000>;
++ regulator-max-microvolt = <5000000>;
++ regulator-always-on;
++ };
++
++ reg_otg_vbus: usb-otg-vbus {
++ compatible = "regulator-fixed";
++ regulator-name = "usb_otg_vbus";
++ regulator-min-microvolt = <5000000>;
++ regulator-max-microvolt = <5000000>;
++ regulator-always-on;
+ };
+ };
++
++ sound {
++ compatible = "fsl,imx6-armadeus-sgtl5000",
++ "fsl,imx-audio-sgtl5000";
++ model = "imx6-armadeus-sgtl5000";
++ ssi-controller = <&ssi1>;
++ audio-codec = <&codec>;
++ audio-routing =
++ "MIC_IN", "Mic Jack",
++ "Mic Jack", "Mic Bias",
++ "Headphone Jack", "HP_OUT";
++ mux-int-port = <1>;
++ mux-ext-port = <3>;
++ };
++
++ sound-spdif {
++ compatible = "fsl,imx-audio-spdif";
++ model = "imx-spdif";
++ spdif-controller = <&spdif>;
++ spdif-out;
++ };
++};
++
++&audmux {
++ pinctrl-names = "default";
++ pinctrl-0 = <&pinctrl_audmux>;
++ status = "okay";
+};
+
+&can2 {
+ pinctrl-names = "default";
-+ pinctrl-0 = <&pinctrl_flexcan2_1>;
++ pinctrl-0 = <&pinctrl_flexcan2>;
+ status = "okay";
+};
+
+&ecspi1 {
+ pinctrl-names = "default";
-+ pinctrl-0 = <&pinctrl_ecspi1_2>;
++ pinctrl-0 = <&pinctrl_ecspi1>;
+ fsl,spi-num-chipselects = <3>;
-+ cs-gpios = <&gpio4 9 0>, <&gpio4 10 0>, <&gpio4 11 0>;
++ cs-gpios = <&gpio4 9 GPIO_ACTIVE_HIGH>,
++ <&gpio4 10 GPIO_ACTIVE_HIGH>,
++ <&gpio4 11 GPIO_ACTIVE_HIGH>;
+ status = "okay";
+};
+
+&hdmi {
-+ ddc = <&i2c1>;
++ ddc = <&i2c3>;
+ status = "okay";
+};
+
+&i2c1 {
-+ clock-frequency = <100000>;
++ clock-frequency = <400000>;
+ pinctrl-names = "default";
-+ pinctrl-0 = <&pinctrl_i2c1_1>;
++ pinctrl-0 = <&pinctrl_i2c1>;
+ status = "okay";
++
++ touchscreen@48 {
++ compatible = "semtech,sx8654";
++ reg = <0x48>;
++ pinctrl-names = "default";
++ pinctrl-0 = <&pinctrl_touchscreen>;
++ interrupt-parent = <&gpio6>;
++ interrupts = <3 IRQ_TYPE_EDGE_FALLING>;
++ x-plate-ohms = <1100>;
++ y-plate-ohms = <500>;
++ min-x = <0>;
++ max-x = <800>;
++ min-y = <0>;
++ max-y = <480>;
++ };
+};
+
+&i2c2 {
-+ clock-frequency = <100000>;
++ clock-frequency = <400000>;
++ pinctrl-names = "default";
++ pinctrl-0 = <&pinctrl_i2c2>;
++ status = "okay";
++
++ rtc@6f {
++ compatible = "microchip,mcp7940x-rtc";
++ reg = <0x6F>;
++ };
++
++ codec: sgtl5000@0a {
++ compatible = "fsl,sgtl5000";
++ reg = <0x0a>;
++ clocks = <&clks 201>;
++ VDDA-supply = <®_3p3v>;
++ VDDIO-supply = <®_3p3v>;
++ };
++};
++
++&i2c3 {
++ clock-frequency = <400000>;
+ pinctrl-names = "default";
-+ pinctrl-0 = <&pinctrl_i2c2_2>;
++ pinctrl-0 = <&pinctrl_i2c3>;
+ status = "okay";
+};
+
@@ -222,16 +369,129 @@ Index: linux-3.14-rc3/arch/arm/boot/dts/imx6qdl-apf6dev.dtsi
+ hog {
+ pinctrl_hog: hoggrp {
+ fsl,pins = <
-+ MX6QDL_PAD_GPIO_9__GPIO1_IO09 0x80000000
-+ MX6QDL_PAD_GPIO_17__GPIO7_IO12 0x80000000
++ MX6QDL_PAD_DISP0_DAT18__GPIO5_IO12 0x80000000
++ MX6QDL_PAD_DISP0_DAT19__GPIO5_IO13 0x80000000
++ MX6QDL_PAD_DISP0_DAT20__GPIO5_IO14 0x80000000
++ MX6QDL_PAD_DISP0_DAT21__GPIO5_IO15 0x80000000
++ MX6QDL_PAD_DISP0_DAT22__GPIO5_IO16 0x80000000
++ MX6QDL_PAD_DISP0_DAT23__GPIO5_IO17 0x80000000
++ MX6QDL_PAD_CSI0_PIXCLK__GPIO5_IO18 0x80000000
++ MX6QDL_PAD_CSI0_MCLK__GPIO5_IO19 0x80000000
++ MX6QDL_PAD_CSI0_DATA_EN__GPIO5_IO20 0x80000000
++ MX6QDL_PAD_CSI0_VSYNC__GPIO5_IO21 0x80000000
++ >;
++ };
++ };
++
++ apf6dev {
++ pinctrl_audmux: audmuxgrp {
++ fsl,pins = <
++ MX6QDL_PAD_CSI0_DAT7__AUD3_RXD 0x80000000
++ MX6QDL_PAD_CSI0_DAT4__AUD3_TXC 0x80000000
++ MX6QDL_PAD_CSI0_DAT5__AUD3_TXD 0x80000000
++ MX6QDL_PAD_CSI0_DAT6__AUD3_TXFS 0x80000000
++ MX6QDL_PAD_GPIO_0__CCM_CLKO1 0x130b0
++ >;
++ };
++
++ pinctrl_ecspi1: ecspi1grp {
++ fsl,pins = <
++ MX6QDL_PAD_KEY_COL1__ECSPI1_MISO 0x100b1
++ MX6QDL_PAD_KEY_ROW0__ECSPI1_MOSI 0x100b1
++ MX6QDL_PAD_KEY_COL0__ECSPI1_SCLK 0x100b1
++ MX6QDL_PAD_KEY_ROW1__GPIO4_IO09 0x80000000
++ MX6QDL_PAD_KEY_ROW2__GPIO4_IO11 0x80000000
++ MX6QDL_PAD_KEY_COL2__GPIO4_IO10 0x80000000
++ >;
++ };
++
++ pinctrl_flexcan2: flexcan2grp {
++ fsl,pins = <
++ MX6QDL_PAD_KEY_COL4__FLEXCAN2_TX 0x80000000
++ MX6QDL_PAD_KEY_ROW4__FLEXCAN2_RX 0x80000000
++ >;
++ };
++
++ pinctrl_gpio_keys: gpiokeysgrp {
++ fsl,pins = <
++ MX6QDL_PAD_GPIO_9__GPIO1_IO09 0x80000000
++ >;
++ };
++ pinctrl_gpio_leds: gpioledsgrp {
++ fsl,pins = <
++ MX6QDL_PAD_GPIO_17__GPIO7_IO12 0x80000000
++ >;
++ };
++
++ pinctrl_i2c1: i2c1grp {
++ fsl,pins = <
++ MX6QDL_PAD_CSI0_DAT8__I2C1_SDA 0x4001b8b1
++ MX6QDL_PAD_CSI0_DAT9__I2C1_SCL 0x4001b8b1
++ >;
++ };
++
++ pinctrl_i2c2: i2c2grp {
++ fsl,pins = <
++ MX6QDL_PAD_KEY_COL3__I2C2_SCL 0x4001b8b1
++ MX6QDL_PAD_KEY_ROW3__I2C2_SDA 0x4001b8b1
++ >;
++ };
++
++ pinctrl_i2c3: i2c3grp {
++ fsl,pins = <
++ MX6QDL_PAD_GPIO_6__I2C3_SDA 0x4001b8b1
++ MX6QDL_PAD_GPIO_5__I2C3_SCL 0x4001b8b1
++ >;
++ };
++
++ pinctrl_ipu1: ipu1grp {
++ fsl,pins = <
++ MX6QDL_PAD_DI0_DISP_CLK__IPU1_DI0_DISP_CLK 0x10
++ MX6QDL_PAD_DI0_PIN15__IPU1_DI0_PIN15 0x10
++ MX6QDL_PAD_DI0_PIN2__IPU1_DI0_PIN02 0x10
++ MX6QDL_PAD_DI0_PIN3__IPU1_DI0_PIN03 0x10
++ MX6QDL_PAD_DI0_PIN4__IPU1_DI0_PIN04 0x80000000
++ MX6QDL_PAD_DISP0_DAT0__IPU1_DISP0_DATA00 0x10
++ MX6QDL_PAD_DISP0_DAT1__IPU1_DISP0_DATA01 0x10
++ MX6QDL_PAD_DISP0_DAT2__IPU1_DISP0_DATA02 0x10
++ MX6QDL_PAD_DISP0_DAT3__IPU1_DISP0_DATA03 0x10
++ MX6QDL_PAD_DISP0_DAT4__IPU1_DISP0_DATA04 0x10
++ MX6QDL_PAD_DISP0_DAT5__IPU1_DISP0_DATA05 0x10
++ MX6QDL_PAD_DISP0_DAT6__IPU1_DISP0_DATA06 0x10
++ MX6QDL_PAD_DISP0_DAT7__IPU1_DISP0_DATA07 0x10
++ MX6QDL_PAD_DISP0_DAT8__IPU1_DISP0_DATA08 0x10
++ MX6QDL_PAD_DISP0_DAT9__IPU1_DISP0_DATA09 0x10
++ MX6QDL_PAD_DISP0_DAT10__IPU1_DISP0_DATA10 0x10
++ MX6QDL_PAD_DISP0_DAT11__IPU1_DISP0_DATA11 0x10
++ MX6QDL_PAD_DISP0_DAT12__IPU1_DISP0_DATA12 0x10
++ MX6QDL_PAD_DISP0_DAT13__IPU1_DISP0_DATA13 0x10
++ MX6QDL_PAD_DISP0_DAT14__IPU1_DISP0_DATA14 0x10
++ MX6QDL_PAD_DISP0_DAT15__IPU1_DISP0_DATA15 0x10
++ MX6QDL_PAD_DISP0_DAT16__IPU1_DISP0_DATA16 0x10
++ MX6QDL_PAD_DISP0_DAT17__IPU1_DISP0_DATA17 0x10
++ >;
++ };
++
++ pinctrl_pcie: pciegrp {
++ fsl,pins = <
+ MX6QDL_PAD_CSI0_DAT16__GPIO6_IO02 0x80000000
-+ MX6QDL_PAD_KEY_ROW1__GPIO4_IO09 0x80000000
-+ MX6QDL_PAD_KEY_ROW2__GPIO4_IO11 0x80000000
-+ MX6QDL_PAD_KEY_COL2__GPIO4_IO10 0x80000000
+ >;
+ };
+
-+ pinctrl_uart3_3: uart3grp-3 {
++ pinctrl_pwm3: pwm3grp {
++ fsl,pins = <
++ MX6QDL_PAD_SD4_DAT1__PWM3_OUT 0x1b0b1
++ >;
++ };
++
++ pinctrl_uart1: uart1grp {
++ fsl,pins = <
++ MX6QDL_PAD_CSI0_DAT10__UART1_TX_DATA 0x1b0b1
++ MX6QDL_PAD_CSI0_DAT11__UART1_RX_DATA 0x1b0b1
++ >;
++ };
++
++ pinctrl_uart3: uart3grp {
+ fsl,pins = <
+ MX6QDL_PAD_EIM_D23__UART3_CTS_B 0x1b0b1
+ MX6QDL_PAD_EIM_D24__UART3_TX_DATA 0x1b0b1
@@ -240,55 +500,88 @@ Index: linux-3.14-rc3/arch/arm/boot/dts/imx6qdl-apf6dev.dtsi
+ >;
+ };
+
-+ pinctrl_uart4_2: uart4grp-2 {
++ pinctrl_uart4: uart4grp {
+ fsl,pins = <
+ MX6QDL_PAD_CSI0_DAT13__UART4_TX_DATA 0x1b0b1
+ MX6QDL_PAD_CSI0_DAT13__UART4_RX_DATA 0x1b0b1
+ >;
+ };
++
++ pinctrl_usbotg: usbotggrp {
++ fsl,pins = <
++ MX6QDL_PAD_GPIO_1__USB_OTG_ID 0x17059
++ >;
++ };
++
++ pinctrl_usdhc2: usdhc2grp {
++ fsl,pins = <
++ MX6QDL_PAD_SD2_CMD__SD2_CMD 0x17059
++ MX6QDL_PAD_SD2_CLK__SD2_CLK 0x10059
++ MX6QDL_PAD_SD2_DAT0__SD2_DATA0 0x17059
++ MX6QDL_PAD_SD2_DAT1__SD2_DATA1 0x17059
++ MX6QDL_PAD_SD2_DAT2__SD2_DATA2 0x17059
++ MX6QDL_PAD_SD2_DAT3__SD2_DATA3 0x17059
++ >;
++ };
++
++ pinctrl_spdif: spdifgrp {
++ fsl,pins = <
++ MX6QDL_PAD_GPIO_19__SPDIF_OUT 0x1b0b0
++ >;
++ };
++
++ pinctrl_touchscreen: touchscreengrp {
++ fsl,pins = <
++ MX6QDL_PAD_CSI0_DAT17__GPIO6_IO03 0x80000000
++ >;
++ };
+ };
+};
+
+&pcie {
-+ reset-gpio = <&gpio6 2 0>;
++ pinctrl-names = "default";
++ pinctrl-0 = <&pinctrl_pcie>;
++ reset-gpio = <&gpio6 2 GPIO_ACTIVE_HIGH>;
+ status = "okay";
+};
+
+&pwm3 {
+ pinctrl-names = "default";
-+ pinctrl-0 = <&pinctrl_pwm3_1>;
++ pinctrl-0 = <&pinctrl_pwm3>;
+ status = "okay";
+};
+
+/* GPS */
+&uart1 {
+ pinctrl-names = "default";
-+ pinctrl-0 = <&pinctrl_uart1_1>;
++ pinctrl-0 = <&pinctrl_uart1>;
+ status = "okay";
+};
+
+/* GSM */
+&uart3 {
+ pinctrl-names = "default";
-+ pinctrl-0 = <&pinctrl_uart3_3>;
++ pinctrl-0 = <&pinctrl_uart3>;
+ status = "okay";
+};
+
+/* console */
+&uart4 {
+ pinctrl-names = "default";
-+ pinctrl-0 = <&pinctrl_uart4_2>;
++ pinctrl-0 = <&pinctrl_uart4>;
+ status = "okay";
+};
+
+&usbh1 {
++ vbus-supply = <®_usbh1_vbus>;
++ dr_mode = "host";
+ status = "okay";
+};
+
+&usbotg {
+ pinctrl-names = "default";
-+ pinctrl-0 = <&pinctrl_usbotg_1>;
-+ disable-over-current;
++ pinctrl-0 = <&pinctrl_usbotg>;
++ vbus-supply = <®_otg_vbus>;
+ dr_mode = "otg";
+ status = "okay";
+};
@@ -296,14 +589,25 @@ Index: linux-3.14-rc3/arch/arm/boot/dts/imx6qdl-apf6dev.dtsi
+/* microSD */
+&usdhc2 {
+ pinctrl-names = "default";
-+ pinctrl-0 = <&pinctrl_usdhc2_2>;
-+ cd-gpios = <&gpio1 2 0>;
++ pinctrl-0 = <&pinctrl_usdhc2>;
++ cd-gpios = <&gpio1 2 GPIO_ACTIVE_HIGH>;
++ status = "okay";
++};
++
++&spdif {
++ pinctrl-names = "default";
++ pinctrl-0 = <&pinctrl_spdif>;
++ status = "okay";
++};
++
++&ssi1 {
++ fsl,mode = "i2s-slave";
+ status = "okay";
+};
-Index: linux-3.14-rc3/arch/arm/boot/dts/imx6dl-apf6dev.dts
+Index: linux-3.14/arch/arm/boot/dts/imx6dl-apf6dev.dts
===================================================================
--- /dev/null
-+++ linux-3.14-rc3/arch/arm/boot/dts/imx6dl-apf6dev.dts
++++ linux-3.14/arch/arm/boot/dts/imx6dl-apf6dev.dts
@@ -0,0 +1,24 @@
+/*
+ * Copyright 2014 Armadeus Systems
diff --git a/patches/linux/3.14/0504-armadeus-add_sx8674_touchscreen_driver.patch b/patches/linux/3.14/0504-armadeus-add_sx8674_touchscreen_driver.patch
new file mode 100644
index 0000000..36be0f4
--- /dev/null
+++ b/patches/linux/3.14/0504-armadeus-add_sx8674_touchscreen_driver.patch
@@ -0,0 +1,516 @@
+Index: linux-3.14/drivers/input/touchscreen/Kconfig
+===================================================================
+--- linux-3.14.orig/drivers/input/touchscreen/Kconfig
++++ linux-3.14/drivers/input/touchscreen/Kconfig
+@@ -944,6 +944,17 @@ config TOUCHSCREEN_TPS6507X
+ To compile this driver as a module, choose M here: the
+ module will be called tps6507x_ts.
+
++config TOUCHSCREEN_SX8674
++ tristate "Semtech SX8674 touchscreen controllers"
++ depends on I2C
++ help
++ Say Y here if you have a Semtech SX8674 touchscreen controller.
++
++ If unsure, say N
++
++ To compile this driver as a module, choose M here: the
++ module will be called sx8674.
++
+ config TOUCHSCREEN_ZFORCE
+ tristate "Neonode zForce infrared touchscreens"
+ depends on I2C
+Index: linux-3.14/drivers/input/touchscreen/Makefile
+===================================================================
+--- linux-3.14.orig/drivers/input/touchscreen/Makefile
++++ linux-3.14/drivers/input/touchscreen/Makefile
+@@ -55,6 +55,7 @@ obj-$(CONFIG_TOUCHSCREEN_S3C2410) += s3c
+ obj-$(CONFIG_TOUCHSCREEN_ST1232) += st1232.o
+ obj-$(CONFIG_TOUCHSCREEN_STMPE) += stmpe-ts.o
+ obj-$(CONFIG_TOUCHSCREEN_SUR40) += sur40.o
++obj-$(CONFIG_TOUCHSCREEN_SX8674) += sx8674.o
+ obj-$(CONFIG_TOUCHSCREEN_TI_AM335X_TSC) += ti_am335x_tsc.o
+ obj-$(CONFIG_TOUCHSCREEN_TNETV107X) += tnetv107x-ts.o
+ obj-$(CONFIG_TOUCHSCREEN_TOUCHIT213) += touchit213.o
+Index: linux-3.14/drivers/input/touchscreen/sx8674.c
+===================================================================
+--- /dev/null
++++ linux-3.14/drivers/input/touchscreen/sx8674.c
+@@ -0,0 +1,477 @@
++/*
++ * drivers/input/touchscreen/sx8674.c
++ *
++ * Copyright (c) 2014 ARMadeus Systems
++ * Sébastien Szymanski <seb...@ar...>
++ *
++ *
++ * Using code from:
++ * - sx865x.c
++ * Copyright (c) 2013 U-MoBo Srl
++ * Pierluigi Passaro <p.p...@u-...>
++ * - sx8650.c
++ * Copyright (c) 2009 Wayne Roberts
++ * - tsc2007.c
++ * Copyright (c) 2008 Kwangwoo Lee
++ * - ads7846.c
++ * Copyright (c) 2005 David Brownell
++ * Copyright (c) 2006 Nokia Corporation
++ * - corgi_ts.c
++ * Copyright (C) 2004-2005 Richard Purdie
++ * - omap_ts.[hc], ads7846.h, ts_osk.c
++ * Copyright (C) 2002 MontaVista Software
++ * Copyright (C) 2004 Texas Instruments
++ * Copyright (C) 2005 Dirk Behme
++ *
++ * This program is free software; you can redistribute it and/or modify
++ * it under the terms of the GNU General Public License version 2 as
++ * published by the Free Software Foundation.
++ */
++
++#include <linux/i2c.h>
++#include <linux/init.h>
++#include <linux/input.h>
++#include <linux/interrupt.h>
++#include <linux/irq.h>
++#include <linux/module.h>
++#include <linux/of_irq.h>
++#include <linux/slab.h>
++
++/* analog channels */
++#define CH_X 0
++#define CH_Y 1
++#define CH_Z1 2
++#define CH_Z2 3
++#define CH_RX 5
++#define CH_RY 6
++
++/* commands */
++#define CMD_READ_REGISTER 0x40
++#define CMD_PENTRG 0xe0
++
++/* register addresses */
++#define I2C_REG_TOUCH0 0x00
++#define I2C_REG_TOUCH1 0x01
++#define I2C_REG_TOUCH2 0x02
++#define I2C_REG_TOUCH3 0x03
++#define I2C_REG_CHANMASK 0x04
++#define I2C_REG_IRQMASK 0x22
++#define I2C_REG_IRQSRC 0x23
++#define I2C_REG_STAT 0x24
++#define I2C_REG_SOFTRESET 0x3f
++
++/* value for I2C_REG_SOFTRESET */
++#define SOFTRESET_VALUE 0xde
++
++/* bits for I2C_REG_IRQSRC */
++#define IRQ_HAPTSHORT (1 << 7)
++#define IRQ_PROXCLOSE (1 << 6)
++#define IRQ_PROXFAR_CONVDONE (1 << 5)
++#define IRQ_PROXCOMPDONE (1 << 4)
++#define IRQ_PENTOUCH_TOUCHCONVDONE (1 << 3)
++#define IRQ_PENRELEASE (1 << 2)
++#define IRQ_TEMPWARNING (1 << 1)
++#define IRQ_TEMPALARM (1 << 0)
++
++/* bits for RegTouch1 */
++#define CONDIRQ 0x20
++#define FILT_NONE 0x00 /* no averaging */
++#define FILT_3SA 0x01 /* 3 sample averaging */
++#define FILT_5SA 0x02 /* 5 sample averaging */
++#define FILT_7SA 0x03 /* 7 samples, sort, then average of 3 middle samples */
++
++/* bits for I2C_REG_CHANMASK */
++#define CONV_X 0x80
++#define CONV_Y 0x40
++#define CONV_Z1 0x20
++#define CONV_Z2 0x10
++#define CONV_AUX 0x08
++#define CONV_RX 0x04
++#define CONV_RY 0x02
++
++/* cordinantes rate: higher nibble of CTRL0 register */
++#define RATE_MANUAL 0x00
++#define RATE_10CPS 0x10
++#define RATE_20CPS 0x20
++#define RATE_40CPS 0x30
++#define RATE_60CPS 0x40
++#define RATE_80CPS 0x50
++#define RATE_100CPS 0x60
++#define RATE_200CPS 0x70
++#define RATE_300CPS 0x80
++#define RATE_400CPS 0x90
++#define RATE_500CPS 0xa0
++#define RATE_1000CPS 0xb0
++#define RATE_2000CPS 0xc0
++#define RATE_3000CPS 0xd0
++#define RATE_4000CPS 0xe0
++#define RATE_5000CPS 0xf0
++
++/* power delay: lower nibble of CTRL0 register */
++#define POWDLY_IMMEDIATE 0x00
++#define POWDLY_1_1US 0x01
++#define POWDLY_2_2US 0x02
++#define POWDLY_4_4US 0x03
++#define POWDLY_8_9US 0x04
++#define POWDLY_17_8US 0x05
++#define POWDLY_35_5US 0x06
++#define POWDLY_71US 0x07
++#define POWDLY_140US 0x08
++#define POWDLY_280US 0x09
++#define POWDLY_570US 0x0a
++#define POWDLY_1_1MS 0x0b
++#define POWDLY_2_3MS 0x0c
++#define POWDLY_4_6MS 0x0d
++#define POWDLY_9MS 0x0e
++#define POWDLY_18MS 0x0f
++
++#define MAX_12BIT ((1 << 12) - 1)
++
++/* when changing the channel mask, also change the read length appropriately */
++#define CHAN_SINGLETOUCH_MASK (CONV_X | CONV_Y | CONV_Z1 | CONV_Z2)
++#define CHAN_MULTITOUCH_MASK (CHAN_SINGLETOUCH_MASK | CONV_RX | CONV_RY)
++#define NUM_SINGLETOUCH_CHANS 4
++#define NUM_MULTITOUCH_CHANS 6
++#define NUM_MAX_CHANS NUM_MULTITOUCH_CHANS
++#define CHAN_READ_LENGTH(chans) (chans << 1)
++
++#define SX_MULTITOUCH 0x01
++#define SX_PROXIMITY_SENSING 0x02
++#define SX_HAPTICS_GENERIC 0x04
++#define SX_HAPTICS_IMMERSION 0x08
++
++struct ts_event {
++ u16 x, y;
++ u16 z1, z2;
++ u16 rx, ry;
++};
++
++struct sx8674 {
++ struct input_dev *input;
++ struct ts_event tc;
++
++ struct i2c_client *client;
++
++ struct workqueue_struct *ts_workq;
++ struct delayed_work pen_event_work;
++
++ u16 features;
++ u16 x_plate_ohms;
++ u16 y_plate_ohms;
++
++ int irq;
++};
++
++static const struct i2c_device_id sx8674_idtable[] = {
++ { "sx8654", SX_PROXIMITY_SENSING | SX_HAPTICS_GENERIC },
++ { "sx8674", SX_MULTITOUCH | SX_PROXIMITY_SENSING | SX_HAPTICS_GENERIC },
++ { /* sentinel */ }
++};
++MODULE_DEVICE_TABLE(i2c, sx8674_idtable);
++
++static int sx8674_read_values(struct sx8674 *ts)
++{
++ s32 data;
++ u16 vals[NUM_MAX_CHANS+1]; // +1 for last dummy read
++ int length, chan_read_length;
++ int i;
++
++ memset(&(ts->tc), 0, sizeof(ts->tc));
++ /* The protocol and raw data format from i2c interface:
++ * S Addr R A [DataLow] A [DataHigh] A (repeat) NA P
++ * Where DataLow has (channel | [D11-D8]), DataHigh has [D7-D0].
++ */
++ if (ts->features & SX_MULTITOUCH)
++ chan_read_length = CHAN_READ_LENGTH(NUM_MULTITOUCH_CHANS);
++ else
++ chan_read_length = CHAN_READ_LENGTH(NUM_SINGLETOUCH_CHANS);
++
++ length = i2c_master_recv(ts->client, (char *)vals, chan_read_length);
++
++ if (likely(length == chan_read_length)) {
++ length >>= 1;
++ for (i = 0; i < length; i++) {
++ u16 ch;
++ data = swab16(vals[i]);
++ if (unlikely(data & 0x8000)) {
++ dev_err(&ts->client->dev, "hibit @ %d [0x%04x]\n", i, data);
++ return -EAGAIN;
++ }
++ ch = data >> 12;
++ if (ch == CH_X)
++ ts->tc.x = data & 0xfff;
++ else if (ch == CH_Y)
++ ts->tc.y = data & 0xfff;
++ else if (ch == CH_Z1)
++ ts->tc.z1 = data & 0xfff;
++ else if (ch == CH_Z2)
++ ts->tc.z2 = data & 0xfff;
++ else if (ch == CH_RX)
++ ts->tc.rx = data & 0xfff;
++ else if (ch == CH_RY)
++ ts->tc.ry = data & 0xfff;
++ else
++ dev_err(&ts->client->dev, "? CH%d %x\n", ch, data & 0xfff);
++ }
++ } else
++ dev_err(&ts->client->dev, "%d = recv()\n", length);
++
++ dev_dbg(&ts->client->dev, "X:%d Y:%d Z1:%d Z2:%d RX:%d RY:%d\n",
++ ts->tc.x, ts->tc.y, ts->tc.z1, ts->tc.z2, ts->tc.rx, ts->tc.ry);
++ dev_dbg(&ts->client->dev, "X+:%d Y+:%d X-:%d Y-:%d\n",
++ ts->tc.x+ts->tc.rx, ts->tc.y+ts->tc.ry, ts->tc.x-ts->tc.rx, ts->tc.y-ts->tc.ry);
++
++ return !ts->tc.z1; /* return 0 only if pressure not 0 */
++}
++
++static void sx8674_pen_irq_worker(struct work_struct *work)
++{
++ struct sx8674 *ts = container_of(work, struct sx8674, pen_event_work.work);
++ u8 irqsrc;
++
++ dev_dbg(&ts->client->dev, "%s\n", __func__);
++
++ irqsrc = i2c_smbus_read_byte_data(ts->client, CMD_READ_REGISTER | I2C_REG_IRQSRC);
++ dev_dbg(&ts->client->dev, "irqsrc: 0x%x", irqsrc);
++
++ if (irqsrc & IRQ_PENRELEASE) {
++ dev_dbg(&ts->client->dev, "pen release interrupt");
++ input_report_key(ts->input, BTN_TOUCH, 0);
++ input_sync(ts->input);
++ }
++
++ if (irqsrc & IRQ_PENTOUCH_TOUCHCONVDONE) {
++ dev_dbg(&ts->client->dev, "pen touch interrupt");
++
++ sx8674_read_values(ts);
++
++ input_report_abs(ts->input, ABS_X, ts->tc.x);
++ input_report_abs(ts->input, ABS_Y, ts->tc.y);
++ input_report_key(ts->input, BTN_TOUCH, 1);
++ input_sync(ts->input);
++
++ dev_dbg(&ts->client->dev, "point(%4d,%4d), pressure (%4u)\n", ts->tc.x, ts->tc.y, 0);
++ }
++}
++
++static irqreturn_t sx8674_irq(int irq, void *handle)
++{
++ struct sx8674 *ts = handle;
++
++ /* the reading of the samples can be time-consuming if using
++ * a slow i2c, so the work is done in a queue */
++ queue_delayed_work(ts->ts_workq, &ts->pen_event_work, 0);
++
++ return IRQ_HANDLED;
++}
++
++static int get_rmsel(u16 plate_ohms)
++{
++ int rmsel;
++
++ if (plate_ohms < 187)
++ rmsel = 0;
++ else if (plate_ohms < 312)
++ rmsel = 1;
++ else if (plate_ohms < 938)
++ rmsel = 2;
++ else if (plate_ohms < 1875)
++ rmsel = 3;
++ else if (plate_ohms < 4375)
++ rmsel = 4;
++ else if (plate_ohms < 9375)
++ rmsel = 5;
++ else if (plate_ohms < 18780)
++ rmsel = 6;
++ else
++ rmsel = 7;
++
++ return rmsel;
++}
++
++static int sx8674_parse_dt(struct device *dev, struct sx8674 *ts) {
++ struct device_node *node;
++
++ if (!dev || !ts)
++ return -ENOENT;
++
++ node = dev->of_node;
++ if (!node)
++ return -ENOENT;
++
++ ts->irq = irq_of_parse_and_map(node, 0);
++ if (!ts->irq)
++ return -EINVAL;
++
++ if(of_property_read_u16(node, "x-plate-ohms", &ts->x_plate_ohms))
++ return -EINVAL;
++
++ if(of_property_read_u16(node, "y-plate-ohms", &ts->y_plate_ohms))
++ return -EINVAL;
++
++ return 0;
++}
++
++static int sx8674_probe(struct i2c_client *client,
++ const struct i2c_device_id *id)
++{
++ struct sx8674 *ts;
++ struct input_dev *input_dev;
++ int err;
++ u16 rmselx, rmsely;
++
++ if (!i2c_check_functionality(client->adapter,
++ I2C_FUNC_SMBUS_READ_WORD_DATA))
++ return -EIO;
++
++ ts = devm_kzalloc(&client->dev, sizeof(struct sx8674), GFP_KERNEL);
++ input_dev = devm_input_allocate_device(&client->dev);
++ if (!ts || !input_dev)
++ return -ENOMEM;
++
++ err = sx8674_parse_dt(&client->dev, ts);
++ if (err)
++ return err;
++
++ ts->client = client;
++ i2c_set_clientdata(client, ts);
++
++ ts->input = input_dev;
++
++ ts->features = id->driver_data;
++
++ input_dev->name = "SX8674 Touchscreen";
++ input_dev->id.bustype = BUS_I2C;
++ input_dev->dev.parent = &client->dev;
++ input_set_drvdata(input_dev, ts);
++
++ __set_bit(EV_ABS, input_dev->evbit);
++ __set_bit(EV_KEY, input_dev->evbit);
++ __set_bit(BTN_TOUCH, input_dev->keybit);
++ __set_bit(INPUT_PROP_DIRECT, input_dev->propbit);
++
++ input_set_abs_params(input_dev, ABS_X, 0, MAX_12BIT, 0, 0);
++ input_set_abs_params(input_dev, ABS_Y, 0, MAX_12BIT, 0, 0);
++ /* TODO */
++ /*input_set_abs_params(input_dev, ABS_PRESSURE, 0, MAX_12BIT, 0, 0);*/
++
++ err = i2c_smbus_write_byte_data(client, I2C_REG_SOFTRESET,
++ SOFTRESET_VALUE);
++ if (err < 0) {
++ dev_err(&client->dev, "writing softreset value failed");
++ return -EIO;
++ }
++
++ if (ts->features & SX_MULTITOUCH) {
++ input_set_abs_params(input_dev, ABS_MT_POSITION_X, 0, MAX_12BIT, 0, 0);
++ input_set_abs_params(input_dev, ABS_MT_POSITION_Y, 0, MAX_12BIT, 0, 0);
++ input_set_abs_params(input_dev, ABS_MT_PRESSURE, 0, MAX_12BIT, 0, 0);
++ input_set_abs_params(input_dev, ABS_MT_TRACKING_ID, 0, 1, 0, 0);
++
++ /* set mask to convert X, Y, Z1, Z2, RX, RY for CH_SEQ */
++ err = i2c_smbus_write_byte_data(client, I2C_REG_CHANMASK,
++ CHAN_MULTITOUCH_MASK);
++ if (err < 0) {
++ dev_err(&client->dev, "writing to I2C_REG_CHANMASK failed");
++ return -EIO;
++ }
++
++ if (ts->x_plate_ohms < 100)
++ ts->x_plate_ohms = 100;
++ if (ts->y_plate_ohms < 100)
++ ts->y_plate_ohms = 100;
++ rmselx = get_rmsel(ts->x_plate_ohms);
++ rmsely = get_rmsel(ts->y_plate_ohms);
++
++ err = i2c_smbus_write_byte_data(client, I2C_REG_TOUCH3,
++ (rmsely << 3) | rmselx);
++ if (err < 0) {
++ dev_err(&client->dev, "writing to I2C_REG_TOUCH3 failed");
++ return -EIO;
++ }
++ } else {
++ /* set mask to convert X, Y, Z1, Z2 for CH_SEQ */
++ err = i2c_smbus_write_byte_data(client, I2C_REG_CHANMASK, CHAN_SINGLETOUCH_MASK);
++ if (err < 0) {
++ dev_err(&client->dev, "writing to I2C_REG_CHANMASK failed");
++ return -EIO;
++ }
++ }
++
++ err = i2c_smbus_write_byte_data(client, I2C_REG_IRQMASK, (IRQ_PENTOUCH_TOUCHCONVDONE | IRQ_PENRELEASE));
++ if (err < 0) {
++ dev_err(&client->dev, "writing to I2C_REG_IRQMASK failed");
++ return -EIO;
++ }
++
++ err = i2c_smbus_write_byte_data(client, I2C_REG_TOUCH1, CONDIRQ | FILT_7SA);
++ if (err < 0) {
++ dev_err(&client->dev, "writing to I2C_REG_TOUCH1 failed");
++ return -EIO;
++ }
++
++ err = i2c_smbus_write_byte_data(client, I2C_REG_TOUCH0, RATE_5000CPS | POWDLY_1_1MS);
++ if (err < 0) {
++ dev_err(&client->dev, "writing to I2C_REG_TOUCH0 failed");
++ return -EIO;
++ }
++
++ ts->ts_workq = create_singlethread_workqueue("sx8674");
++ if (ts->ts_workq == NULL) {
++ dev_err(&client->dev, "failed to create workqueue\n");
++ return -ENOENT;
++ }
++
++ INIT_DELAYED_WORK(&ts->pen_event_work, sx8674_pen_irq_worker);
++
++ err = devm_request_threaded_irq(&client->dev, ts->irq,
++ NULL, sx8674_irq,
++ IRQF_ONESHOT | IRQF_TRIGGER_FALLING,
++ client->dev.driver->name, ts);
++ if (err < 0) {
++ dev_err(&client->dev, "irq %d busy?\n", ts->irq);
++ return -EBUSY;
++ }
++
++ err = input_register_device(input_dev);
++ if (err)
++ return -ENONET;
++
++ /* enter pen-trigger mode */
++ err = i2c_smbus_write_byte(client, CMD_PENTRG);
++ if (err < 0) {
++ dev_err(&client->dev, "writing command CMD_PENTRG failed");
++ input_unregister_device(input_dev);
++ return -EIO;
++ }
++
++ return 0;
++}
++
++static int sx8674_remove(struct i2c_client *client)
++{
++ struct sx8674 *ts = i2c_get_clientdata(client);
++
++ input_unregister_device(ts->input);
++
++ cancel_delayed_work_sync(&ts->pen_event_work);
++ destroy_workqueue(ts->ts_workq);
++
++ return 0;
++}
++
++static struct i2c_driver sx8674_driver = {
++ .driver = {
++ .owner = THIS_MODULE,
++ .name = "sx8674"
++ },
++ .id_table = sx8674_idtable,
++ .probe = sx8674_probe,
++ .remove = sx8674_remove,
++};
++
++module_i2c_driver(sx8674_driver)
++
++MODULE_AUTHOR("Sébastien Szymanski <seb...@ar...>");
++MODULE_DESCRIPTION("SX8674 Touchscreen Driver");
++MODULE_LICENSE("GPL");
diff --git a/patches/linux/common/000-armadeus-add_mcp7940x_rtc_driver.patch b/patches/linux/3.14/0505-armadeus-add_mcp7940x_rtc_driver.patch
similarity index 87%
copy from patches/linux/common/000-armadeus-add_mcp7940x_rtc_driver.patch
copy to patches/linux/3.14/0505-armadeus-add_mcp7940x_rtc_driver.patch
index 2bbe1db..69d8910 100644
--- a/patches/linux/common/000-armadeus-add_mcp7940x_rtc_driver.patch
+++ b/patches/linux/3.14/0505-armadeus-add_mcp7940x_rtc_driver.patch
@@ -3,11 +3,11 @@ Add mcp79400 Linux driver
Signed-off-by: Fabien Marteau <fab...@ar...>
---
-Index: linux-3.11.1/drivers/rtc/rtc-mcp7940x.c
+Index: linux-3.14/drivers/rtc/rtc-mcp7940x.c
===================================================================
---- /dev/null 1970-01-01 00:00:00.000000000 +0000
-+++ linux-3.11.1/drivers/rtc/rtc-mcp7940x.c 2013-10-05 09:29:52.179513345 +0200
-@@ -0,0 +1,513 @@
+--- /dev/null
++++ linux-3.14/drivers/rtc/rtc-mcp7940x.c
+@@ -0,0 +1,492 @@
+/*
+ * RTC client/driver for the Microchip MCP7940x Real-Time Clock over I2C
+ *
@@ -15,7 +15,7 @@ Index: linux-3.11.1/drivers/rtc/rtc-mcp7940x.c
+ * which was based on code by Randy Vinson <rv...@mv...>,
+ * which was based on the m41t00.c by Mark Greer <mg...@mv...>.
+ *
-+ * Copyright (C) 2012 Armadeus Systems
++ * Copyright (C) 2014 Armadeus Systems
+ *
+ * This file is licensed under the terms of the GNU General Public License
+ * version 2. This program is licensed "as is" without any warranty of any
@@ -34,7 +34,6 @@ Index: linux-3.11.1/drivers/rtc/rtc-mcp7940x.c
+#include <linux/rtc.h>
+#include <linux/bcd.h>
+#include <linux/slab.h>
-+#include <linux/version.h> /* LINUX_VERSION_CODE */
+
+/* Time of Day */
+#define MCP7940X_REG_TD_SECONDS 0x00
@@ -44,18 +43,20 @@ Index: linux-3.11.1/drivers/rtc/rtc-mcp7940x.c
+#define MCP7940X_REG_TD_DATE 0x04
+#define MCP7940X_REG_TD_MONTH 0x05
+#define MCP7940X_REG_TD_YEAR 0x06
++
+/* Controls */
+#define MCP7940X_REG_CONTROL 0x07
+#define MCP7940X_REG_CALIBRATION 0x08
+#define MCP7940X_REG_UNLOCK_ID 0x08
-+/* Alarm 0 */
+
++/* Alarm 0 */
+#define MCP7940X_REG_ALRM0_SECONDS 0x0A
+#define MCP7940X_REG_ALRM0_MINUTES 0x0B
+#define MCP7940X_REG_ALRM0_HOURS 0x0C
+#define MCP7940X_REG_ALRM0_DAY 0x0D
+#define MCP7940X_REG_ALRM0_DATE 0x0E
+#define MCP7940X_REG_ALRM0_MONTH 0x0F
++
+/* Alarm 1 */
+#define MCP7940X_REG_ALRM1_SECONDS 0x11
+#define MCP7940X_REG_ALRM1_MINUTES 0x12
@@ -63,18 +64,19 @@ Index: linux-3.11.1/drivers/rtc/rtc-mcp7940x.c
+#define MCP7940X_REG_ALRM1_DAY 0x14
+#define MCP7940X_REG_ALRM1_DATE 0x15
+#define MCP7940X_REG_ALRM1_MONTH 0x16
++
+/* Timestamp 0 */
+#define MCP7940X_REG_TS0_MINUTES 0x18
+#define MCP7940X_REG_TS0_HOURS 0x19
+#define MCP7940X_REG_TS0_DATE 0x1A
+#define MCP7940X_REG_TS0_MONTH 0x1B
++
+/* Timestamp 1 */
+#define MCP7940X_REG_TS1_MINUTES 0x1C
+#define MCP7940X_REG_TS1_HOURS 0x1D
+#define MCP7940X_REG_TS1_DATE 0x1E
+#define MCP7940X_REG_TS1_MONTH 0x1F
+
-+
+/* bits definitions */
+#define MCP7940X_START_BITS 0x80
+#define MCP7940X_24H_BITS 0x40
@@ -396,7 +398,8 @@ Index: linux-3.11.1/drivers/rtc/rtc-mcp7940x.c
+ struct mcp7940x *mcp7940x;
+ int ret;
+
-+ mcp7940x = kzalloc(sizeof(struct mcp7940x), GFP_KERNEL);
++ mcp7940x = devm_kzalloc(&client->dev, sizeof(struct mcp7940x),
++ GFP_KERNEL);
+ if (!mcp7940x)
+ return -ENOMEM;
+
@@ -405,7 +408,7 @@ Index: linux-3.11.1/drivers/rtc/rtc-mcp7940x.c
+
+ ret = i2c_smbus_read_byte_data(mcp7940x->client, MCP7940X_REG_TD_HOURS);
+ if (ret < 0)
-+ goto out_free;
++ return -EIO;
+
+ /* set rtc to 24h format */
+ if ((ret & MCP7940X_24H_BITS)) {
@@ -413,24 +416,25 @@ Index: linux-3.11.1/drivers/rtc/rtc-mcp7940x.c
+ MCP7940X_REG_TD_HOURS,
+ (u8)(ret & ~MCP7940X_24H_BITS));
+ if(ret < 0)
-+ goto out_free;
++ return -EIO;
+ }
+
+ ret = i2c_smbus_read_byte_data(mcp7940x->client, MCP7940X_REG_TD_DAY);
+ if (ret < 0)
-+ goto out_free;
++ return -EIO;
++
+ /* Use external baterie if Vcc fails */
+ if (!(ret & MCP7940X_VBATEN)) {
+ ret = i2c_smbus_write_byte_data(mcp7940x->client,
+ MCP7940X_REG_TD_DAY,
+ (u8)(ret | MCP7940X_VBATEN));
+ if(ret < 0)
-+ goto out_free;
++ return -EIO;
+ }
+
+ ret = i2c_smbus_read_byte_data(mcp7940x->client, MCP7940X_REG_TD_SECONDS);
+ if (ret < 0)
-+ goto out_free;
++ return -EIO;
+
+ /* If time counter not launched, launch it */
+ if (!(ret & MCP7940X_START_BITS)) {
@@ -438,86 +442,94 @@ Index: linux-3.11.1/drivers/rtc/rtc-mcp7940x.c
+ MCP7940X_REG_TD_SECONDS,
+ (u8)(ret | MCP7940X_START_BITS));
+ if(ret < 0)
-+ goto out_free;
-+
++ return -EIO;
+ }
+
+ device_set_wakeup_capable(&client->dev, 1);
-+ mcp7940x->rtc = rtc_device_register(client->name, &client->dev,
-+ &mcp7940x_rtc_ops, THIS_MODULE);
++
++ mcp7940x->rtc = devm_rtc_device_register(&client->dev, client->name,
++ &mcp7940x_rtc_ops, THIS_MODULE);
+ if (IS_ERR(mcp7940x->rtc)) {
-+ ret = PTR_ERR(mcp7940x->rtc);
+ dev_err(&client->dev, "unable to register the class device\n");
-+ goto out_free;
++ return PTR_ERR(mcp7940x->rtc);
+ }
+
-+ return 0;
++ mcp7940x->rtc->uie_unsupported = 1;
+
-+out_free:
-+ kfree(mcp7940x);
-+ return ret;
++ return 0;
+}
+
-+#if LINUX_VERSION_CODE < KERNEL_VERSION(3, 0, 0)
-+static int __devexit mcp7940x_remove(struct i2c_client *client)
-+#else
-+static int __exit mcp7940x_remove(struct i2c_client *client)
-+#endif
++static int mcp7940x_remove(struct i2c_client *client)
+{
-+ struct mcp7940x *mcp7940x = i2c_get_clientdata(client);
-+
-+ rtc_device_unregister(mcp7940x->rtc);
-+ kfree(mcp7940x);
+ return 0;
+}
+
+#ifdef CONFIG_PM
-+static int mcp7940x_suspend(struct i2c_client *client, pm_message_t state)
++static int mcp7940x_suspend(struct device *dev)
+{
+ return 0;
+}
+
-+static int mcp7940x_resume(struct i2c_client *client)
++static int mcp7940x_resume(struct device *dev)
+{
+ return 0;
+}
-+#else
-+#define mcp7940x_suspend NULL
-+#define mcp7940x_resume NULL
++
++static const struct dev_pm_ops mcp7940x_pm_ops = {
++ .suspend = mcp7940x_suspend,
++ .resume = mcp7940x_resume,
++};
+#endif
+
+static struct i2c_driver mcp7940x_driver = {
+ .driver = {
-+ .name = "rtc-mcp7940x",
-+ .owner = THIS_MODULE,
-+#if defined(CONFIG_OF)
-+ .of_match_table = mcp7940x_rtc_dt_match,
++ .name = "rtc-mcp7940x",
++ .owner = THIS_MODULE,
++#ifdef CONFIG_PM
++ .pm = &mcp7940x_pm_ops,
+#endif
++ .of_match_table = mcp7940x_rtc_dt_match,
+ },
+ .probe = mcp7940x_probe,
-+ .suspend = mcp7940x_suspend,
-+ .resume = mcp7940x_resume,
-+#if LINUX_VERSION_CODE < KERNEL_VERSION(3, 0, 0)
-+ .remove = __devexit_p(mcp7940x_remove),
-+#else
-+ .remove = __exit_p(mcp7940x_remove),
-+#endif
++ .remove = mcp7940x_remove,
+ .id_table = mcp7940x_id,
+};
+
-+static int __init mcp7940x_init(void)
-+{
-+ return i2c_add_driver(&mcp7940x_driver);
-+}
-+
-+static void __exit mcp7940x_exit(void)
-+{
-+ i2c_del_driver(&mcp7940x_driver);
-+}
-+
-+module_init(mcp7940x_init);
-+module_exit(mcp7940x_exit);
++module_i2c_driver(mcp7940x_driver)
+
+MODULE_AUTHOR("Fabien Marteau <fab...@ar...>");
+MODULE_DESCRIPTION("Microchip mcp7940x RTC Driver");
+MODULE_LICENSE("GPL");
+Index: linux-3.14/drivers/rtc/Kconfig
+===================================================================
+--- linux-3.14.orig/drivers/rtc/Kconfig
++++ linux-3.14/drivers/rtc/Kconfig
+@@ -539,6 +539,16 @@ config RTC_DRV_S5M
+ This driver can also be built as a module. If so, the module
+ will be called rtc-s5m.
+
++config RTC_DRV_MCP7940X
++ tristate "Microchip MCP7940X"
++ help
++ If you say yes here you get support for Microchip
++ MCP7940x real-time clock chips.
++ The alarm functionality is not supported.
++
++ This driver can also be built as a module. If so, the module
++ will be called rtc-mcp7940x.
++
+ endif # I2C
+
+ comment "SPI RTC drivers"
+Index: linux-3.14/drivers/rtc/Makefile
+===================================================================
+--- linux-3.14.orig/drivers/rtc/Makefile
++++ linux-3.14/drivers/rtc/Makefile
+@@ -70,6 +70,7 @@ obj-$(CONFIG_RTC_DRV_M41T94) += rtc-m41t
+ obj-$(CONFIG_RTC_DRV_M48T35) += rtc-m48t35.o
+ obj-$(CONFIG_RTC_DRV_M48T59) += rtc-m48t59.o
+ obj-$(CONFIG_RTC_DRV_M48T86) += rtc-m48t86.o
++obj-$(CONFIG_RTC_DRV_MCP7940X) += rtc-mcp7940x.o
+ obj-$(CONFIG_RTC_DRV_MXC) += rtc-mxc.o
+ obj-$(CONFIG_RTC_DRV_MAX6900) += rtc-max6900.o
+ obj-$(CONFIG_RTC_DRV_MAX8907) += rtc-max8907.o
hooks/post-receive
--
armadeus
|