From: Daniel Ribeiro <drwyrm@gmail.com>
Subject: [PATCH] ezx/mach/pcap

<patch description>

Signed-off-by: Daniel Ribeiro <drwyrm@gmail.com>

---
 arch/arm/mach-pxa/ezx.c |   79 +++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 79 insertions(+), 0 deletions(-)

diff --git a/arch/arm/mach-pxa/ezx.c b/arch/arm/mach-pxa/ezx.c
index 5a4b365..1bdb813 100644
--- a/arch/arm/mach-pxa/ezx.c
+++ b/arch/arm/mach-pxa/ezx.c
@@ -17,12 +17,16 @@
 #include <linux/delay.h>
 #include <linux/pwm_backlight.h>
 #include <linux/input.h>
+#include <linux/gpio.h>
+#include <linux/spi/spi.h>
+#include <linux/mfd/ezx-pcap.h>
 
 #include <asm/setup.h>
 #include <mach/pxafb.h>
 #include <mach/ohci.h>
 #include <mach/i2c.h>
 #include <mach/pxa27x_keypad.h>
+#include <mach/pxa2xx_spi.h>
 
 #include <mach/mfp-pxa27x.h>
 #include <mach/pxa-regs.h>
@@ -628,6 +632,61 @@ static struct pxa27x_keypad_platform_data e2_keypad_platform_data = {
 
 #endif /* CONFIG_KEYBOARD_PXA27x */
 
+/* PCAP */
+static void ezx_pcap_init(void)
+{
+	/* set SW1 sleep to keep SW1 1.3v in sync mode */
+	/*  SW1 active in sync mode */
+	ezx_pcap_set_sw(SW1, SW_MODE, 0x1);
+
+	/*  set core voltage */
+	ezx_pcap_set_sw(SW1, SW_VOLTAGE, SW_VOLTAGE_1250);
+}
+
+static struct pcap_platform_data ezx_pcap_platform_data = {
+	.cs     = 24,
+	.irq    = IRQ_GPIO1,
+	.config = 0,
+	.init   = ezx_pcap_init,
+};
+
+static void pcap_cs_control(u32 command)
+{
+	if (command & PXA2XX_CS_ASSERT) {
+		gpio_set_value(ezx_pcap_platform_data.cs,
+		 (ezx_pcap_platform_data.config & PCAP_CS_INVERTED) ? 0 : 1);
+	} else {
+		gpio_set_value(ezx_pcap_platform_data.cs,
+		 (ezx_pcap_platform_data.config & PCAP_CS_INVERTED) ? 1 : 0);
+	}
+}
+
+static struct pxa2xx_spi_chip ezx_pcap_chip_info = {
+	.tx_threshold = 1,
+	.rx_threshold = 1,
+	.dma_burst_size = 0,
+	.timeout = 100,
+	.cs_control = pcap_cs_control,
+};
+
+static struct pxa2xx_spi_master ezx_spi_masterinfo = {
+	.clock_enable = CKEN_SSP1,
+	.num_chipselect = 1,
+	.enable_dma = 1,
+};
+
+static struct spi_board_info ezx_spi_boardinfo[] __initdata = {
+	{
+		.modalias = "ezx-pcap",
+		.bus_num = 1,
+		.chip_select = 0,
+		.max_speed_hz = 13000000,
+		.platform_data = &ezx_pcap_platform_data,
+		.controller_data = &ezx_pcap_chip_info,
+		.mode = SPI_MODE_0,
+	},
+};
+
 static void __init ezx_fixup(struct machine_desc *desc, struct tag *tags,
 		char **cmdline, struct meminfo *mi)
 {
@@ -652,6 +711,10 @@ static void __init a780_init(void)
 
 	pxa_set_i2c_info(NULL);
 
+	ezx_pcap_platform_data.config |= PCAP_SECOND_PORT | PCAP_CS_INVERTED;
+	pxa2xx_set_spi_info(1, &ezx_spi_masterinfo);
+	spi_register_board_info(ARRAY_AND_SIZE(ezx_spi_boardinfo));
+
 	set_pxa_fb_info(&ezx_fb_info_1);
 
 #if defined(CONFIG_KEYBOARD_PXA27x) || defined(CONFIG_KEYBOARD_PXA27x_MODULES)
@@ -687,6 +750,10 @@ static void __init e680_init(void)
 
 	i2c_register_board_info(0, ARRAY_AND_SIZE(e680_i2c_board_info));
 
+	ezx_pcap_platform_data.config |= PCAP_SECOND_PORT | PCAP_CS_INVERTED;
+	pxa2xx_set_spi_info(1, &ezx_spi_masterinfo);
+	spi_register_board_info(ARRAY_AND_SIZE(ezx_spi_boardinfo));
+
 	set_pxa_fb_info(&ezx_fb_info_1);
 
 #if defined(CONFIG_KEYBOARD_PXA27x) || defined(CONFIG_KEYBOARD_PXA27x_MODULES)
@@ -722,6 +789,9 @@ static void __init a1200_init(void)
 
 	i2c_register_board_info(0, ARRAY_AND_SIZE(a1200_i2c_board_info));
 
+	pxa2xx_set_spi_info(1, &ezx_spi_masterinfo);
+	spi_register_board_info(ARRAY_AND_SIZE(ezx_spi_boardinfo));
+
 	set_pxa_fb_info(&ezx_fb_info_2);
 
 #if defined(CONFIG_KEYBOARD_PXA27x) || defined(CONFIG_KEYBOARD_PXA27x_MODULES)
@@ -756,6 +826,9 @@ static void __init a910_init(void)
 
 	i2c_register_board_info(0, ARRAY_AND_SIZE(a910_i2c_board_info));
 
+	pxa2xx_set_spi_info(1, &ezx_spi_masterinfo);
+	spi_register_board_info(ARRAY_AND_SIZE(ezx_spi_boardinfo));
+
 	set_pxa_fb_info(&ezx_fb_info_2);
 
 #if defined(CONFIG_KEYBOARD_PXA27x) || defined(CONFIG_KEYBOARD_PXA27x_MODULES)
@@ -791,6 +864,9 @@ static void __init e6_init(void)
 
 	i2c_register_board_info(0, ARRAY_AND_SIZE(e6_i2c_board_info));
 
+	pxa2xx_set_spi_info(1, &ezx_spi_masterinfo);
+	spi_register_board_info(ARRAY_AND_SIZE(ezx_spi_boardinfo));
+
 	set_pxa_fb_info(&ezx_fb_info_2);
 
 #if defined(CONFIG_KEYBOARD_PXA27x) || defined(CONFIG_KEYBOARD_PXA27x_MODULES)
@@ -826,6 +902,9 @@ static void __init e2_init(void)
 
 	i2c_register_board_info(0, ARRAY_AND_SIZE(e2_i2c_board_info));
 
+	pxa2xx_set_spi_info(1, &ezx_spi_masterinfo);
+	spi_register_board_info(ARRAY_AND_SIZE(ezx_spi_boardinfo));
+
 	set_pxa_fb_info(&ezx_fb_info_2);
 
 #if defined(CONFIG_KEYBOARD_PXA27x) || defined(CONFIG_KEYBOARD_PXA27x_MODULES)
-- 
tg: (313c0dc..) ezx/mach/pcap (depends on: ezx/mach/i2c ezx/pcap)
