#include "devices.h"
 #include "generic.h"
 
+#include <linux/spi/spi.h>
+#include <linux/spi/pxa2xx_spi.h>
+#include <linux/spi/ads7846.h>
+
 static unsigned long magician_pin_config[] __initdata = {
 
        /* SDRAM and Static Memory I/O Signals */
 
        /* SSP 2 TSC2046 touchscreen */
        GPIO19_SSP2_SCLK,
-       GPIO14_SSP2_SFRM,
+       MFP_CFG_OUT(GPIO14, AF0, DRIVE_HIGH),   /* frame as GPIO */
        GPIO89_SSP2_TXD,
        GPIO88_SSP2_RXD,
 
        },
 };
 
+/*
+ * fixed regulator for ads7846
+ */
+
+static struct regulator_consumer_supply ads7846_supply =
+       REGULATOR_SUPPLY("vcc", "spi2.0");
+
+static struct regulator_init_data vads7846_regulator = {
+       .constraints    = {
+               .valid_ops_mask = REGULATOR_CHANGE_STATUS,
+       },
+       .num_consumer_supplies  = 1,
+       .consumer_supplies      = &ads7846_supply,
+};
+
+static struct fixed_voltage_config vads7846 = {
+       .supply_name    = "vads7846",
+       .microvolts     = 3300000, /* probably */
+       .gpio           = -EINVAL,
+       .startup_delay  = 0,
+       .init_data      = &vads7846_regulator,
+};
+
+static struct platform_device vads7846_device = {
+       .name   = "reg-fixed-voltage",
+       .id     = -1,
+       .dev    = {
+               .platform_data  = &vads7846,
+       },
+};
+
 /*
  * Vcore regulator MAX1587A
  */
        .fast_mode      = 1,
 };
 
+/*
+ * Touchscreen
+ */
+
+static struct ads7846_platform_data ads7846_pdata = {
+       .model          = 7846,
+       .x_plate_ohms   = 317,
+       .y_plate_ohms   = 500,
+       .pressure_max   = 1023, /* with x plate ohms it will overflow 255 */
+       .debounce_max   = 3,    /* first readout is always bad */
+       .debounce_tol   = 30,
+       .debounce_rep   = 0,
+       .gpio_pendown   = GPIO115_MAGICIAN_nPEN_IRQ,
+       .keep_vref_on   = 1,
+       .wakeup         = true,
+       .vref_delay_usecs               = 100,
+       .penirq_recheck_delay_usecs     = 100,
+};
+
+struct pxa2xx_spi_chip tsc2046_chip_info = {
+       .tx_threshold   = 1,
+       .rx_threshold   = 2,
+       .timeout        = 64,
+       /* NOTICE must be GPIO, incompatibility with hw PXA SPI framing */
+       .gpio_cs        = GPIO14_MAGICIAN_TSC2046_CS,
+};
+
+static struct pxa2xx_spi_master magician_spi_info = {
+       .num_chipselect = 1,
+       .enable_dma     = 1,
+};
+
+static struct spi_board_info ads7846_spi_board_info[] __initdata = {
+       {
+               .modalias               = "ads7846",
+               .bus_num                = 2,
+               .max_speed_hz           = 2500000,
+               .platform_data          = &ads7846_pdata,
+               .controller_data        = &tsc2046_chip_info,
+               .irq = PXA_GPIO_TO_IRQ(GPIO115_MAGICIAN_nPEN_IRQ),
+       },
+};
+
 /*
  * Platform devices
  */
        &power_supply,
        &strataflash,
        &leds_gpio,
+       &vads7846_device,
 };
 
 static struct gpio magician_global_gpios[] = {
        } else
                pr_err("LCD detection: CPLD mapping failed\n");
 
+       pxa2xx_set_spi_info(2, &magician_spi_info);
+       spi_register_board_info(ARRAY_AND_SIZE(ads7846_spi_board_info));
+
        regulator_register_always_on(0, "power", pwm_backlight_supply,
                ARRAY_SIZE(pwm_backlight_supply), 5000000);