Index: arch/arm/mach-pxa/htcblueangel/blueangel.c =================================================================== RCS file: /cvs/linux/kernel26/arch/arm/mach-pxa/htcblueangel/blueangel.c,v retrieving revision 1.39 diff -u -r1.39 blueangel.c --- arch/arm/mach-pxa/htcblueangel/blueangel.c 26 Jul 2007 00:17:16 -0000 1.39 +++ arch/arm/mach-pxa/htcblueangel/blueangel.c 21 Feb 2008 20:11:07 -0000 @@ -23,6 +23,9 @@ #include #include #include +#include +#include +#include #include #include @@ -39,17 +42,23 @@ #include #include #include +#include #include -#include #include #include #include #include #include +#include +#include +#include +#include +#include #include #include #include +#include #include #include @@ -88,7 +97,7 @@ { .led_cdev = { .name = "blueangel:phonebuttons", - .default_trigger = "blueangel-phonebuttons", + .default_trigger = "backlight", }, .hw_num = -1, .gpio_num = ('B'-'A')*16+GPIOB_PHONEL_PWR_ON, @@ -104,7 +113,7 @@ { .led_cdev = { .name = "blueangel:kbdbacklight", - .default_trigger = "blueangel-kbdbacklight", + .default_trigger = "input-key", }, .hw_num = -1, .gpio_num = ('C'-'A')*16+GPIOC_KEYBL_PWR_ON, @@ -177,20 +186,117 @@ } }; + +/* + * LEDs + */ + +static struct pasic3_led pasic3_leds[] = { + { + .led = { + .name = "blueangel:wifi", + .default_trigger = "wifi", /* and WIFI */ + .flags = LED_SUPPORTS_HWTIMER, + }, + .hw_num = 1, + .mask = PASIC3_MASK_LED1, /* 0x08 */ + }, + { + .led = { + .name = "blueangel:bt", + .default_trigger = "bluetooth", /* and Bluetooth */ + .flags = LED_SUPPORTS_HWTIMER, + }, + .hw_num = 0, + .mask = PASIC3_MASK_LED0, /* 0x04 */ + }, +}; + +static struct platform_device pasic3; + +static struct pasic3_leds_machinfo __devinit pasic3_leds_machinfo = { + .num_leds = ARRAY_SIZE(pasic3_leds), + .leds = pasic3_leds, +}; + +static struct platform_device pasic3_led = { + .name = "pasic3-led", + .id = -1, + .dev = { + .platform_data = &pasic3_leds_machinfo, + }, +}; + +/* + * PASIC3 with DS1WM + */ + +static struct platform_device *pasic3_devices[] = { + &pasic3_led, +}; + +static struct resource pasic3_resources[] = { + [0] = { + .start = 0x11000000, + .end = 0x11000000 + 0x08, + .flags = IORESOURCE_MEM, + }, + /* No IRQ handler in the PASIC3, DS1WM needs an external IRQ */ + [1] = { + .start = HTCBLUEANGEL_ASIC3_IRQ_BASE + BLUEANGEL_OWM_IRQ, + .end = HTCBLUEANGEL_ASIC3_IRQ_BASE + BLUEANGEL_OWM_IRQ, + .flags = IORESOURCE_IRQ | IORESOURCE_IRQ_LOWEDGE , + } +}; + +static struct pasic3_platform_data pasic3_platform_data = { + .bus_shift = 1, + + .child_devs = pasic3_devices, + .num_child_devs = ARRAY_SIZE(pasic3_devices), + .clock_rate = 16000000, +}; + +static struct platform_device pasic3 = { + .name = "pasic3", + .id = -1, + .num_resources = ARRAY_SIZE(pasic3_resources), + .resource = pasic3_resources, + .dev = { + .platform_data = &pasic3_platform_data, + }, +}; + static void __init blueangel_init_irq( void ) { /* Initialize standard IRQs */ pxa_init_irq(); + } -static void ser_stuart_gpio_config(int enable) +/* IrDA */ +static void blueangel_irda_transceiver_mode(struct device *dev, int mode) { - printk("ser_stuart_gpio_config %d\n", enable); - if (enable == PXA_UART_CFG_PRE_STARTUP) { - STISR=0; - } + unsigned long flags; + + local_irq_save(flags); + + if (mode & IR_OFF) { + DPM_DEBUG("htcblueangel_irda: Turning off port\n"); + STISR=1; + } else { + DPM_DEBUG("htcblueangel_irda: Turning on port\n"); + STISR=0; + } + + local_irq_restore(flags); } +static struct pxaficp_platform_data blueangel_ficp_platform_data = { + .transceiver_cap = IR_SIRMODE | IR_OFF, + .transceiver_mode = blueangel_irda_transceiver_mode, +}; + static void ser_hwuart_gpio_config(int enable) { printk("ser_hwuart_gpio_config %d\n", enable); @@ -263,10 +369,11 @@ GFER2 = 0x00000000; #endif + pxa_set_ficp_info(&blueangel_ficp_platform_data); - pxa_serial_funcs[2].configure = ser_stuart_gpio_config; + //pxa_serial_funcs[2].configure = ser_stuart_gpio_config; pxa_serial_funcs[3].configure = ser_hwuart_gpio_config; - pxa_set_stuart_info(&pxa_serial_funcs[2]); + //pxa_set_stuart_info(&pxa_serial_funcs[2]); pxa_set_hwuart_info(&pxa_serial_funcs[3]); } @@ -276,39 +383,136 @@ extern struct platform_device blueangel_bl; static struct platform_device blueangel_lcd = { .name = "blueangel-lcd", }; -static struct platform_device blueangel_leds = { .name = "blueangel-leds", }; -static struct platform_device blueangel_pcmcia = { .name = - "blueangel-pcmcia", }; +static struct platform_device blueangel_irda = { .name = "blueangel-irda", }; +static struct platform_device blueangel_bt = { .name = "blueangel-bt", }; +static struct platform_device blueangel_pcmcia = { .name = "blueangel-pcmcia", }; + +/* StrataFlash */ + +static void blueangel_set_vpp(struct map_info *map, int vpp) +{ + static int old_vpp = 0; + +/* Don't use VPP at the moment + if (vpp == old_vpp) + return; + if (vpp) + magician_egpio_set(EGPIO_NR_MAGICIAN_FLASH_VPP, 1); + else + magician_egpio_set(EGPIO_NR_MAGICIAN_FLASH_VPP, 0); +*/ + + old_vpp = vpp; +} + +#ifdef CONFIG_MTD_PARTITIONS +static struct mtd_partition wince_partitions[] = { + { + name: "bootloader", + offset: 0, + size: 1*0x40000, + mask_flags: MTD_WRITEABLE, /* force read-only */ + }, + { + name: "osrom", + size: 143*0x40000, + mask_flags: MTD_WRITEABLE, /* force read-only */ + offset: MTDPART_OFS_NXTBLK, + }, + { + name: "backup_area", + size: 32*0x40000, + mask_flags: MTD_WRITEABLE, /* force read-only */ + offset: MTDPART_OFS_NXTBLK, + }, + { + name: "extrom", + size: 76*0x40000, + mask_flags: MTD_WRITEABLE, /* force read-only */ + offset: MTDPART_OFS_NXTBLK, + }, + { + name: "unused", + size: 2*0x40000, + mask_flags: MTD_WRITEABLE, /* force read-only */ + offset: MTDPART_OFS_NXTBLK, + }, + { + name: "splash", + size: 1*0x40000, + offset: MTDPART_OFS_NXTBLK, + }, + { + name: "asset", + size: 1*0x40000, + mask_flags: MTD_WRITEABLE, /* force read-only */ + offset: MTDPART_OFS_NXTBLK, + }, +}; +#endif + +#define WINDOW_SIZE 32*1024*1024 + +static struct resource blueangel_flash_resource = { + .start = 0x0, + .end = 0x0 + WINDOW_SIZE - 1, + .flags = IORESOURCE_MEM, +}; + +struct physmap_flash_data blueangel_flash_data = { + .width = 4, + .set_vpp = blueangel_set_vpp, +#ifdef CONFIG_MTD_PARTITIONS + .nr_parts = ARRAY_SIZE(wince_partitions), + .parts = wince_partitions, +#endif +}; + +static struct platform_device blueangel_flash = { + .name = "physmap-flash", + .id = -1, + .num_resources = 1, + .resource = &blueangel_flash_resource, + .dev = { + .platform_data = &blueangel_flash_data, + }, +}; /* - * ASIC3 buttons + * GPIO buttons */ +static struct gpio_keys_button blueangel_button_table[] = { -static struct asic3_keys_button blueangel_asic3_keys_table[] = { - {KEY_RECORD, BLUEANGEL_RECORD_BTN_IRQ, 1, "Record Button"}, - {KEY_VOLUMEUP, BLUEANGEL_VOL_UP_BTN_IRQ, 1, "Volume Up Button"}, - {KEY_VOLUMEDOWN, BLUEANGEL_VOL_DOWN_BTN_IRQ, 1, "Volume Down Button"}, - {KEY_CAMERA, BLUEANGEL_CAMERA_BTN_IRQ, 1, "Camera Button"}, - {KEY_MENU, BLUEANGEL_WINDOWS_BTN_IRQ, 1, "Windows Button"}, - {KEY_EMAIL, BLUEANGEL_MAIL_BTN_IRQ, 1, "Mail Button"}, - {KEY_WWW, BLUEANGEL_WWW_BTN_IRQ, 1, "Internet Button"}, - {KEY_KPENTER, BLUEANGEL_OK_BTN_IRQ, 1, "Ok Button"}, + { KEY_POWER, GPIO_NR_BLUEANGEL_POWER_BUTTON_N, 1 }, + {KEY_RECORD, HTCBLUEANGEL_ASIC3_GPIO_BASE + BLUEANGEL_RECORD_BTN_IRQ, 1, "Record Button"}, + {KEY_VOLUMEUP, HTCBLUEANGEL_ASIC3_GPIO_BASE + BLUEANGEL_VOL_UP_BTN_IRQ, 1, "Volume Up Button"}, + {KEY_VOLUMEDOWN, HTCBLUEANGEL_ASIC3_GPIO_BASE + BLUEANGEL_VOL_DOWN_BTN_IRQ, 1, "Volume Down Button"}, + + {KEY_CAMERA, HTCBLUEANGEL_ASIC3_GPIO_BASE + BLUEANGEL_CAMERA_BTN_IRQ, 1, "Camera Button"}, + {KEY_MENU, HTCBLUEANGEL_ASIC3_GPIO_BASE + BLUEANGEL_WINDOWS_BTN_IRQ, 1, "Windows Button"}, + {KEY_EMAIL, HTCBLUEANGEL_ASIC3_GPIO_BASE + BLUEANGEL_MAIL_BTN_IRQ, 1, "Mail Button"}, + {KEY_WWW, HTCBLUEANGEL_ASIC3_GPIO_BASE + BLUEANGEL_WWW_BTN_IRQ, 1, "Internet Button"}, + {KEY_KPENTER, HTCBLUEANGEL_ASIC3_GPIO_BASE + BLUEANGEL_OK_BTN_IRQ, 1, "Ok Button"}, }; -static struct asic3_keys_platform_data blueangel_asic3_keys_data = { - .buttons = blueangel_asic3_keys_table, - .nbuttons = ARRAY_SIZE(blueangel_asic3_keys_table), - .asic3_dev = &blueangel_asic3.dev, +static struct gpio_keys_platform_data blueangel_gpio_keys_data = { + + .buttons = blueangel_button_table, + .nbuttons = ARRAY_SIZE(blueangel_button_table), + }; -static struct platform_device blueangel_asic3_keys = { - .name = "asic3-keys", - .dev = { - .platform_data = &blueangel_asic3_keys_data, - } +static struct platform_device blueangel_gpio_keys = { + .name = "gpio-keys", + .dev = { + .platform_data = &blueangel_gpio_keys_data, + }, }; + + + /* UDC device */ struct pxa2xx_udc_gpio_info blueangel_udc_info = { .detect_gpio = {&pxagpio_device.dev, GPIO_NR_BLUEANGEL_USB_DETECT_N}, @@ -327,17 +531,19 @@ }; static struct platform_device *blueangel_asic3_devices[] __initdata = { - &tsc2200_ts, + //&tsc2200_ts, &blueangel_lcd, &blueangel_udc, &blueangel_backup_batt, #ifdef CONFIG_MACH_BLUEANGEL_BACKLIGHT &blueangel_bl, #endif - &blueangel_asic3_keys, - &blueangel_leds, + &pasic3, + &blueangel_gpio_keys, &blueangel_pcmcia, &blueangel_leds_pdev, + &blueangel_bt, + &blueangel_irda, }; @@ -395,6 +601,7 @@ }, .bus_shift=1, .irq_base = HTCBLUEANGEL_ASIC3_IRQ_BASE, + .gpio_base = HTCBLUEANGEL_ASIC3_GPIO_BASE, .child_devs = blueangel_asic3_devices, .num_child_devs = ARRAY_SIZE(blueangel_asic3_devices), @@ -442,24 +649,6 @@ .id = -1, }; -/* - * GPIO buttons - */ -static struct gpio_keys_button blueangel_button_table[] = { - { KEY_POWER, GPIO_NR_BLUEANGEL_POWER_BUTTON_N, 1 }, -}; - -static struct gpio_keys_platform_data blueangel_pxa_keys_data = { - .buttons = blueangel_button_table, - .nbuttons = ARRAY_SIZE(blueangel_button_table), -}; - -static struct platform_device blueangel_pxa_keys = { - .name = "gpio-keys", - .dev = { - .platform_data = &blueangel_pxa_keys_data, - }, -}; /* * @@ -467,9 +656,8 @@ static struct platform_device *devices[] __initdata = { &blueangel_asic3, - &blueangel_led, &blueangel_tsc2200, - &blueangel_pxa_keys, + &blueangel_flash, }; static void __init blueangel_init(void) Index: arch/arm/mach-pxa/htcblueangel/blueangel_tsc2200.c =================================================================== RCS file: /cvs/linux/kernel26/arch/arm/mach-pxa/htcblueangel/blueangel_tsc2200.c,v retrieving revision 1.9 diff -u -r1.9 blueangel_tsc2200.c --- arch/arm/mach-pxa/htcblueangel/blueangel_tsc2200.c 18 Jul 2007 13:21:03 -0000 1.9 +++ arch/arm/mach-pxa/htcblueangel/blueangel_tsc2200.c 21 Feb 2008 20:11:07 -0000 @@ -95,6 +95,10 @@ .irq = IRQ_NR_BLUEANGEL_TSC2200_KB, }; +struct tsc2200_ts_platform_info blueangel_tsc2200_ts = { + .irq = IRQ_NR_BLUEANGEL_TSC2200_TS, +}; + static struct tsc2200_platform_info blueangel_tsc2200_info = { // Various callbacks to deal with the ssp @@ -104,6 +108,7 @@ // Buttons and touchscreen data that this chip supplies on the blueangel .buttons_info = &blueangel_tsc2200_buttons, + .touchscreen_info = &blueangel_tsc2200_ts, }; struct platform_device blueangel_tsc2200 = { Index: drivers/input/touchscreen/Makefile =================================================================== RCS file: /cvs/linux/kernel26/drivers/input/touchscreen/Makefile,v retrieving revision 1.21 diff -u -r1.21 Makefile --- drivers/input/touchscreen/Makefile 17 Jul 2007 17:18:36 -0000 1.21 +++ drivers/input/touchscreen/Makefile 21 Feb 2008 20:11:12 -0000 @@ -41,5 +41,5 @@ obj-$(CONFIG_TOUCHSCREEN_S3C2410) += s3c2410_ts.o obj-$(CONFIG_TOUCHSCREEN_ASIC2) += asic2_ts.o obj-$(CONFIG_TOUCHSCREEN_IPAQ_MICRO) += micro_ts.o -#obj-$(CONFIG_TOUCHSCREEN_TSC2200) += tsc2200_ts.o +obj-$(CONFIG_TOUCHSCREEN_TSC2200) += tsc2200_ts.o obj-$(CONFIG_TOUCHSCREEN_ADC) += ts-adc.o Index: drivers/mfd/tsc2200.c =================================================================== RCS file: /cvs/linux/kernel26/drivers/mfd/tsc2200.c,v retrieving revision 1.10 diff -u -r1.10 tsc2200.c --- drivers/mfd/tsc2200.c 18 Jul 2007 13:07:17 -0000 1.10 +++ drivers/mfd/tsc2200.c 21 Feb 2008 20:11:13 -0000 @@ -134,36 +134,38 @@ kfree (devdata->buttons_dev); } -static void tsc2200_register_adc_device(struct device *dev) +static void tsc2200_register_ts_device(struct device *dev) { struct tsc2200_data *devdata = dev_get_drvdata(dev); struct tsc2200_platform_info *platform_info = devdata->platform; struct platform_device *sdev = kzalloc (sizeof (*sdev), GFP_KERNEL); - struct tsc2200_adc_data *adc_devdata = kzalloc (sizeof (*adc_devdata), GFP_KERNEL); + struct tsc2200_ts_data *ts_devdata = kzalloc (sizeof (*ts_devdata), GFP_KERNEL); // Prepare some platform info for the tsc2200 buttons - sdev->name = "tsc2200-adc"; - sdev->dev.platform_data = adc_devdata; + sdev->name = "tsc2200-ts"; + sdev->dev.platform_data = ts_devdata; sdev->dev.parent = dev; - adc_devdata->tsc2200_dev = dev; - adc_devdata->platform_info = platform_info->touchscreen_info; + ts_devdata->tsc2200_dev = dev; + ts_devdata->platform_info = platform_info->touchscreen_info; platform_device_register(sdev); devdata->ts_dev = sdev; } -static void tsc2200_unregister_adc_device(struct device *dev) +static void tsc2200_unregister_ts_device(struct device *dev) { struct tsc2200_data *devdata = dev_get_drvdata(dev); + //struct tsc2200_platform_info *platform_info = devdata->platform; kfree (devdata->ts_dev->dev.platform_data); kfree (devdata->ts_dev); } + static int __init tsc2200_probe(struct platform_device *pdev) { struct tsc2200_data *devdata; @@ -181,7 +183,7 @@ udelay(300); // tsc2200_reset( dev ); - //udelay(300); + udelay(300); printk("%s: SPI: cr0 %08x cr1 %08x sr: %08x it: %08x to: %08x ps: %08x\n", __FUNCTION__, @@ -192,8 +194,10 @@ tsc2200_register_button_device(&pdev->dev); } - // Register adc class device - tsc2200_register_adc_device(&pdev->dev); + // Is there a touchscreen on this device? + if (devdata->platform->touchscreen_info) { + tsc2200_register_ts_device(&pdev->dev); + } return 0; } @@ -210,7 +214,7 @@ // Is there a touchscreen on this device? if (devdata->platform->touchscreen_info) { - tsc2200_unregister_adc_device(&pdev->dev); + tsc2200_unregister_ts_device(&pdev->dev); } kfree(devdata); Index: drivers/w1/masters/ds1wm.c =================================================================== RCS file: /cvs/linux/kernel26/drivers/w1/masters/ds1wm.c,v retrieving revision 1.20 diff -u -r1.20 ds1wm.c --- drivers/w1/masters/ds1wm.c 8 May 2007 18:07:53 -0000 1.20 +++ drivers/w1/masters/ds1wm.c 21 Feb 2008 20:11:16 -0000 @@ -131,6 +131,11 @@ complete(ds1wm_data->read_complete); } + if ((intr & DS1WM_INT_TSRE) && ds1wm_data->write_complete) + complete(ds1wm_data->write_complete); + + intr = ds1wm_read_register(ds1wm_data, DS1WM_INT); + return IRQ_HANDLED; } Index: include/asm-arm/arch-pxa/htcblueangel.h =================================================================== RCS file: /cvs/linux/kernel26/include/asm-arm/arch-pxa/htcblueangel.h,v retrieving revision 1.1 diff -u -r1.1 htcblueangel.h --- include/asm-arm/arch-pxa/htcblueangel.h 18 Apr 2007 14:13:42 -0000 1.1 +++ include/asm-arm/arch-pxa/htcblueangel.h 21 Feb 2008 20:11:18 -0000 @@ -1,3 +1,5 @@ #include +#include #define HTCBLUEANGEL_ASIC3_IRQ_BASE IRQ_BOARD_START +#define HTCBLUEANGEL_ASIC3_GPIO_BASE GPIO_BASE_INCREMENT Index: include/linux/mfd/tsc2200.h =================================================================== RCS file: /cvs/linux/kernel26/include/linux/mfd/tsc2200.h,v retrieving revision 1.6 diff -u -r1.6 tsc2200.h --- include/linux/mfd/tsc2200.h 19 Apr 2007 22:53:58 -0000 1.6 +++ include/linux/mfd/tsc2200.h 21 Feb 2008 20:11:21 -0000 @@ -66,10 +66,10 @@ #define TSC2200_CTRLREG_ADC_AD_MASK (0x3<<10) #define TSC2200_CTRLREG_ADC_PSM_TSC2200 (1<<15) // pen status mode on ctrlreg adc #define TSC2200_CTRLREG_ADC_STS (1<<14) // stop continuous scanning. -#define TSC2200_CTRLREG_ADC_AD3 (13) // -#define TSC2200_CTRLREG_ADC_AD2 (12) // -#define TSC2200_CTRLREG_ADC_AD1 (11) // -#define TSC2200_CTRLREG_ADC_AD0 (10) // +#define TSC2200_CTRLREG_ADC_AD3 (1<<13) // +#define TSC2200_CTRLREG_ADC_AD2 (1<<12) // +#define TSC2200_CTRLREG_ADC_AD1 (1<<11) // +#define TSC2200_CTRLREG_ADC_AD0 (1<<10) // #define TSC2200_CTRLREG_ADC_RES(x) ((x<<8) & TSC2200_CTRLREG_ADC_RES_MASK ) #define TSC2200_CTRLREG_ADC_RES_MASK (0x3<<8) #define TSC2200_CTRLREG_ADC_RES_12BITP (0) // 12-bit ADC resolution (default) @@ -153,6 +153,18 @@ * Definitions */ +struct tsc2200_ts_platform_info { + int irq; +}; + +struct tsc2200_ts_data { + struct tsc2200_ts_platform_info *platform_info; + struct device *tsc2200_dev; + struct timer_list timer; + struct input_dev *input_dev; +}; + + struct tsc2200_data { spinlock_t lock; struct tsc2200_platform_info *platform; @@ -172,7 +184,6 @@ }; - /* Sensor pins available */ enum { TSC2200_PIN_XPOS = 0,