diff options
Diffstat (limited to 'packages/linux/linux-rp-2.6.23+2.6.24-rc6+git/hx2750_base-r31.patch')
-rw-r--r-- | packages/linux/linux-rp-2.6.23+2.6.24-rc6+git/hx2750_base-r31.patch | 1094 |
1 files changed, 0 insertions, 1094 deletions
diff --git a/packages/linux/linux-rp-2.6.23+2.6.24-rc6+git/hx2750_base-r31.patch b/packages/linux/linux-rp-2.6.23+2.6.24-rc6+git/hx2750_base-r31.patch deleted file mode 100644 index 5d58bcf55d..0000000000 --- a/packages/linux/linux-rp-2.6.23+2.6.24-rc6+git/hx2750_base-r31.patch +++ /dev/null @@ -1,1094 +0,0 @@ ---- - arch/arm/mach-pxa/Kconfig | 10 - arch/arm/mach-pxa/Makefile | 1 - arch/arm/mach-pxa/hx2750.c | 450 ++++++++++++++++++++++++++++++++++++++ - arch/arm/mach-pxa/hx2750_test.c | 433 ++++++++++++++++++++++++++++++++++++ - arch/arm/mach-pxa/pm.c | 5 - arch/arm/mach-pxa/pxa25x.c | 4 - arch/arm/mach-pxa/pxa27x.c | 4 - include/asm-arm/arch-pxa/hx2750.h | 90 +++++++ - 8 files changed, 995 insertions(+), 2 deletions(-) - ---- /dev/null -+++ linux-2.6.24-rc1/include/asm-arm/arch-pxa/hx2750.h -@@ -0,0 +1,90 @@ -+/* -+ * Hardware specific definitions for iPAQ hx2750 -+ * -+ * Copyright 2005 Openedhand Ltd. -+ * -+ * Author: Richard Purdie <richard@o-hand.com> -+ * -+ * 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. -+ * -+ */ -+#ifndef __ASM_ARCH_HX2750_H -+#define __ASM_ARCH_HX2750_H 1 -+ -+/* -+ * HX2750 (Non Standard) GPIO Definitions -+ */ -+ -+#define HX2750_GPIO_KEYPWR (0) /* Power button */ -+#define HX2750_GPIO_BATTCOVER1 (9) /* Battery Cover Switch */ -+#define HX2750_GPIO_CF_IRQ (11) /* CF IRQ? */ -+#define HX2750_GPIO_USBCONNECT (12) /* USB Connected? */ -+#define HX2750_GPIO_CF_DETECT (13) /* CF Card Detect? */ -+#define HX2750_GPIO_EXTPWR (14) /* External Power Detect */ -+#define HX2750_GPIO_BATLVL (15) /* Battery Level Detect */ -+#define HX2750_GPIO_CF_PWR (17) /* CF Power? */ -+#define HX2750_GPIO_SR_STROBE (18) /* Shift Register Strobe */ -+#define HX2750_GPIO_CHARGE (22) /* Charging Enable (active low) */ -+#define HX2750_GPIO_TSC2101_SS (24) /* TSC2101 SS# */ -+#define HX2750_GPIO_BTPWR (27) /* Bluetooth Power? */ -+#define HX2750_GPIO_BATTCOVER2 (33) /* Battery Cover Switch */ -+#define HX2750_GPIO_SD_DETECT (38) /* MMC Card Detect */ -+#define HX2750_GPIO_SR_CLK1 (52) /* Shift Register Clock */ -+#define HX2750_GPIO_SR_CLK2 (53) -+#define HX2750_GPIO_CF_WIFIIRQ (54) /* CF Wifi IRQ? */ -+#define HX2750_GPIO_GPIO_DIN (88) /* Shift Register Data */ -+#define HX2750_GPIO_KEYLEFT (90) /* Left button */ -+#define HX2750_GPIO_KEYRIGHT (91) /* Right button */ -+#define HX2750_GPIO_KEYCAL (93) /* Calander button */ -+#define HX2750_GPIO_KEYTASK (94) /* Task button */ -+#define HX2750_GPIO_KEYSIDE (95) /* Side button */ -+#define HX2750_GPIO_KEYENTER (96) /* Enter Button*/ -+#define HX2750_GPIO_KEYCON (97) /* Contacts button */ -+#define HX2750_GPIO_KEYMAIL (98) /* Mail button */ -+#define HX2750_GPIO_BIOPWR (99) /* BIO Reader Power? */ -+#define HX2750_GPIO_KEYUP (100) /* Up button */ -+#define HX2750_GPIO_KEYDOWN (101) /* Down button*/ -+#define HX2750_GPIO_SD_READONLY (103) /* MMC/SD Write Protection */ -+#define HX2750_GPIO_LEDMAIL (106) /* Green Mail LED */ -+#define HX2750_GPIO_HP_JACK (108) /* Head Phone Jack Present */ -+#define HX2750_GPIO_PENDOWN (117) /* Touch Screen Pendown */ -+ -+ -+//#define HX2750_GPIO_ () /* */ -+ -+/* -+ * HX2750 Interrupts -+ */ -+#define HX2750_IRQ_GPIO_EXTPWR IRQ_GPIO(HX2750_GPIO_EXTPWR) -+#define HX2750_IRQ_GPIO_SD_DETECT IRQ_GPIO(HX2750_GPIO_SD_DETECT) -+#define HX2750_IRQ_GPIO_PENDOWN IRQ_GPIO(HX2750_GPIO_PENDOWN) -+#define HX2750_IRQ_GPIO_CF_DETECT IRQ_GPIO(HX2750_GPIO_CF_DETECT) -+#define HX2750_IRQ_GPIO_CF_IRQ IRQ_GPIO(HX2750_GPIO_CF_IRQ) -+#define HX2750_IRQ_GPIO_CF_WIFIIRQ IRQ_GPIO(HX2750_GPIO_CF_WIFIIRQ) -+ -+/* -+ * HX2750 Extra GPIO Definitions -+ */ -+ -+#define HX2750_EGPIO_WIFI_PWR (1 << 11) /* Wifi power */ -+#define HX2750_EGPIO_LCD_PWR (1 << 10) /* LCD Power */ -+#define HX2750_EGPIO_BL_PWR (1 << 9) /* Backlight LED Power */ -+#define HX2750_EGPIO_8 (1 << 8) /* */ -+#define HX2750_EGPIO_7 (1 << 7) /* */ -+#define HX2750_EGPIO_SD_PWR (1 << 6) /* SD Power */ -+#define HX2750_EGPIO_TSC_PWR (1 << 5) /* TS Power */ -+#define HX2750_EGPIO_CF0_RESET (1 << 4) /* CF0 Reset */ -+#define HX2750_EGPIO_CF1_RESET (1 << 3) /* CF1 Reset */ -+#define HX2750_EGPIO_2 (1 << 2) /* Power/Red LED Related?*/ -+#define HX2750_EGPIO_1 (1 << 1) /* Power/Red LED Related?*/ -+#define HX2750_EGPIO_PWRLED (1 << 0) /* Power/Red LED Related?*/ -+ -+ -+void hx2750_set_egpio(unsigned int gpio); -+void hx2750_clear_egpio(unsigned int gpio); -+ -+ -+#endif /* __ASM_ARCH_HX2750_H */ -+ ---- linux-2.6.24-rc1.orig/arch/arm/mach-pxa/Makefile -+++ linux-2.6.24-rc1/arch/arm/mach-pxa/Makefile -@@ -22,6 +22,7 @@ - obj-$(CONFIG_MACH_POODLE) += poodle.o corgi_ssp.o - obj-$(CONFIG_MACH_TOSA) += tosa.o - obj-$(CONFIG_MACH_EM_X270) += em-x270.o -+obj-$(CONFIG_MACH_HX2750) += hx2750.o hx2750_test.o - - ifeq ($(CONFIG_MACH_ZYLONITE),y) - obj-y += zylonite.o ---- /dev/null -+++ linux-2.6.24-rc1/arch/arm/mach-pxa/hx2750_test.c -@@ -0,0 +1,433 @@ -+/* -+ * HP iPAQ hx2750 Test Development Code -+ * -+ * Copyright 2005 Openedhand Ltd. -+ * -+ * Author: Richard Purdie <richard@o-hand.com> -+ * -+ * 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/init.h> -+#include <linux/kernel.h> -+#include <linux/ioport.h> -+#include <linux/device.h> -+#include <linux/input.h> -+#include <linux/delay.h> -+#include <linux/interrupt.h> -+ -+#include <asm/mach-types.h> -+#include <asm/hardware.h> -+#include <asm/mach/arch.h> -+ -+#include <asm/arch/hx2750.h> -+#include <asm/arch/pxa-regs.h> -+ -+ -+static int prodval; -+ -+/* -+ * Sysfs functions -+ */ -+static ssize_t test1_show(struct device *dev, char *buf) -+{ -+ unsigned long rp; -+ -+ asm ("mrc p15, 0, %0, cr1, cr0;\n" :"=r"(rp) ); -+ printk("%lx\n",rp); -+ -+ asm ("mrc p15, 0, %0, cr1, cr1;\n" :"=r"(rp) ); -+ printk("%lx\n",rp); -+ -+ asm ("mrc p15, 0, %0, cr2, cr0;\n" :"=r"(rp) ); -+ printk("%lx\n",rp); -+ -+ asm ("mrc p15, 0, %0, cr3, cr0;\n" :"=r"(rp) ); -+ printk("%lx\n",rp); -+ -+ asm ("mrc p15, 0, %0, cr13, cr0;\n" :"=r"(rp) ); -+ printk("%lx\n",rp); -+ -+ return sprintf(buf, "%d\n",prodval); -+} -+extern void tsc2101_print_miscdata(struct device *dev); -+extern struct platform_device tsc2101_device; -+ -+static ssize_t test1_store(struct device *dev, const char *buf, size_t count) -+{ -+ prodval = simple_strtoul(buf, NULL, 10); -+ -+ tsc2101_print_miscdata(&tsc2101_device.dev); -+ -+ return count; -+} -+ -+static DEVICE_ATTR(test1, 0644, test1_show, test1_store); -+ -+static ssize_t test2_show(struct device *dev, char *buf) -+{ -+ printk(KERN_ERR "SSCR0_P2: %08x\n", SSCR0_P2); -+ printk(KERN_ERR "SSCR1_P2: %08x\n", SSCR1_P2); -+ printk(KERN_ERR "SSSR_P2: %08x\n", SSSR_P2); -+ printk(KERN_ERR "SSITR_P2: %08x\n", SSITR_P2); -+ printk(KERN_ERR "SSDR_P2: %08x\n", SSDR_P2); -+ printk(KERN_ERR "SSTO_P2: %08x\n", SSTO_P2); -+ printk(KERN_ERR "SSPSP_P2: %08x\n", SSPSP_P2); -+ -+ hx2750_ssp_init2(); -+ -+ printk(KERN_ERR "SSCR0_P2: %08x\n", SSCR0_P2); -+ printk(KERN_ERR "SSCR1_P2: %08x\n", SSCR1_P2); -+ printk(KERN_ERR "SSSR_P2: %08x\n", SSSR_P2); -+ printk(KERN_ERR "SSITR_P2: %08x\n", SSITR_P2); -+ printk(KERN_ERR "SSDR_P2: %08x\n", SSDR_P2); -+ printk(KERN_ERR "SSTO_P2: %08x\n", SSTO_P2); -+ printk(KERN_ERR "SSPSP_P2: %08x\n", SSPSP_P2); -+ -+ return sprintf(buf, "%d\n",0); -+} -+ -+static DEVICE_ATTR(test2, 0444, test2_show, NULL); -+ -+extern unsigned int hx2750_egpio_current; -+ -+static ssize_t setegpio_show(struct device *dev, char *buf) -+{ -+ return sprintf(buf, "%x\n",hx2750_egpio_current); -+} -+ -+static ssize_t setegpio_store(struct device *dev, const char *buf, size_t count) -+{ -+ unsigned int val = simple_strtoul(buf, NULL, 10); -+ -+ hx2750_set_egpio(1 << val); -+ -+ return count; -+} -+ -+static DEVICE_ATTR(setegpio, 0644, setegpio_show, setegpio_store); -+ -+static ssize_t clregpio_show(struct device *dev, char *buf) -+{ -+ return sprintf(buf, "%x\n",hx2750_egpio_current); -+} -+ -+static ssize_t gpio_show(struct device *dev, char *buf) -+{ -+ int i; -+ -+ printk(KERN_ERR "GPIO# D S A INTER\n"); -+ -+ for (i=0;i<119;i++) { -+ printk(KERN_ERR " %3d: ",i); -+ if (GPDR(i) & GPIO_bit(i)) -+ printk("O "); -+ else -+ printk("I "); -+ printk("%d ",(GPLR(i) & GPIO_bit(i)) != 0); -+ printk("%d ",((GAFR(i) & (0x3 << (((i) & 0xf)*2)))) >> (((i) & 0xf)*2) ); -+ if (GEDR(i) & GPIO_bit(i)) -+ printk("ED "); -+ if (GRER(i) & GPIO_bit(i)) -+ printk("RE "); -+ if (GFER(i) & GPIO_bit(i)) -+ printk("FE "); -+ -+ printk("\n"); -+ } -+ return sprintf(buf, "EGPIO: %x\n",hx2750_egpio_current); -+} -+ -+static ssize_t clregpio_store(struct device *dev, const char *buf, size_t count) -+{ -+ unsigned int val = simple_strtoul(buf, NULL, 10); -+ -+ hx2750_clear_egpio(1 << val); -+ -+ return count; -+} -+ -+static DEVICE_ATTR(clregpio, 0644, clregpio_show, clregpio_store); -+ -+ -+static ssize_t gpioclr_store(struct device *dev, const char *buf, size_t count) -+{ -+ int prod; -+ prod = simple_strtoul(buf, NULL, 10); -+ -+ GPCR(prod) = GPIO_bit(prod); -+ -+ return count; -+} -+ -+static DEVICE_ATTR(gpioclr, 0644, gpio_show, gpioclr_store); -+ -+static ssize_t gpioset_store(struct device *dev, const char *buf, size_t count) -+{ -+ int prod; -+ prod = simple_strtoul(buf, NULL, 10); -+ -+ GPSR(prod) = GPIO_bit(prod); -+ -+ return count; -+} -+ -+static DEVICE_ATTR(gpioset, 0644, gpio_show, gpioset_store); -+ -+ -+static ssize_t ssp2read_store(struct device *dev, const char *buf, size_t count) -+{ -+ unsigned int val = simple_strtoul(buf, NULL, 16); -+ -+ printk("Read: %08x\n",hx2750_ssp2_read(val)); -+ -+ return count; -+} -+ -+static DEVICE_ATTR(ssp2read, 0200, NULL, ssp2read_store);
-+
-+static ssize_t ssp2write_store(struct device *dev, const char *buf, size_t count) -+{ -+ unsigned int val = simple_strtoul(buf, NULL, 16); -+ -+ printk("Write: %08x\n",hx2750_ssp2_write(val)); -+ -+ return count; -+} -+ -+static DEVICE_ATTR(ssp2write, 0200, NULL, ssp2write_store); -+ -+ -+static ssize_t sspr_store(struct device *dev, const char *buf, size_t count) -+{ -+ unsigned long val,ret; -+ val = simple_strtoul(buf, NULL, 0); -+ -+ hx2750_tsc2101_send(1<<15,val,&ret,1); -+ -+ printk("Response: %x\n",ret); -+ -+ return count; -+} -+ -+static DEVICE_ATTR(sspr, 0200, NULL, sspr_store); -+ -+static ssize_t sspw_store(struct device *dev, const char *buf, size_t count) -+{ -+ int val,ret; -+ sscanf(buf, "%lx %lx", &val, &ret); -+ -+ hx2750_tsc2101_send(0,val,&ret,1); -+ -+ return count; -+} -+ -+static DEVICE_ATTR(sspw, 0200, NULL, sspw_store); -+ -+ -+extern struct pm_ops pxa_pm_ops; -+extern void pxa_cpu_resume(void); -+extern unsigned long pxa_pm_pspr_value; -+ -+static int (*pxa_pm_enter_orig)(suspend_state_t state); -+ -+//static struct { -+// u32 ffier, fflcr, ffmcr, ffspr, ffisr, ffdll, ffdlh; -+//} sys_ctx; -+ -+u32 resstruct[20]; -+ -+static int hx2750_pxa_pm_enter(suspend_state_t state) -+{ -+ int i; -+ u32 save[10]; -+ -+ PWER = 0xC0000003;// | PWER_RTC; -+ PFER = 0x00000003; -+ PRER = 0x00000003; -+ -+ PGSR0=0x00000018; -+ PGSR1=0x00000380; -+ PGSR2=0x00800000; -+ PGSR3=0x00500400; -+ -+ //PVCR=0x494; or 0x14; -+ //PVCR=0x14; -+ //PCMD0=0x41f; -+ //i=PISR; -+ //PICR=0x00000062; -+ -+ //PCFR=0x457; -+ //PCFR=0x70; // Does not resume from sleep -+ PCFR=0x077; // was 0x477 -+ PSLR=0xff100004; -+ -+ resstruct[0]=0x0000b4e6; -+ resstruct[1]=0x00000001; -+ resstruct[2]=virt_to_phys(pxa_cpu_resume); -+ resstruct[3]=0xffffffff; //value for r0 -+ -+ resstruct[14]=0x00000078; //mcr 15, 0, r0, cr1, cr0, {0} -+ resstruct[15]=0x00000000; //mcr 15, 0, r0, cr1, cr1, {0} 0xffffffff
-+ resstruct[16]=0xa0000000; //mcr 15, 0, r0, cr2, cr0, {0} 0xa0748000
-+ resstruct[17]=0x00000001; //mcr 15, 0, r0, cr3, cr0, {0} 0x00000015
-+ resstruct[18]=0x00000000; //mcr 15, 0, r0, cr13, cr0, {0} 0x00000000
-+ -+ pxa_pm_pspr_value=virt_to_phys(&resstruct[0]); -+ -+ hx2750_send_egpio(3); -+ -+ pxa_gpio_mode(87 | GPIO_OUT | GPIO_DFLT_HIGH); -+ -+ //sys_ctx.ffier = FFIER; -+ //sys_ctx.fflcr = FFLCR; -+ //sys_ctx.ffmcr = FFMCR; -+ //sys_ctx.ffspr = FFSPR; -+ //sys_ctx.ffisr = FFISR; -+ //FFLCR |= 0x80; -+ //sys_ctx.ffdll = FFDLL; -+ //sys_ctx.ffdlh = FFDLH; -+ //FFLCR &= 0xef; -+ -+ pxa_pm_enter_orig(state); -+ -+ //FFMCR = sys_ctx.ffmcr; -+ //FFSPR = sys_ctx.ffspr; -+ //FFLCR = sys_ctx.fflcr; -+ //FFLCR |= 0x80; -+ //FFDLH = sys_ctx.ffdlh; -+ //FFDLL = sys_ctx.ffdll; -+ //FFLCR = sys_ctx.fflcr; -+ //FFISR = sys_ctx.ffisr; -+ //FFLCR = 0x07; -+ //FFIER = sys_ctx.ffier; -+ -+ return 0; -+} -+ -+static irqreturn_t hx2750_charge_int(int irq, void *dev_id, struct pt_regs *regs) -+{ -+ if ((GPLR(HX2750_GPIO_EXTPWR) & GPIO_bit(HX2750_GPIO_EXTPWR)) == 0) { -+ printk("Charging On\n"); -+ GPCR(HX2750_GPIO_CHARGE); -+ } else { -+ printk("Charging Off\n"); -+ GPSR(HX2750_GPIO_CHARGE); -+ } -+ -+ return IRQ_HANDLED; -+} -+ -+ -+ -+ -+static irqreturn_t hx2750_interrupt(int irq, void *dev_id, struct pt_regs *regs) -+{ -+ printk("Input %d changed.\n", irq-32); -+ -+ return IRQ_HANDLED; -+} -+ -+ -+static int __init hx2750_test_probe(struct device *dev) -+{ -+ pxa_gpio_mode(21 | GPIO_OUT | GPIO_DFLT_HIGH); -+ pxa_gpio_mode(HX2750_GPIO_CHARGE | GPIO_OUT | GPIO_DFLT_HIGH); -+ pxa_gpio_mode(83 | GPIO_OUT | GPIO_DFLT_HIGH); -+ pxa_gpio_mode(HX2750_GPIO_BIOPWR | GPIO_OUT | GPIO_DFLT_HIGH); -+ pxa_gpio_mode(116 | GPIO_OUT | GPIO_DFLT_HIGH); -+ pxa_gpio_mode(118 | GPIO_OUT | GPIO_DFLT_HIGH); -+ -+ -+ //pxa_gpio_mode(HX2750_GPIO_CF_PWR | GPIO_OUT | GPIO_DFLT_LOW); -+ pxa_gpio_mode(HX2750_GPIO_CF_PWR | GPIO_OUT | GPIO_DFLT_HIGH); -+ pxa_gpio_mode(HX2750_GPIO_BTPWR | GPIO_OUT | GPIO_DFLT_LOW); -+ pxa_gpio_mode(79 | GPIO_OUT | GPIO_DFLT_LOW); -+ pxa_gpio_mode(85 | GPIO_OUT | GPIO_DFLT_LOW); -+ pxa_gpio_mode(HX2750_GPIO_LEDMAIL | GPIO_OUT | GPIO_DFLT_LOW); -+ pxa_gpio_mode(107 | GPIO_OUT | GPIO_DFLT_LOW); -+ pxa_gpio_mode(114 | GPIO_OUT | GPIO_DFLT_LOW); -+ -+ pxa_gpio_mode(HX2750_GPIO_BATTCOVER1 | GPIO_IN); -+ pxa_gpio_mode(HX2750_GPIO_BATTCOVER2 | GPIO_IN); -+ pxa_gpio_mode(HX2750_GPIO_CF_IRQ | GPIO_IN); -+ pxa_gpio_mode(HX2750_GPIO_USBCONNECT | GPIO_IN); -+ pxa_gpio_mode(HX2750_GPIO_CF_DETECT | GPIO_IN); -+ pxa_gpio_mode(HX2750_GPIO_EXTPWR | GPIO_IN); -+ -+ pxa_gpio_mode(HX2750_GPIO_BATLVL | GPIO_IN); -+ //pxa_gpio_mode(HX2750_GPIO_CF_WIFIIRQ | GPIO_IN); -+ pxa_gpio_mode(80 | GPIO_IN); -+ pxa_gpio_mode(HX2750_GPIO_HP_JACK | GPIO_IN); -+ pxa_gpio_mode(115 | GPIO_IN); -+ pxa_gpio_mode(119 | GPIO_IN); -+ -+ request_irq(IRQ_GPIO(HX2750_GPIO_BATLVL), hx2750_interrupt, SA_INTERRUPT, "hx2750test", NULL); -+ //request_irq(IRQ_GPIO(HX2750_GPIO_CF_WIFIIRQ), hx2750_interrupt, SA_INTERRUPT, "hx2750test", NULL); -+ request_irq(IRQ_GPIO(80), hx2750_interrupt, SA_INTERRUPT, "hx2750test", NULL); -+ request_irq(IRQ_GPIO(115), hx2750_interrupt, SA_INTERRUPT, "hx2750test", NULL); -+ request_irq(IRQ_GPIO(119), hx2750_interrupt, SA_INTERRUPT, "hx2750test", NULL); -+ request_irq(IRQ_GPIO(HX2750_GPIO_SR_CLK2), hx2750_interrupt, SA_INTERRUPT, "hx2750test", NULL); -+ -+ //request_irq(IRQ_GPIO(10), hx2750_interrupt, SA_INTERRUPT, "hx2750test", NULL); -+ -+ set_irq_type(IRQ_GPIO(HX2750_GPIO_BATLVL),IRQT_BOTHEDGE); -+ //set_irq_type(IRQ_GPIO(HX2750_GPIO_CF_WIFIIRQ),IRQT_BOTHEDGE); -+ set_irq_type(IRQ_GPIO(80),IRQT_BOTHEDGE); -+ set_irq_type(IRQ_GPIO(115),IRQT_BOTHEDGE); -+ set_irq_type(IRQ_GPIO(119),IRQT_BOTHEDGE); -+ set_irq_type(IRQ_GPIO(HX2750_GPIO_SR_CLK2),IRQT_BOTHEDGE); -+ -+ //set_irq_type(IRQ_GPIO(10),IRQT_BOTHEDGE); -+ -+ printk("hx2750 Test Code Initialized.\n"); -+ device_create_file(dev, &dev_attr_test1); -+ device_create_file(dev, &dev_attr_test2); -+ device_create_file(dev, &dev_attr_setegpio); -+ device_create_file(dev, &dev_attr_clregpio); -+ device_create_file(dev, &dev_attr_gpioset); -+ device_create_file(dev, &dev_attr_gpioclr); -+ device_create_file(dev, &dev_attr_sspr); -+ device_create_file(dev, &dev_attr_sspw); -+ device_create_file(dev, &dev_attr_ssp2read); -+ device_create_file(dev, &dev_attr_ssp2write); -+ -+ request_irq(HX2750_IRQ_GPIO_EXTPWR, hx2750_charge_int, SA_INTERRUPT, "hx2750_extpwr", NULL); -+ set_irq_type(HX2750_IRQ_GPIO_EXTPWR, IRQT_BOTHEDGE); -+ -+ pxa_pm_enter_orig=pxa_pm_ops.enter; -+ pxa_pm_ops.enter=hx2750_pxa_pm_enter; -+ -+ return 0; -+} -+ -+static struct device_driver hx2750_test_driver = { -+ .name = "hx2750-test", -+ .bus = &platform_bus_type, -+ .probe = hx2750_test_probe, -+// .remove = hx2750_bl_remove, -+// .suspend = hx2750_bl_suspend, -+// .resume = hx2750_bl_resume, -+}; -+ -+ -+static int __init hx2750_test_init(void) -+{ -+ return driver_register(&hx2750_test_driver); -+} -+ -+ -+static void __exit hx2750_test_exit(void) -+{ -+ driver_unregister(&hx2750_test_driver); -+} -+ -+module_init(hx2750_test_init); -+module_exit(hx2750_test_exit); -+ -+MODULE_AUTHOR("Richard Purdie <richard@o-hand.com>"); -+MODULE_DESCRIPTION("iPAQ hx2750 Backlight Driver"); -+MODULE_LICENSE("GPLv2"); ---- linux-2.6.24-rc1.orig/arch/arm/mach-pxa/Kconfig -+++ linux-2.6.24-rc1/arch/arm/mach-pxa/Kconfig -@@ -83,6 +83,15 @@ - bool "Sharp PXA270 models (SL-Cxx00)" - select PXA27x - -+config MACH_HX2750 -+ bool "HP iPAQ hx2750" -+ select PXA27x -+ select PXA_KEYS -+ select MFD_TSC2101 -+ select PXA_SSP -+ help -+ This enables support for the HP iPAQ HX2750 handheld. -+ - endchoice - - endif -@@ -181,3 +190,4 @@ - help - Enable support for PXA2xx SSP ports - endif -+ ---- /dev/null -+++ linux-2.6.24-rc1/arch/arm/mach-pxa/hx2750.c -@@ -0,0 +1,450 @@ -+/* -+ * Machine definitions for HP iPAQ hx2750 -+ * -+ * Copyright 2005 Openedhand Ltd. -+ * -+ * Author: Richard Purdie <richard@o-hand.com> -+ * -+ * 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/init.h> -+#include <linux/kernel.h> -+#include <linux/ioport.h> -+#include <linux/platform_device.h> -+#include <linux/delay.h> -+#include <linux/input.h> -+#include <linux/irq.h> -+#include <linux/mmc/host.h> -+#include <linux/mfd/tsc2101.h> -+ -+#include <asm/mach-types.h> -+#include <asm/hardware.h> -+#include <asm/mach/arch.h> -+ -+#include <asm/arch/hx2750.h> -+#include <asm/arch/pxa-regs.h> -+#include <asm/arch/pxa_keys.h> -+#include <asm/mach/map.h> -+#include <asm/arch/udc.h> -+#include <asm/arch/mmc.h> -+#include <asm/arch/audio.h> -+#include <asm/arch/pxafb.h> -+#include <asm/arch/ssp.h> -+ -+#include "generic.h" -+ -+ -+/* -+ * Keys Support -+ */ -+static struct pxa_keys_button hx2750_button_table[] = { -+ { KEY_POWER, HX2750_GPIO_KEYPWR, PXAKEY_PWR_KEY }, -+ { KEY_LEFT, HX2750_GPIO_KEYLEFT, 0 }, -+ { KEY_RIGHT, HX2750_GPIO_KEYRIGHT, 0 }, -+ { KEY_KP0, HX2750_GPIO_KEYCAL, 0 }, -+ { KEY_KP1, HX2750_GPIO_KEYTASK, 0 }, -+ { KEY_KP2, HX2750_GPIO_KEYSIDE, 0 }, -+ { KEY_ENTER, HX2750_GPIO_KEYENTER, 0 }, -+ { KEY_KP3, HX2750_GPIO_KEYCON, 0 }, //KEY_CONTACTS -+ { KEY_MAIL, HX2750_GPIO_KEYMAIL, 0 }, -+ { KEY_UP, HX2750_GPIO_KEYUP, 0 }, -+ { KEY_DOWN, HX2750_GPIO_KEYDOWN, 0 }, -+}; -+ -+static struct pxa_keys_platform_data hx2750_pxa_keys_data = { -+ .buttons = hx2750_button_table, -+ .nbuttons = ARRAY_SIZE(hx2750_button_table), -+}; -+ -+static struct platform_device hx2750_pxa_keys = { -+ .name = "pxa2xx-keys", -+ .dev = { -+ .platform_data = &hx2750_pxa_keys_data, -+ }, -+}; -+ -+ -+/* -+ * Backlight Device -+ */ -+extern struct platform_device pxafb_device; -+ -+static struct platform_device hx2750_bl_device = { -+ .name = "hx2750-bl", -+ .id = -1, -+// .dev = { -+// .parent = &pxafb_device.dev, -+// } -+}; -+ -+ -+/* -+ * UDC/USB -+ */ -+static int hx2750_udc_is_connected (void) -+{ -+ return GPLR0 & GPIO_bit(HX2750_GPIO_USBCONNECT); -+} -+ -+//static void hx2750_udc_command (int cmd) -+//{ -+//} -+ -+static struct pxa2xx_udc_mach_info hx2750_udc_mach_info = { -+ .udc_is_connected = hx2750_udc_is_connected, -+// .udc_command = hx2750_udc_command, -+}; -+ -+ -+/* -+ * SSP Devices Setup -+ */ -+static struct ssp_dev hx2750_ssp_dev1; -+static struct ssp_dev hx2750_ssp_dev2; -+static struct ssp_dev hx2750_ssp_dev3; -+ -+void hx2750_ssp_init(void) -+{ -+ pxa_gpio_mode(HX2750_GPIO_TSC2101_SS | GPIO_OUT | GPIO_DFLT_HIGH); -+ -+ if (ssp_init(&hx2750_ssp_dev1, 1, 0)) -+ printk(KERN_ERR "Unable to register SSP1 handler!\n"); -+ else { -+ ssp_disable(&hx2750_ssp_dev1); -+ ssp_config(&hx2750_ssp_dev1, (SSCR0_Motorola | (SSCR0_DSS & 0x0f )), SSCR1_SPH, 0, SSCR0_SerClkDiv(6)); -+ ssp_enable(&hx2750_ssp_dev1); -+ hx2750_set_egpio(HX2750_EGPIO_TSC_PWR); -+ } -+ -+// if (ssp_init(&hx2750_ssp_dev2, 2, 0)) -+// printk(KERN_ERR "Unable to register SSP2 handler!\n"); -+// else { -+// ssp_disable(&hx2750_ssp_dev2); -+// ssp_config(&hx2750_ssp_dev2, (SSCR0_TI | (SSCR0_DSS & 0x09 )), 0, 0, SSCR0_SerClkDiv(140)); -+// ssp_enable(&hx2750_ssp_dev2); -+// } -+// -+ if (ssp_init(&hx2750_ssp_dev3, 3, 0)) -+ printk(KERN_ERR "Unable to register SSP3 handler!\n"); -+ else { -+ ssp_disable(&hx2750_ssp_dev3); -+ ssp_config(&hx2750_ssp_dev3, (SSCR0_Motorola | (SSCR0_DSS & 0x07 )), SSCR1_SPO | SSCR1_SPH, 0, SSCR0_SerClkDiv(166)); -+ ssp_enable(&hx2750_ssp_dev3); -+ } -+ -+ printk("SSP Devices Initialised\n"); -+ -+ return; -+} -+ -+struct ssp_state ssp1; -+ -+void hx2750_ssp_suspend(void) -+{ -+ ssp_disable(&hx2750_ssp_dev1); -+ ssp_save_state(&hx2750_ssp_dev1,&ssp1); -+ hx2750_clear_egpio(HX2750_EGPIO_TSC_PWR); -+} -+ -+void hx2750_ssp_resume(void) -+{ -+ hx2750_set_egpio(HX2750_EGPIO_TSC_PWR); -+ ssp_restore_state(&hx2750_ssp_dev1,&ssp1); -+ ssp_enable(&hx2750_ssp_dev1); -+} -+ -+void hx2750_ssp_init2(void) -+{ -+ printk("Stage 1: %x\n",CKEN); -+ if (ssp_init(&hx2750_ssp_dev2, 2, 0)) -+ printk(KERN_ERR "Unable to register SSP2 handler!\n"); -+ else { -+ printk("Stage 2: %x\n",CKEN); -+ ssp_disable(&hx2750_ssp_dev2); -+ printk("Stage 3: %x\n",CKEN); -+ ssp_config(&hx2750_ssp_dev2, (SSCR0_TI | (SSCR0_DSS & 0x09 )) | SSCR0_SSE, 0, 0, SSCR0_SerClkDiv(212)); -+ printk("Stage 4: %x\n",CKEN); -+ ssp_enable(&hx2750_ssp_dev2); -+ printk("Stage 5: %x\n",CKEN); -+ } -+ printk("SSP Device2 Initialised\n"); -+ -+ printk("Sent: 0x3ff\n"); -+ ssp_write_word(&hx2750_ssp_dev2,0x3ff); -+ -+ return; -+} -+ -+void hx2750_ssp2_reset(void) -+{ -+ ssp_write_word(&hx2750_ssp_dev2,0x000); -+ ssp_write_word(&hx2750_ssp_dev2,0x000); -+ -+} -+ -+unsigned long hx2750_ssp2_read(void) -+{ -+ u32 ret = 0; -+ ssp_read_word(&hx2750_ssp_dev2, &ret); -+ return ret; -+} -+ -+void hx2750_ssp2_write(unsigned long data) -+{ -+ ssp_write_word(&hx2750_ssp_dev2, data); -+} -+ -+ -+/* -+ * Extra hx2750 Specific GPIOs -+ */ -+void hx2750_send_egpio(unsigned int val) -+{ -+ int i; -+ -+ GPCR0 = GPIO_bit(HX2750_GPIO_SR_STROBE); -+ GPCR1 = GPIO_bit(HX2750_GPIO_SR_CLK1); -+ -+ for (i=0;i<12;i++) { -+ if (val & 0x01) -+ GPSR2 = GPIO_bit(HX2750_GPIO_GPIO_DIN); -+ else -+ GPCR2 = GPIO_bit(HX2750_GPIO_GPIO_DIN); -+ val >>= 1; -+ GPSR1 = GPIO_bit(HX2750_GPIO_SR_CLK1); -+ GPCR1 = GPIO_bit(HX2750_GPIO_SR_CLK1); -+ } -+ -+ GPSR0 = GPIO_bit(HX2750_GPIO_SR_STROBE); -+ GPCR0 = GPIO_bit(HX2750_GPIO_SR_STROBE); -+} -+ -+EXPORT_SYMBOL(hx2750_send_egpio); -+ -+unsigned int hx2750_egpio_current; -+ -+void hx2750_set_egpio(unsigned int gpio) -+{ -+ hx2750_egpio_current|=gpio; -+ -+ hx2750_send_egpio(hx2750_egpio_current); -+} -+EXPORT_SYMBOL(hx2750_set_egpio); -+ -+void hx2750_clear_egpio(unsigned int gpio) -+{ -+ hx2750_egpio_current&=~gpio; -+ -+ hx2750_send_egpio(hx2750_egpio_current); -+} -+EXPORT_SYMBOL(hx2750_clear_egpio); -+ -+ -+/* -+ * Touchscreen/Sound/Battery Status -+ */ -+void hx2750_tsc2101_send(int read, int command, int *values, int numval) -+{ -+ u32 ret = 0; -+ int i; -+ -+ GPCR0 = GPIO_bit(HX2750_GPIO_TSC2101_SS); -+ -+ ssp_write_word(&hx2750_ssp_dev1, command | read); -+ /* dummy read */ -+ ssp_read_word(&hx2750_ssp_dev1, &ret); -+ -+ for (i=0; i < numval; i++) { -+ if (read) { -+ ssp_write_word(&hx2750_ssp_dev1, 0); -+ ssp_read_word(&hx2750_ssp_dev1, &values[i]); -+ } else { -+ ssp_write_word(&hx2750_ssp_dev1, values[i]); -+ ssp_read_word(&hx2750_ssp_dev1, &ret); -+ } -+ } -+ -+ GPSR0 = GPIO_bit(HX2750_GPIO_TSC2101_SS); -+} -+ -+static int hx2750_tsc2101_pendown(void) -+{ -+ if ((GPLR(HX2750_GPIO_PENDOWN) & GPIO_bit(HX2750_GPIO_PENDOWN)) == 0) -+ return 1; -+ return 0; -+} -+ -+static struct tsc2101_platform_info hx2750_tsc2101_info = { -+ .send = hx2750_tsc2101_send, -+ .suspend = hx2750_ssp_suspend, -+ .resume = hx2750_ssp_resume, -+ .irq = HX2750_IRQ_GPIO_PENDOWN, -+ .pendown = hx2750_tsc2101_pendown, -+}; -+ -+struct platform_device tsc2101_device = { -+ .name = "tsc2101", -+ .dev = { -+ .platform_data = &hx2750_tsc2101_info, -+ //.parent = &corgissp_device.dev, -+ }, -+ .id = -1, -+}; -+ -+ -+/* -+ * MMC/SD Device -+ * -+ * The card detect interrupt isn't debounced so we delay it by 250ms -+ * to give the card a chance to fully insert/eject. -+ */ -+static struct pxamci_platform_data hx2750_mci_platform_data; -+ -+static int hx2750_mci_init(struct device *dev, irq_handler_t hx2750_detect_int, void *data) -+{ -+ int err; -+ -+ /* -+ * setup GPIO for PXA27x MMC controller -+ */ -+ pxa_gpio_mode(GPIO32_MMCCLK_MD); -+ pxa_gpio_mode(GPIO112_MMCCMD_MD); -+ pxa_gpio_mode(GPIO92_MMCDAT0_MD); -+ pxa_gpio_mode(GPIO109_MMCDAT1_MD); -+ pxa_gpio_mode(GPIO110_MMCDAT2_MD); -+ pxa_gpio_mode(GPIO111_MMCDAT3_MD); -+ pxa_gpio_mode(HX2750_GPIO_SD_DETECT | GPIO_IN); -+ pxa_gpio_mode(HX2750_GPIO_SD_READONLY | GPIO_IN); -+ -+ hx2750_mci_platform_data.detect_delay = msecs_to_jiffies(250); -+ -+ err = request_irq(HX2750_IRQ_GPIO_SD_DETECT, hx2750_detect_int, -+ IRQF_DISABLED | IRQF_TRIGGER_RISING | IRQF_TRIGGER_FALLING, -+ "MMC card detect", data); -+ if (err) { -+ printk(KERN_ERR "hx2750_mci_init: MMC/SD: can't request MMC card detect IRQ\n"); -+ return -1; -+ } -+ -+ return 0; -+} -+ -+static void hx2750_mci_setpower(struct device *dev, unsigned int vdd) -+{ -+ struct pxamci_platform_data* p_d = dev->platform_data; -+ -+ if (( 1 << vdd) & p_d->ocr_mask) -+ hx2750_set_egpio(HX2750_EGPIO_SD_PWR); -+ else -+ hx2750_clear_egpio(HX2750_EGPIO_SD_PWR); -+} -+ -+static void hx2750_mci_exit(struct device *dev, void *data) -+{ -+ free_irq(HX2750_IRQ_GPIO_SD_DETECT, data); -+} -+ -+static struct pxamci_platform_data hx2750_mci_platform_data = { -+ .ocr_mask = MMC_VDD_32_33|MMC_VDD_33_34, -+ .init = hx2750_mci_init, -+ .setpower = hx2750_mci_setpower, -+ .exit = hx2750_mci_exit, -+}; -+ -+ -+/* -+ * FrameBuffer -+ */ -+static struct pxafb_mode_info hx2750_pxafb_modes = { -+ .pixclock = 288462, -+ .xres = 240, -+ .yres = 320, -+ .bpp = 16, -+ .hsync_len = 20, -+ .left_margin = 42, -+ .right_margin = 18, -+ .vsync_len = 4, -+ .upper_margin = 3, -+ .lower_margin = 4, -+ .sync = 0, -+}; -+ -+static struct pxafb_mach_info hx2750_pxafb_info = { -+ .modes = &hx2750_pxafb_modes, -+ .num_modes = 1, -+ .fixed_modes = 1, -+ .lccr0 = LCCR0_Color | LCCR0_Sngl | LCCR0_Act, -+ .lccr3 = LCCR3_PixFlEdg | LCCR3_OutEnH, -+ .pxafb_backlight_power = NULL, -+}; -+ -+ -+/* -+ * Test Device -+ */ -+static struct platform_device hx2750_test_device = { -+ .name = "hx2750-test", -+ .id = -1, -+}; -+ -+ -+/* Initialization code */ -+static struct platform_device *devices[] __initdata = { -+ &hx2750_bl_device, -+ &hx2750_test_device, -+ &hx2750_pxa_keys, -+ &tsc2101_device, -+}; -+ -+static void __init hx2750_init( void ) -+{ -+ PWER = 0xC0000003;// | PWER_RTC; -+ PFER = 0x00000003; -+ PRER = 0x00000003; -+ -+ PGSR0=0x00000018; -+ PGSR1=0x00000380; -+ PGSR2=0x00800000; -+ PGSR3=0x00500400; -+ -+ //PCFR |= PCFR_OPDE; -+ PCFR=0x77; -+ PSLR=0xff100000; -+ //PCFR=0x10; - does not return from suspend -+ -+ //PCFR= 0x00004040; -+ //PSLR= 0xff400f04; -+ -+ /* Setup Extra GPIO Bank access */ -+ pxa_gpio_mode(HX2750_GPIO_GPIO_DIN | GPIO_OUT | GPIO_DFLT_HIGH); -+ pxa_gpio_mode(HX2750_GPIO_SR_CLK1 | GPIO_OUT | GPIO_DFLT_LOW); -+ pxa_gpio_mode(HX2750_GPIO_SR_CLK2 | GPIO_IN); -+ pxa_gpio_mode(HX2750_GPIO_SR_STROBE | GPIO_OUT | GPIO_DFLT_LOW); -+ -+ /* Init Extra GPIOs - Bootloader reset default is 0x484 */ -+ /* This is 0xe84 */ -+ hx2750_set_egpio(HX2750_EGPIO_2 | HX2750_EGPIO_7 | HX2750_EGPIO_LCD_PWR | HX2750_EGPIO_BL_PWR | HX2750_EGPIO_WIFI_PWR); -+ -+ pxa_set_udc_info(&hx2750_udc_mach_info); -+ pxa_set_mci_info(&hx2750_mci_platform_data); -+ set_pxa_fb_info(&hx2750_pxafb_info); -+ hx2750_ssp_init(); -+ platform_add_devices (devices, ARRAY_SIZE (devices)); -+} -+ -+ -+MACHINE_START(HX2750, "HP iPAQ HX2750") -+ .phys_io = 0x40000000, -+ .io_pg_offst = (io_p2v(0x40000000) >> 18) & 0xfffc, -+ .boot_params = 0xa0000100, -+ .map_io = pxa_map_io, -+ .init_irq = pxa_init_irq, -+ .timer = &pxa_timer, -+ .init_machine = hx2750_init, -+MACHINE_END -+ ---- linux-2.6.24-rc1.orig/arch/arm/mach-pxa/pm.c -+++ linux-2.6.24-rc1/arch/arm/mach-pxa/pm.c -@@ -17,6 +17,7 @@ - #include <linux/time.h> - - #include <asm/hardware.h> -+#include <asm/mach-types.h> - #include <asm/memory.h> - #include <asm/system.h> - #include <asm/arch/pm.h> -@@ -91,6 +92,9 @@ - .enter = pxa_pm_enter, - }; - -+unsigned long pxa_pm_pspr_value; -+extern void pxa_cpu_resume(void); -+ - static int __init pxa_pm_init(void) - { - if (!pxa_cpu_pm_fns) { -@@ -104,6 +108,7 @@ - return -ENOMEM; - } - -+ pxa_pm_pspr_value=virt_to_phys(pxa_cpu_resume); - suspend_set_ops(&pxa_pm_ops); - return 0; - } ---- linux-2.6.24-rc1.orig/arch/arm/mach-pxa/pxa27x.c -+++ linux-2.6.24-rc1/arch/arm/mach-pxa/pxa27x.c -@@ -259,6 +259,8 @@ - RESTORE(PSTR); - } - -+extern unsigned long pxa_pm_pspr_value; -+ - void pxa27x_cpu_pm_enter(suspend_state_t state) - { - extern void pxa_cpu_standby(void); -@@ -281,7 +283,7 @@ - break; - case PM_SUSPEND_MEM: - /* set resume return address */ -- PSPR = virt_to_phys(pxa_cpu_resume); -+ PSPR = pxa_pm_pspr_value; - pxa27x_cpu_suspend(PWRMODE_SLEEP); - break; - } ---- linux-2.6.24-rc1.orig/arch/arm/mach-pxa/pxa25x.c -+++ linux-2.6.24-rc1/arch/arm/mach-pxa/pxa25x.c -@@ -200,6 +200,8 @@ - RESTORE(PSTR); - } - -+extern unsigned long pxa_pm_pspr_value; -+ - static void pxa25x_cpu_pm_enter(suspend_state_t state) - { - CKEN = 0; -@@ -207,7 +209,7 @@ - switch (state) { - case PM_SUSPEND_MEM: - /* set resume return address */ -- PSPR = virt_to_phys(pxa_cpu_resume); -+ PSPR = pxa_pm_pspr_value; - pxa25x_cpu_suspend(PWRMODE_SLEEP); - break; - } |