Index: linux-2.6.21/arch/arm/mach-pxa/ezx-e6.c =================================================================== --- linux-2.6.21.orig/arch/arm/mach-pxa/ezx-e6.c 2007-09-07 11:32:32.000000000 -0300 +++ linux-2.6.21/arch/arm/mach-pxa/ezx-e6.c 2007-09-07 11:51:55.000000000 -0300 @@ -19,6 +19,7 @@ #include #include #include +#include #include "generic.h" @@ -48,7 +49,70 @@ .pxafb_lcd_power = &ezx_lcd_power, }; +/* PCAP */ +static int __init e6_pcap_init(void) +{ + /* + * FIXME: this is the PCAP INITIAL STATE. + * most of these writes should NOT be done here + * * voltage regulators, voltage enablers should be set by the + * driver which uses the connected hardware. Otherwise you + * drain power unnecessarily. + * * interrupt related registers should be set by the irq functions + * only. I think that the INT_SEL register selects on which irq + * pin the (ap/bp) the irq goes. This should go on ezx-pcap.c, but + * only if it actually makes any difference. + * * Only power state automatic changes should be done here. + * (*LOWPWR, *STBY, LOWPWR*) + * * I removed some writes which i consider extremelly wrong. And + * which i think will not break anything (they were overwritten + * later anyway). + * + * --WM + */ + ezx_pcap_write(PCAP_REG_INT_SEL, 0x0); /* wrong */ + ezx_pcap_write(PCAP_REG_SWCTRL, 0x2ee6); /* partially wrong */ + ezx_pcap_write(PCAP_REG_VREG1, 0x15778e3); /* wrong */ + ezx_pcap_write(PCAP_REG_VREG2, 0x810234); /* partially wrong */ + ezx_pcap_write(PCAP_REG_AUXVREG, 0x1024bec); /* wrong */ + ezx_pcap_write(PCAP_REG_PWR, 0x94108); /* partially wrong */ + ezx_pcap_write(PCAP_REG_AUXVREG_MASK, 0x214d48); /* wrong */ + ezx_pcap_write(PCAP_REG_BUSCTRL, 0x2a0); /* wrong */ + ezx_pcap_write(PCAP_REG_LOWPWR, 0x1d9610c); + ezx_pcap_write(PCAP_REG_PERIPH, 0x0); /* wrong */ + ezx_pcap_write(PCAP_REG_GP, 0x107); /* probably unnecessary */ + + return 0; +} + +static struct pcap_platform_data e6_pcap_platform_data = { + .port = 1, + .cs = GPIO_SPI_CE, + .flags = PCAP_CS_AH | PCAP_MCI_SD, + .clk = 1, + .init = e6_pcap_init, +}; + +static struct resource e6_pcap_resources[] = { + [0] = { + .start = IRQ_GPIO1, + .end = IRQ_GPIO1, + .flags = IORESOURCE_IRQ, + }, +}; + +struct platform_device e6_pcap_device = { + .name = "ezx-pcap", + .id = -1, + .num_resources = ARRAY_SIZE(e6_pcap_resources), + .resource = e6_pcap_resources, + .dev = { + .platform_data = &e6_pcap_platform_data, + }, +}; + static struct platform_device *devices[] __initdata = { + &e6_pcap_device, }; static void __init e6_init(void)