linux-ezx 2.6.21: Sync with openezx svn
authorKoen Kooi <koen@openembedded.org>
Sat, 5 May 2007 09:27:45 +0000 (09:27 +0000)
committerKoen Kooi <koen@openembedded.org>
Sat, 5 May 2007 09:27:45 +0000 (09:27 +0000)
NOTE: the defconfig needs some tweaking

packages/linux/linux-ezx-2.6.21/ezx-core.patch
packages/linux/linux-ezx-2.6.21/ezx-emu.patch
packages/linux/linux-ezx-2.6.21/ezx-pcap.patch
packages/linux/linux-ezx-2.6.21/ezx-pm.patch
packages/linux/linux-ezx-2.6.21/pcap-ts.patch [new file with mode: 0644]
packages/linux/linux-ezx_2.6.21.bb

index f62d89a..8e89aff 100644 (file)
@@ -1,7 +1,7 @@
 Index: linux-2.6.21/arch/arm/boot/compressed/head-xscale.S
 ===================================================================
---- linux-2.6.21.orig/arch/arm/boot/compressed/head-xscale.S   2007-05-01 14:00:25.000000000 -0300
-+++ linux-2.6.21/arch/arm/boot/compressed/head-xscale.S        2007-05-01 14:00:48.000000000 -0300
+--- linux-2.6.21.orig/arch/arm/boot/compressed/head-xscale.S   2007-05-03 17:41:57.000000000 -0300
++++ linux-2.6.21/arch/arm/boot/compressed/head-xscale.S        2007-05-03 17:42:02.000000000 -0300
 @@ -53,3 +53,6 @@
                str     r1, [r0, #0x18]
  #endif
@@ -11,8 +11,8 @@ Index: linux-2.6.21/arch/arm/boot/compressed/head-xscale.S
 +#endif
 Index: linux-2.6.21/arch/arm/mach-pxa/Kconfig
 ===================================================================
---- linux-2.6.21.orig/arch/arm/mach-pxa/Kconfig        2007-05-01 14:00:25.000000000 -0300
-+++ linux-2.6.21/arch/arm/mach-pxa/Kconfig     2007-05-01 23:02:56.000000000 -0300
+--- linux-2.6.21.orig/arch/arm/mach-pxa/Kconfig        2007-05-03 17:41:57.000000000 -0300
++++ linux-2.6.21/arch/arm/mach-pxa/Kconfig     2007-05-04 04:17:33.000000000 -0300
 @@ -37,6 +37,10 @@
        bool "Keith und Koep Trizeps4 DIMM-Module"
        select PXA27x
@@ -60,8 +60,8 @@ Index: linux-2.6.21/arch/arm/mach-pxa/Kconfig
  endif
 Index: linux-2.6.21/arch/arm/mach-pxa/Makefile
 ===================================================================
---- linux-2.6.21.orig/arch/arm/mach-pxa/Makefile       2007-05-01 14:00:25.000000000 -0300
-+++ linux-2.6.21/arch/arm/mach-pxa/Makefile    2007-05-01 23:03:58.000000000 -0300
+--- linux-2.6.21.orig/arch/arm/mach-pxa/Makefile       2007-05-03 17:41:57.000000000 -0300
++++ linux-2.6.21/arch/arm/mach-pxa/Makefile    2007-05-04 04:17:42.000000000 -0300
 @@ -18,6 +18,7 @@
  obj-$(CONFIG_MACH_AKITA)      += akita-ioexp.o
  obj-$(CONFIG_MACH_POODLE)     += poodle.o corgi_ssp.o
@@ -73,7 +73,7 @@ Index: linux-2.6.21/arch/arm/mach-pxa/Makefile
 Index: linux-2.6.21/arch/arm/mach-pxa/ezx.c
 ===================================================================
 --- /dev/null  1970-01-01 00:00:00.000000000 +0000
-+++ linux-2.6.21/arch/arm/mach-pxa/ezx.c       2007-05-01 23:03:58.000000000 -0300
++++ linux-2.6.21/arch/arm/mach-pxa/ezx.c       2007-05-04 04:17:42.000000000 -0300
 @@ -0,0 +1,378 @@
 +/*
 + *  linux/arch/arm/mach-ezx/a780.c
@@ -456,7 +456,7 @@ Index: linux-2.6.21/arch/arm/mach-pxa/ezx.c
 Index: linux-2.6.21/include/asm-arm/arch-pxa/ezx.h
 ===================================================================
 --- /dev/null  1970-01-01 00:00:00.000000000 +0000
-+++ linux-2.6.21/include/asm-arm/arch-pxa/ezx.h        2007-05-01 14:00:48.000000000 -0300
++++ linux-2.6.21/include/asm-arm/arch-pxa/ezx.h        2007-05-03 17:42:02.000000000 -0300
 @@ -0,0 +1,225 @@
 +/*
 + *  linux/include/asm-arm/arch-pxa/ezx.h
@@ -685,8 +685,8 @@ Index: linux-2.6.21/include/asm-arm/arch-pxa/ezx.h
 +
 Index: linux-2.6.21/include/asm-arm/arch-pxa/pxa-regs.h
 ===================================================================
---- linux-2.6.21.orig/include/asm-arm/arch-pxa/pxa-regs.h      2007-05-01 14:00:24.000000000 -0300
-+++ linux-2.6.21/include/asm-arm/arch-pxa/pxa-regs.h   2007-05-01 23:02:53.000000000 -0300
+--- linux-2.6.21.orig/include/asm-arm/arch-pxa/pxa-regs.h      2007-05-03 17:41:57.000000000 -0300
++++ linux-2.6.21/include/asm-arm/arch-pxa/pxa-regs.h   2007-05-04 04:17:32.000000000 -0300
 @@ -849,6 +849,8 @@
  #define UP2OCR_HXOE           (1 << 17)       /* Host Port 2 Transceiver Output Enable */
  #define UP2OCR_SEOS           (1 << 24)       /* Single-Ended Output Select */
@@ -802,8 +802,8 @@ Index: linux-2.6.21/include/asm-arm/arch-pxa/pxa-regs.h
  #define PGSR2         __REG(0x40F00028)  /* Power Manager GPIO Sleep State Register for GP[84-64] */
 Index: linux-2.6.21/arch/arm/boot/compressed/head.S
 ===================================================================
---- linux-2.6.21.orig/arch/arm/boot/compressed/head.S  2007-05-01 14:00:25.000000000 -0300
-+++ linux-2.6.21/arch/arm/boot/compressed/head.S       2007-05-01 14:00:48.000000000 -0300
+--- linux-2.6.21.orig/arch/arm/boot/compressed/head.S  2007-05-03 17:41:57.000000000 -0300
++++ linux-2.6.21/arch/arm/boot/compressed/head.S       2007-05-03 17:42:02.000000000 -0300
 @@ -117,6 +117,9 @@
                mov     r0, r0
                .endr
@@ -816,8 +816,8 @@ Index: linux-2.6.21/arch/arm/boot/compressed/head.S
                .word   start                   @ absolute load/run zImage address
 Index: linux-2.6.21/include/asm-arm/arch-pxa/uncompress.h
 ===================================================================
---- linux-2.6.21.orig/include/asm-arm/arch-pxa/uncompress.h    2007-05-01 14:00:24.000000000 -0300
-+++ linux-2.6.21/include/asm-arm/arch-pxa/uncompress.h 2007-05-01 14:00:48.000000000 -0300
+--- linux-2.6.21.orig/include/asm-arm/arch-pxa/uncompress.h    2007-05-03 17:41:57.000000000 -0300
++++ linux-2.6.21/include/asm-arm/arch-pxa/uncompress.h 2007-05-03 17:42:02.000000000 -0300
 @@ -14,14 +14,14 @@
  #define STUART                ((volatile unsigned long *)0x40700000)
  #define HWUART                ((volatile unsigned long *)0x41600000)
@@ -839,7 +839,7 @@ Index: linux-2.6.21/include/asm-arm/arch-pxa/uncompress.h
 Index: linux-2.6.21/arch/arm/mach-pxa/ezx_ssp.c
 ===================================================================
 --- /dev/null  1970-01-01 00:00:00.000000000 +0000
-+++ linux-2.6.21/arch/arm/mach-pxa/ezx_ssp.c   2007-05-01 14:00:48.000000000 -0300
++++ linux-2.6.21/arch/arm/mach-pxa/ezx_ssp.c   2007-05-03 17:42:02.000000000 -0300
 @@ -0,0 +1,126 @@
 +/*
 + *  SSP control code for Motorola EZX phones
@@ -970,7 +970,7 @@ Index: linux-2.6.21/arch/arm/mach-pxa/ezx_ssp.c
 Index: linux-2.6.21/arch/arm/mach-pxa/ezx.h
 ===================================================================
 --- /dev/null  1970-01-01 00:00:00.000000000 +0000
-+++ linux-2.6.21/arch/arm/mach-pxa/ezx.h       2007-05-01 14:00:48.000000000 -0300
++++ linux-2.6.21/arch/arm/mach-pxa/ezx.h       2007-05-03 17:42:02.000000000 -0300
 @@ -0,0 +1,9 @@
 +#include <asm/arch/ezx.h>
 +
@@ -984,7 +984,7 @@ Index: linux-2.6.21/arch/arm/mach-pxa/ezx.h
 Index: linux-2.6.21/arch/arm/mach-pxa/ezx_lcd.c
 ===================================================================
 --- /dev/null  1970-01-01 00:00:00.000000000 +0000
-+++ linux-2.6.21/arch/arm/mach-pxa/ezx_lcd.c   2007-05-01 22:53:54.000000000 -0300
++++ linux-2.6.21/arch/arm/mach-pxa/ezx_lcd.c   2007-05-03 17:42:02.000000000 -0300
 @@ -0,0 +1,113 @@
 +/*
 + *  linux/arch/arm/mach-ezx/a780.c
@@ -1101,13 +1101,13 @@ Index: linux-2.6.21/arch/arm/mach-pxa/ezx_lcd.c
 +arch_initcall(__ezx_lcd_init);
 Index: linux-2.6.21/arch/arm/mm/init.c
 ===================================================================
---- linux-2.6.21.orig/arch/arm/mm/init.c       2007-05-01 14:00:25.000000000 -0300
-+++ linux-2.6.21/arch/arm/mm/init.c    2007-05-01 14:00:48.000000000 -0300
+--- linux-2.6.21.orig/arch/arm/mm/init.c       2007-05-03 17:41:57.000000000 -0300
++++ linux-2.6.21/arch/arm/mm/init.c    2007-05-04 03:48:30.000000000 -0300
 @@ -241,6 +241,10 @@
         */
        reserve_bootmem_node(pgdat, boot_pfn << PAGE_SHIFT,
                             boot_pages << PAGE_SHIFT);
-+#ifdef CONFIG_ARCH_EZX
++#ifdef CONFIG_PXA_EZX
 +      /* reserve the first page memory for exiting sleep and user off */
 +      reserve_bootmem_node(pgdat, PHYS_OFFSET, PAGE_SIZE);
 +#endif
index 95fdd96..91d99ee 100644 (file)
@@ -1,7 +1,7 @@
 Index: linux-2.6.21/arch/arm/mach-pxa/ezx-emu.c
 ===================================================================
 --- /dev/null  1970-01-01 00:00:00.000000000 +0000
-+++ linux-2.6.21/arch/arm/mach-pxa/ezx-emu.c   2007-05-01 03:58:42.000000000 -0300
++++ linux-2.6.21/arch/arm/mach-pxa/ezx-emu.c   2007-05-02 23:30:15.000000000 -0300
 @@ -0,0 +1,215 @@
 +/*
 + *  EMU Driver for Motorola EZX phones
@@ -151,7 +151,7 @@ Index: linux-2.6.21/arch/arm/mach-pxa/ezx-emu.c
 +      return 0;
 +}
 +
-+static int ezx_emu_suspend(struct platform_device *dev)
++static int ezx_emu_suspend(struct platform_device *dev, pm_message_t state)
 +{
 +      emu_switch_to_nothing();
 +      return 0;
@@ -220,8 +220,8 @@ Index: linux-2.6.21/arch/arm/mach-pxa/ezx-emu.c
 +MODULE_LICENSE("GPL");
 Index: linux-2.6.21/arch/arm/mach-pxa/Kconfig
 ===================================================================
---- linux-2.6.21.orig/arch/arm/mach-pxa/Kconfig        2007-05-01 01:39:12.000000000 -0300
-+++ linux-2.6.21/arch/arm/mach-pxa/Kconfig     2007-05-01 02:07:23.000000000 -0300
+--- linux-2.6.21.orig/arch/arm/mach-pxa/Kconfig        2007-05-02 21:31:22.000000000 -0300
++++ linux-2.6.21/arch/arm/mach-pxa/Kconfig     2007-05-02 23:26:53.000000000 -0300
 @@ -94,6 +94,27 @@
  
  endchoice
@@ -252,8 +252,8 @@ Index: linux-2.6.21/arch/arm/mach-pxa/Kconfig
  endmenu
 Index: linux-2.6.21/arch/arm/mach-pxa/Makefile
 ===================================================================
---- linux-2.6.21.orig/arch/arm/mach-pxa/Makefile       2007-05-01 02:07:23.000000000 -0300
-+++ linux-2.6.21/arch/arm/mach-pxa/Makefile    2007-05-01 04:10:48.000000000 -0300
+--- linux-2.6.21.orig/arch/arm/mach-pxa/Makefile       2007-05-02 23:26:52.000000000 -0300
++++ linux-2.6.21/arch/arm/mach-pxa/Makefile    2007-05-03 17:41:40.000000000 -0300
 @@ -19,6 +19,7 @@
  obj-$(CONFIG_MACH_POODLE)     += poodle.o corgi_ssp.o
  obj-$(CONFIG_MACH_TOSA)         += tosa.o
@@ -264,8 +264,8 @@ Index: linux-2.6.21/arch/arm/mach-pxa/Makefile
  led-y := leds.o
 Index: linux-2.6.21/arch/arm/mach-pxa/ezx.c
 ===================================================================
---- linux-2.6.21.orig/arch/arm/mach-pxa/ezx.c  2007-05-01 02:07:23.000000000 -0300
-+++ linux-2.6.21/arch/arm/mach-pxa/ezx.c       2007-05-01 02:07:23.000000000 -0300
+--- linux-2.6.21.orig/arch/arm/mach-pxa/ezx.c  2007-05-02 23:26:52.000000000 -0300
++++ linux-2.6.21/arch/arm/mach-pxa/ezx.c       2007-05-03 17:25:08.000000000 -0300
 @@ -35,6 +35,7 @@
  #include <asm/arch/ohci.h>
  #include <asm/arch/pxa-regs.h>
index de64d72..a077ad5 100644 (file)
@@ -1,8 +1,8 @@
 Index: linux-2.6.21/arch/arm/mach-pxa/ezx-pcap.c
 ===================================================================
 --- /dev/null  1970-01-01 00:00:00.000000000 +0000
-+++ linux-2.6.21/arch/arm/mach-pxa/ezx-pcap.c  2007-05-01 14:00:50.000000000 -0300
-@@ -0,0 +1,411 @@
++++ linux-2.6.21/arch/arm/mach-pxa/ezx-pcap.c  2007-05-04 03:07:37.000000000 -0300
+@@ -0,0 +1,425 @@
 +/* Driver for Motorola PCAP2 as present in EZX phones
 + *
 + * This is both a SPI device driver for PCAP itself, as well as
@@ -51,7 +51,7 @@ Index: linux-2.6.21/arch/arm/mach-pxa/ezx-pcap.c
 +      ezx_ssp_pcap_putget(value);
 +      local_irq_enable();
 +
-+      DEBUGP("pcap write r%x: 0x%08x\n", reg_num, value);
++//    DEBUGP("pcap write r%x: 0x%08x\n", reg_num, value);
 +      return 0;
 +}
 +EXPORT_SYMBOL_GPL(ezx_pcap_write);
@@ -65,7 +65,7 @@ Index: linux-2.6.21/arch/arm/mach-pxa/ezx-pcap.c
 +      *value = ezx_ssp_pcap_putget(frame);
 +      local_irq_enable();
 +
-+      DEBUGP("pcap read r%x:  0x%08x\n", reg_num, *value);
++//    DEBUGP("pcap read r%x:  0x%08x\n", reg_num, *value);
 +      return 0;
 +}
 +EXPORT_SYMBOL_GPL(ezx_pcap_read);
@@ -121,12 +121,14 @@ Index: linux-2.6.21/arch/arm/mach-pxa/ezx-pcap.c
 +        /* FIXME: this should be board-level, not chip-level */
 +      /* implement a per board pcap init reg array? */
 +
-+      ezx_pcap_bit_set(SSP_PCAP_ADJ_BIT_ISR_USB4VI, 1);
-+        ezx_pcap_bit_set(SSP_PCAP_ADJ_BIT_MSR_USB4VM, 0);
-+        ezx_pcap_bit_set(SSP_PCAP_ADJ_BIT_ISR_USB1VI, 1);
-+        ezx_pcap_bit_set(SSP_PCAP_ADJ_BIT_MSR_USB1VM, 0);
++//    ezx_pcap_bit_set(SSP_PCAP_ADJ_BIT_ISR_USB4VI, 1);
++//        ezx_pcap_bit_set(SSP_PCAP_ADJ_BIT_MSR_USB4VM, 0);
++//        ezx_pcap_bit_set(SSP_PCAP_ADJ_BIT_ISR_USB1VI, 1);
++//        ezx_pcap_bit_set(SSP_PCAP_ADJ_BIT_MSR_USB1VM, 0);
 +      // disable all interrupts
-+      //ezx_pcap_write(SSP_PCAP_ADJ_MSR_REGISTER, 0x03ffffff);
++      ezx_pcap_write(SSP_PCAP_ADJ_MSR_REGISTER, PCAP_MASK_ALL_INTERRUPT);
++      // clear all interrupts
++      ezx_pcap_write(SSP_PCAP_ADJ_ISR_REGISTER, PCAP_MASK_ALL_INTERRUPT);
 +
 +        ezx_pcap_bit_set(SSP_PCAP_ADJ_BIT_AUD_RX_AMPS_A1CTRL, 1);
 +        ezx_pcap_vibrator_level(PCAP_VIBRATOR_VOLTAGE_LEVEL3);
@@ -288,12 +290,12 @@ Index: linux-2.6.21/arch/arm/mach-pxa/ezx-pcap.c
 +{
 +        int i;
 +        const unsigned int cpu = smp_processor_id();
-+        u_int32_t reg;
-+
-+        DEBUGP("pcap_irq_demux_handler(%u,,) entered\n", irq);
++        u_int32_t reg, mask;
 +
 +      spin_lock(&desc->lock);
 +
++        DEBUGP("pcap_irq_demux_handler(%u,,) entered\n", irq);
++
 +        desc->status &= ~(IRQ_REPLAY | IRQ_WAITING);
 +
 +        if (unlikely(desc->status & IRQ_INPROGRESS)) {
@@ -305,6 +307,7 @@ Index: linux-2.6.21/arch/arm/mach-pxa/ezx-pcap.c
 +      }
 +
 +        kstat_cpu(cpu).irqs[irq]++;
++      desc->chip->ack(irq);
 +      desc->status |= IRQ_INPROGRESS;
 +
 +        do {
@@ -317,30 +320,27 @@ Index: linux-2.6.21/arch/arm/mach-pxa/ezx-pcap.c
 +                }
 +
 +              desc->status &= ~IRQ_PENDING;
-+              spin_unlock(&desc->lock);
 +
-+                ezx_pcap_read(SSP_PCAP_ADJ_ISR_REGISTER, &reg);
-+                DEBUGP("pcap_irq_demux_handler: ISR=0x%08x\n", reg);
++              ezx_pcap_read(SSP_PCAP_ADJ_ISR_REGISTER, &reg);
++              ezx_pcap_read(SSP_PCAP_ADJ_MSR_REGISTER, &mask);
++                DEBUGP("pcap_irq_demux_handler: ISR=0x%08x MSR=0x%08x\n", reg, mask);
 +
 +                for (i = ARRAY_SIZE(pcap2irq)-1; i >= 0; i--) {
 +                        unsigned int pirq = pcap2irq[i];
 +                        if (pirq == 0)
 +                                continue;
 +
-+                        if (reg & (1 << i)) {
++                        if ((reg & (1 << i)) && !(mask & (1 << i))) {
 +                                struct irq_desc *subdesc;
 +                                DEBUGP("found irq %u\n", pirq);
 +                                subdesc = irq_desc + pirq;
-+
-+                              // acknowledge pcap irq
-+                              // do just one pcap irq each time
 +                              subdesc->chip->ack(pirq);
-+                              i = 0;
 +
++                              spin_unlock(&desc->lock);
 +                              handle_IRQ_event(pirq, subdesc->action);
++                              spin_lock(&desc->lock);
 +                        }
 +                }
-+              spin_lock(&desc->lock);
 +
 +        } while ((desc->status & (IRQ_PENDING | IRQ_DISABLED)) == IRQ_PENDING);
 +
@@ -387,9 +387,23 @@ Index: linux-2.6.21/arch/arm/mach-pxa/ezx-pcap.c
 +        return 0;
 +}
 +
++static int ezx_pcap_suspend(struct platform_device *dev, pm_message_t state)
++{
++      DEBUGP("pcap suspend!\n");
++        return 0;
++}
++
++static int ezx_pcap_resume(struct platform_device *dev)
++{
++      DEBUGP("pcap resume!\n");
++        return 0;
++}
++
 +static struct platform_driver ezxpcap_driver = {
 +      .probe          = ezx_pcap_probe,
 +      .remove         = ezx_pcap_remove,
++      .suspend        = ezx_pcap_suspend,
++      .resume         = ezx_pcap_resume,
 +      .driver         = {
 +              .name   = "ezx-pcap",
 +              .owner  = THIS_MODULE,
@@ -417,7 +431,7 @@ Index: linux-2.6.21/arch/arm/mach-pxa/ezx-pcap.c
 Index: linux-2.6.21/include/asm-arm/arch-pxa/ezx-pcap.h
 ===================================================================
 --- /dev/null  1970-01-01 00:00:00.000000000 +0000
-+++ linux-2.6.21/include/asm-arm/arch-pxa/ezx-pcap.h   2007-05-01 14:00:50.000000000 -0300
++++ linux-2.6.21/include/asm-arm/arch-pxa/ezx-pcap.h   2007-05-03 17:43:48.000000000 -0300
 @@ -0,0 +1,665 @@
 +/* (c) Copyright Motorola Beijing 2002 all rights reserved.
 +
@@ -1086,8 +1100,8 @@ Index: linux-2.6.21/include/asm-arm/arch-pxa/ezx-pcap.h
 +#endif
 Index: linux-2.6.21/include/asm-arm/arch-pxa/irqs.h
 ===================================================================
---- linux-2.6.21.orig/include/asm-arm/arch-pxa/irqs.h  2007-05-01 14:00:24.000000000 -0300
-+++ linux-2.6.21/include/asm-arm/arch-pxa/irqs.h       2007-05-01 14:00:50.000000000 -0300
+--- linux-2.6.21.orig/include/asm-arm/arch-pxa/irqs.h  2007-05-03 17:41:55.000000000 -0300
++++ linux-2.6.21/include/asm-arm/arch-pxa/irqs.h       2007-05-03 17:43:48.000000000 -0300
 @@ -176,7 +176,8 @@
  #define NR_IRQS                       (IRQ_LOCOMO_SPI_TEND + 1)
  #elif defined(CONFIG_ARCH_LUBBOCK) || \
@@ -1117,8 +1131,8 @@ Index: linux-2.6.21/include/asm-arm/arch-pxa/irqs.h
 +
 Index: linux-2.6.21/arch/arm/mach-pxa/Makefile
 ===================================================================
---- linux-2.6.21.orig/arch/arm/mach-pxa/Makefile       2007-05-01 14:00:48.000000000 -0300
-+++ linux-2.6.21/arch/arm/mach-pxa/Makefile    2007-05-01 14:00:50.000000000 -0300
+--- linux-2.6.21.orig/arch/arm/mach-pxa/Makefile       2007-05-03 17:42:02.000000000 -0300
++++ linux-2.6.21/arch/arm/mach-pxa/Makefile    2007-05-04 04:17:33.000000000 -0300
 @@ -18,7 +18,7 @@
  obj-$(CONFIG_MACH_AKITA)      += akita-ioexp.o
  obj-$(CONFIG_MACH_POODLE)     += poodle.o corgi_ssp.o
@@ -1130,8 +1144,8 @@ Index: linux-2.6.21/arch/arm/mach-pxa/Makefile
  led-y := leds.o
 Index: linux-2.6.21/arch/arm/mach-pxa/ezx.c
 ===================================================================
---- linux-2.6.21.orig/arch/arm/mach-pxa/ezx.c  2007-05-01 14:00:48.000000000 -0300
-+++ linux-2.6.21/arch/arm/mach-pxa/ezx.c       2007-05-01 14:00:50.000000000 -0300
+--- linux-2.6.21.orig/arch/arm/mach-pxa/ezx.c  2007-05-03 17:42:02.000000000 -0300
++++ linux-2.6.21/arch/arm/mach-pxa/ezx.c       2007-05-04 04:17:33.000000000 -0300
 @@ -72,6 +72,24 @@
        .clk_pcap       = 1,
  };
index 2b498c8..4ad6693 100644 (file)
@@ -1,7 +1,7 @@
 Index: linux-2.6.21/arch/arm/mach-pxa/pxa27x.c
 ===================================================================
---- linux-2.6.21.orig/arch/arm/mach-pxa/pxa27x.c       2007-04-26 00:08:32.000000000 -0300
-+++ linux-2.6.21/arch/arm/mach-pxa/pxa27x.c    2007-04-30 18:29:49.000000000 -0300
+--- linux-2.6.21.orig/arch/arm/mach-pxa/pxa27x.c       2007-05-03 17:41:39.000000000 -0300
++++ linux-2.6.21/arch/arm/mach-pxa/pxa27x.c    2007-05-03 17:43:42.000000000 -0300
 @@ -22,6 +22,10 @@
  #include <asm/arch/pxa-regs.h>
  #include <asm/arch/ohci.h>
@@ -29,8 +29,8 @@ Index: linux-2.6.21/arch/arm/mach-pxa/pxa27x.c
        }
 Index: linux-2.6.21/arch/arm/mach-pxa/pm.c
 ===================================================================
---- linux-2.6.21.orig/arch/arm/mach-pxa/pm.c   2007-04-26 00:08:32.000000000 -0300
-+++ linux-2.6.21/arch/arm/mach-pxa/pm.c        2007-04-30 18:29:49.000000000 -0300
+--- linux-2.6.21.orig/arch/arm/mach-pxa/pm.c   2007-05-03 17:41:39.000000000 -0300
++++ linux-2.6.21/arch/arm/mach-pxa/pm.c        2007-05-04 03:51:15.000000000 -0300
 @@ -24,6 +24,10 @@
  #include <asm/arch/lubbock.h>
  #include <asm/mach/time.h>
diff --git a/packages/linux/linux-ezx-2.6.21/pcap-ts.patch b/packages/linux/linux-ezx-2.6.21/pcap-ts.patch
new file mode 100644 (file)
index 0000000..a07ec1a
--- /dev/null
@@ -0,0 +1,450 @@
+Index: linux-2.6.21/drivers/input/touchscreen/Kconfig
+===================================================================
+--- linux-2.6.21.orig/drivers/input/touchscreen/Kconfig        2007-05-03 17:39:18.000000000 -0300
++++ linux-2.6.21/drivers/input/touchscreen/Kconfig     2007-05-03 17:44:12.000000000 -0300
+@@ -164,4 +164,13 @@
+         To compile this driver as a module, choose M here: the
+         module will be called ucb1400_ts.
++config TOUCHSCREEN_PCAP
++      tristate "Motorola PCAP touchscreen"
++      depends on PXA_EZX
++      help
++        Say Y here if you have a Motorola EZX telephone and
++        want to support the built-in touchscreen.
++
++        If unsure, say N.
++
+ endif
+Index: linux-2.6.21/drivers/input/touchscreen/pcap_ts.c
+===================================================================
+--- /dev/null  1970-01-01 00:00:00.000000000 +0000
++++ linux-2.6.21/drivers/input/touchscreen/pcap_ts.c   2007-05-04 04:17:22.000000000 -0300
+@@ -0,0 +1,372 @@
++/*
++ * pcap_ts.c - Touchscreen driver for Motorola PCAP2 based touchscreen as found
++ *           in the EZX phone platform.
++ *
++ *  Copyright (C) 2006 Harald Welte <laforge@openezx.org>
++ *
++ *  Based on information found in the original Motorola 2.4.x ezx-ts.c driver.
++ *
++ *  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.
++ *
++ * May 3, 2007 - Daniel Ribeiro <drwyrm@gmail.com>
++ *                    Major cleanup
++ *                    PM Callbacks
++ *
++ * TODO:
++ *    split this in a hardirq handler and a tasklet/bh
++ */
++
++#include <linux/module.h>
++#include <linux/init.h>
++#include <linux/fs.h>
++#include <linux/string.h>
++#include <linux/pm.h>
++#include <linux/timer.h>
++//#include <linux/config.h>
++#include <linux/interrupt.h>
++#include <linux/platform_device.h>
++#include <linux/input.h>
++
++#include <asm/arch/hardware.h>
++#include <asm/arch/pxa-regs.h>
++#include <asm/arch/ezx-pcap.h>
++
++#if 0
++#define DEBUGP(x, args ...) printk(x, ## args)
++#else
++#define DEBUGP(x, args ...)
++#endif
++
++#define PRESSURE 1
++#define COORDINATE 2
++#define STANDBY 3
++
++struct pcap_ts {
++      int irq_xy;
++      int irq_touch;
++      struct input_dev *input;
++      struct timer_list timer;
++
++      u_int16_t x, y;
++      u_int16_t pressure;
++
++      u_int8_t read_state;
++};
++
++#define X_AXIS_MIN    0
++#define X_AXIS_MAX    1023
++
++#define Y_AXIS_MAX    X_AXIS_MAX
++#define Y_AXIS_MIN    X_AXIS_MIN
++
++#define PRESSURE_MAX  X_AXIS_MAX
++#define PRESSURE_MIN  X_AXIS_MIN
++
++/* if we try to read faster, pressure reading becomes unreliable */
++#define SAMPLE_INTERVAL               (HZ/50)
++
++
++static void pcap_ts_mode(u_int32_t mode)
++{
++      u_int32_t tmp;
++
++      ezx_pcap_read(SSP_PCAP_ADJ_ADC1_REGISTER, &tmp);
++      tmp &= ~SSP_PCAP_TOUCH_PANEL_POSITION_DETECT_MODE_MASK;
++      tmp |= mode;
++      ezx_pcap_write(SSP_PCAP_ADJ_ADC1_REGISTER, tmp);
++}
++
++/* issue a XY read command to the ADC of PCAP2.  Well get an ADCDONE2 interrupt
++ * once the result of the conversion is available */
++static void pcap_ts_start_xy_read(struct pcap_ts *pcap_ts)
++{
++      u_int32_t tmp;
++
++      ezx_pcap_read(SSP_PCAP_ADJ_ADC1_REGISTER, &tmp);
++      tmp &= SSP_PCAP_ADC_START_VALUE_SET_MASK;
++      tmp |= SSP_PCAP_ADC_START_VALUE;
++      ezx_pcap_write(SSP_PCAP_ADJ_ADC1_REGISTER, tmp);
++      ezx_pcap_bit_set(SSP_PCAP_ADJ_BIT_ADC2_ASC, 1);
++}
++
++/* read the XY result from the ADC of PCAP2 */
++static void pcap_ts_get_xy_value(struct pcap_ts *pcap_ts)
++{
++      u_int32_t tmp;
++
++      ezx_pcap_read(SSP_PCAP_ADJ_ADC2_REGISTER, &tmp);
++
++      if (pcap_ts->read_state == COORDINATE && !(tmp & 0x00400000)) {
++              pcap_ts->x = (tmp & SSP_PCAP_ADD1_VALUE_MASK);
++              pcap_ts->y = (tmp & SSP_PCAP_ADD2_VALUE_MASK)
++                                              >>SSP_PCAP_ADD2_VALUE_SHIFT;
++      } else {
++              pcap_ts->pressure = (tmp & SSP_PCAP_ADD2_VALUE_MASK)
++                                              >>SSP_PCAP_ADD2_VALUE_SHIFT;
++      }
++
++}
++
++/* PCAP2 interrupts us when ADC conversion result is available */
++static irqreturn_t pcap_ts_irq_xy(int irq, void *dev_id)
++{
++      struct pcap_ts *pcap_ts = dev_id;
++
++      pcap_ts_get_xy_value(pcap_ts);
++      DEBUGP(KERN_DEBUG "%s X=%4d, Y=%4d Z=%4d ",
++              pcap_ts->read_state == COORDINATE ? "COORD" : "PRESS",
++              pcap_ts->x, pcap_ts->y, pcap_ts->pressure);
++
++      switch (pcap_ts->read_state) {
++      case PRESSURE:
++              if (pcap_ts->pressure >= PRESSURE_MAX ||
++                   pcap_ts->pressure <= PRESSURE_MIN ) {
++                      /* pen has been released (or cant read pressure - WM)*/
++                      DEBUGP("UP\n");
++                      /* do nothing */
++              } else {
++                      /* pen has been touched down */
++                      DEBUGP("DOWN\n");
++                      input_report_key(pcap_ts->input, BTN_TOUCH, 1);
++                      input_report_abs(pcap_ts->input, ABS_PRESSURE, pcap_ts->pressure);
++              }
++              /* switch state machine into coordinate read mode */
++              pcap_ts->read_state = COORDINATE;
++              pcap_ts_mode(PCAP_TS_POSITION_XY_MEASUREMENT);
++              pcap_ts_start_xy_read(pcap_ts);
++              break;
++      case COORDINATE:
++              if (pcap_ts->x <= X_AXIS_MIN || pcap_ts->x >= X_AXIS_MAX ||
++                  pcap_ts->y <= Y_AXIS_MIN || pcap_ts->y >= Y_AXIS_MAX) {
++                      /* pen has been released */
++                      DEBUGP("UP END\n");
++
++                      input_report_key(pcap_ts->input, BTN_TOUCH, 0);
++                      input_report_abs(pcap_ts->input, ABS_PRESSURE, 0);
++
++                      /* no need for timer, we'll get interrupted with
++                       * next touch down event */
++                      del_timer(&pcap_ts->timer);
++
++                      /* ask PCAP2 to interrupt us if touch event happens
++                       * again */
++                      pcap_ts->read_state = STANDBY;
++                      pcap_ts_mode(PCAP_TS_STANDBY_MODE);
++                      ezx_pcap_bit_set(SSP_PCAP_ADJ_BIT_MSR_TSM, 0);
++              } else {
++                      DEBUGP("DOWN\n");
++                      input_report_abs(pcap_ts->input, ABS_X, pcap_ts->x);
++                      input_report_abs(pcap_ts->input, ABS_Y, pcap_ts->y);
++
++                      /* switch back to pressure read mode */
++                      pcap_ts->read_state = PRESSURE;
++                      pcap_ts_mode(PCAP_TS_PRESSURE_MEASUREMENT);
++                      mod_timer(&pcap_ts->timer, jiffies + SAMPLE_INTERVAL);
++              }
++              input_sync(pcap_ts->input);
++              break;
++      default:
++              DEBUGP("ERROR\n");
++              break;
++      }
++
++      return IRQ_HANDLED;
++}
++
++/* PCAP2 interrupts us if the pen touches down (interrupts also on pen up - WM)*/
++static irqreturn_t pcap_ts_irq_touch(int irq, void *dev_id)
++{
++      struct pcap_ts *pcap_ts = dev_id;
++
++      /* mask Touchscreen interrupt bit, prevents further touch events
++       * from being reported to us until we're finished with reading
++       * both pressure and x/y from ADC */
++      ezx_pcap_bit_set(SSP_PCAP_ADJ_BIT_MSR_TSM, 1);
++
++      DEBUGP("touched!!\n");
++      pcap_ts_mode(PCAP_TS_PRESSURE_MEASUREMENT);
++      pcap_ts->read_state = PRESSURE;
++      pcap_ts_start_xy_read(pcap_ts);
++
++      return IRQ_HANDLED;
++}
++
++static void pcap_ts_timer_fn(unsigned long data)
++{
++      struct pcap_ts *pcap_ts = (struct pcap_ts *) data;
++
++      pcap_ts_start_xy_read(pcap_ts);
++}
++
++static int __init ezxts_probe(struct platform_device *pdev)
++{
++      int ret;
++      u_int32_t tmp;
++      struct pcap_ts *pcap_ts;
++      struct input_dev *input_dev;
++      int err = -ENOMEM;
++
++      pcap_ts = kzalloc(sizeof(*pcap_ts), GFP_KERNEL);
++      input_dev = input_allocate_device();
++      if (!pcap_ts || !input_dev)
++              goto fail;
++
++      pcap_ts->irq_xy = platform_get_irq(pdev, 0);
++      if (pcap_ts->irq_xy < 0) {
++              err = pcap_ts->irq_xy;
++              goto fail;
++      }
++
++      pcap_ts->irq_touch = platform_get_irq(pdev, 1);
++      if (pcap_ts->irq_touch < 0) {
++              err = pcap_ts->irq_touch;
++              goto fail;
++      }
++
++      // Some initialization before done in ssp_pcap_open()
++      ezx_pcap_bit_set( SSP_PCAP_ADJ_BIT_ADC1_TS_REFENB, 0);
++      // ack interrupts
++      ezx_pcap_bit_set( SSP_PCAP_ADJ_BIT_ISR_ADCDONE2I, 1);
++      ezx_pcap_bit_set( SSP_PCAP_ADJ_BIT_ISR_TSI, 1);
++      // unmask interrupts
++      // ezx_pcap_bit_set( SSP_PCAP_ADJ_BIT_MSR_TSM, 0);
++      ezx_pcap_bit_set( SSP_PCAP_ADJ_BIT_MSR_ADCDONE2M, 0);
++      // set adc bits? FIXME I dont think its necessary - WM
++      ezx_pcap_bit_set( SSP_PCAP_ADJ_BIT_ADC2_ADINC1, 0);
++      ezx_pcap_bit_set( SSP_PCAP_ADJ_BIT_ADC2_ADINC2, 0);
++      ezx_pcap_bit_set( SSP_PCAP_ADJ_BIT_ADC1_ATO0, 0);
++      ezx_pcap_bit_set( SSP_PCAP_ADJ_BIT_ADC1_ATO1, 0);
++      ezx_pcap_bit_set( SSP_PCAP_ADJ_BIT_ADC1_ATO2, 0);
++      ezx_pcap_bit_set( SSP_PCAP_ADJ_BIT_ADC1_ATO3, 0);
++      ezx_pcap_bit_set( SSP_PCAP_ADJ_BIT_ADC1_ATOX, 0);
++      ezx_pcap_bit_set( SSP_PCAP_ADJ_BIT_ADC1_MTR1, 0);
++      ezx_pcap_bit_set( SSP_PCAP_ADJ_BIT_ADC1_MTR2, 0);
++
++      ret = ezx_pcap_read(SSP_PCAP_ADJ_ADC1_REGISTER, &tmp);
++      if (ret < 0)
++              return ret;
++
++      tmp &= (~SSP_PCAP_TOUCH_PANEL_POSITION_DETECT_MODE_MASK);
++      tmp |= PCAP_TS_STANDBY_MODE;
++
++      ret = ezx_pcap_write(SSP_PCAP_ADJ_ADC1_REGISTER, tmp);
++      if (ret < 0)
++              return ret;
++
++      err = request_irq(pcap_ts->irq_xy, pcap_ts_irq_xy, SA_INTERRUPT,
++                        "PCAP Touchscreen XY", pcap_ts);
++      if (err < 0) {
++              printk(KERN_ERR "pcap_ts: can't grab xy irq %d: %d\n",
++                     pcap_ts->irq_xy, err);
++              goto fail;
++      }
++
++      err = request_irq(pcap_ts->irq_touch, pcap_ts_irq_touch, SA_INTERRUPT,
++                        "PCAP Touchscreen Touch", pcap_ts);
++      if (err < 0) {
++              printk(KERN_ERR "pcap_ts: can't grab touch irq %d: %d\n",
++                     pcap_ts->irq_touch, err);
++              goto fail_xy;
++      }
++
++      pcap_ts->input = input_dev;
++      init_timer(&pcap_ts->timer);
++      pcap_ts->timer.data = (unsigned long) pcap_ts;
++      pcap_ts->timer.function = &pcap_ts_timer_fn;
++
++      platform_set_drvdata(pdev, pcap_ts);
++
++      pcap_ts->read_state = STANDBY;
++      pcap_ts_mode(PCAP_TS_STANDBY_MODE);
++
++      /* enable pressure interrupt */
++      ezx_pcap_bit_set(SSP_PCAP_ADJ_BIT_MSR_TSM, 0);
++
++      input_dev->name = "EZX PCAP2 Touchscreen";
++      input_dev->phys = "ezxts/input0";
++      input_dev->id.bustype = BUS_HOST;
++      input_dev->id.vendor = 0x0001;
++      input_dev->id.product = 0x0002;
++      input_dev->id.version = 0x0100;
++      input_dev->cdev.dev = &pdev->dev;
++      input_dev->private = pcap_ts;
++
++      input_dev->evbit[0] = BIT(EV_KEY) | BIT(EV_ABS);
++      input_dev->keybit[LONG(BTN_TOUCH)] = BIT(BTN_TOUCH);
++      input_set_abs_params(input_dev, ABS_X, X_AXIS_MIN, X_AXIS_MAX, 0, 0);
++      input_set_abs_params(input_dev, ABS_Y, Y_AXIS_MIN, Y_AXIS_MAX, 0, 0);
++      input_set_abs_params(input_dev, ABS_PRESSURE, PRESSURE_MIN,
++                           PRESSURE_MAX, 0, 0);
++
++      input_register_device(pcap_ts->input);
++
++      return 0;
++
++fail_xy:
++      free_irq(pcap_ts->irq_xy, pcap_ts);
++fail:
++      input_free_device(input_dev);
++      kfree(pcap_ts);
++
++      return err;
++}
++
++static int ezxts_remove(struct platform_device *pdev)
++{
++      struct pcap_ts *pcap_ts = platform_get_drvdata(pdev);
++
++      del_timer_sync(&pcap_ts->timer);
++
++      free_irq(pcap_ts->irq_touch, pcap_ts);
++      free_irq(pcap_ts->irq_xy, pcap_ts);
++
++      input_unregister_device(pcap_ts->input);
++      kfree(pcap_ts);
++
++      return 0;
++}
++
++static int ezxts_suspend(struct platform_device *dev, pm_message_t state)
++{
++      ezx_pcap_bit_set(SSP_PCAP_ADJ_BIT_ADC1_TS_REF_LOWPWR, 1);
++        return 0;
++}
++
++static int ezxts_resume(struct platform_device *dev)
++{
++      ezx_pcap_bit_set(SSP_PCAP_ADJ_BIT_ADC1_TS_REF_LOWPWR, 0);
++      /* just in case we suspend with TSI masked. */
++      ezx_pcap_bit_set(SSP_PCAP_ADJ_BIT_MSR_TSM, 0);
++        return 0;
++}
++
++
++static struct platform_driver ezxts_driver = {
++      .probe          = ezxts_probe,
++      .remove         = ezxts_remove,
++      .suspend        = ezxts_suspend,
++      .resume         = ezxts_resume,
++      .driver         = {
++              .name   = "pcap-ts",
++              .owner  = THIS_MODULE,
++      },
++};
++
++static int __init ezxts_init(void)
++{
++      return platform_driver_register(&ezxts_driver);
++}
++
++static void __exit ezxts_exit(void)
++{
++      platform_driver_unregister(&ezxts_driver);
++}
++
++module_init(ezxts_init);
++module_exit(ezxts_exit);
++
++MODULE_DESCRIPTION("Motorola PCAP2 touchscreen driver");
++MODULE_AUTHOR("Harald Welte <laforge@openezx.org>");
++MODULE_LICENSE("GPL");
+Index: linux-2.6.21/arch/arm/mach-pxa/ezx.c
+===================================================================
+--- linux-2.6.21.orig/arch/arm/mach-pxa/ezx.c  2007-05-03 19:09:25.000000000 -0300
++++ linux-2.6.21/arch/arm/mach-pxa/ezx.c       2007-05-03 19:15:57.000000000 -0300
+@@ -116,8 +116,32 @@
+       .resource       = ezxemu_resources,
+ };
+-/* OHCI Controller */
++/* PCAP_TS */
++struct resource pcap_ts_resources[] = {
++      [0] = {
++              .start          = EZX_IRQ_ADCDONE2,
++              .end            = EZX_IRQ_ADCDONE2,
++              .flags          = IORESOURCE_IRQ,
++      },
++      [1] = {
++              .start          = EZX_IRQ_TS,
++              .end            = EZX_IRQ_TS,
++              .flags          = IORESOURCE_IRQ,
++      }
++};
++struct platform_device pcap_ts_device = {
++      .name           = "pcap-ts",
++      .id             = -1,
++      .dev            = {
++              .parent         = &ezxpcap_device.dev,
++      },
++      .num_resources  = ARRAY_SIZE(pcap_ts_resources),
++      .resource       = pcap_ts_resources,
++};
++
++
++/* OHCI Controller */
+ static int ezx_ohci_init(struct device *dev)
+ {
+       /* for A780 support (connected with Neptune) */
+@@ -342,6 +366,7 @@
+       &ezxpcap_device,
+       &ezxbp_device,
+       &ezxemu_device,
++      &pcap_ts_device,
+ };
+ static void __init a780_init(void)
+Index: linux-2.6.21/drivers/input/touchscreen/Makefile
+===================================================================
+--- linux-2.6.21.orig/drivers/input/touchscreen/Makefile       2007-05-03 18:50:12.000000000 -0300
++++ linux-2.6.21/drivers/input/touchscreen/Makefile    2007-05-03 18:50:59.000000000 -0300
+@@ -16,3 +16,4 @@
+ obj-$(CONFIG_TOUCHSCREEN_TOUCHRIGHT)  += touchright.o
+ obj-$(CONFIG_TOUCHSCREEN_TOUCHWIN)    += touchwin.o
+ obj-$(CONFIG_TOUCHSCREEN_UCB1400)     += ucb1400_ts.o
++obj-$(CONFIG_TOUCHSCREEN_PCAP) += pcap_ts.o
index 28be2b8..35dc2df 100644 (file)
@@ -5,7 +5,7 @@ HOMEPAGE = "http://www.openezx.org"
 LICENSE = "GPL"
 DEPENDS += "quilt-native"
 EZX = "ezx0"
-PR = "${EZX}-r3"
+PR = "${EZX}-r4"
 
 inherit kernel
 
@@ -18,6 +18,7 @@ RPSRC = "http://www.rpsys.net/openzaurus/patches/archive"
 SRC_URI = " \
         ${KERNELORG_MIRROR}/pub/linux/kernel/v2.6/linux-${PV}.tar.bz2 \
        file://ezx-core.patch;patch=1 \
+       file://ezx-pm.patch;patch=1 \
        file://ezx-pcap.patch;patch=1 \
        file://ezx-mci.patch;patch=1 \
        file://pxa27x-udc-support.2.patch;patch=1 \
@@ -26,7 +27,7 @@ SRC_URI = " \
        file://ezx-serial-bug-workaround.patch;patch=1 \
        file://pxa-kbd.patch;patch=1 \
        file://ezx-kbd.patch;patch=1 \
-       file://ezx-pm.patch;patch=1 \
+       file://pcap-ts.patch;patch=1 \
        file://mux_cli.patch;patch=1 \
        file://mux-fix.patch;patch=1 \
        file://mux-fix-init-errorpath.patch;patch=1 \
@@ -38,9 +39,6 @@ SRC_URI = " \
        file://mux-linux-2.6.21-fix.patch;patch=1 \
        file://mux-ifdef-ezx-features.patch;patch=1 \
        file://mux_debug.patch;patch=1 \
-       file://ezx-ts.patch;patch=1 \
-       file://pcap_ts.c.patch;patch=1 \
-       file://touchscreen-fix-r0.patch;patch=1 \
         file://logo_linux_clut224.ppm \
         file://defconfig-a780 \
         file://defconfig-e680 \