diff options
| author | Kuninori Morimoto <kuninori.morimoto.gx@renesas.com> | 2010-07-14 03:01:16 -0400 |
|---|---|---|
| committer | Paul Mundt <lethal@linux-sh.org> | 2010-08-04 03:08:37 -0400 |
| commit | 71c3ba9a94c88c43e7216869531c8fbbacd15d9b (patch) | |
| tree | bea62b7a6476bba6dde9dbbc5a7e4af512477a64 /arch | |
| parent | dba6f385b83d7f19eb1d4df12f422bab945c7f10 (diff) | |
ARM: mach-shmobile: ap4evb: Add ts_get_pendown_state for tsc2007
This function is necessary to ensure the detection of pen-down.
This patch support both QHD / WVGA pannel.
Tested-by: Tony SIM <chinyeow.sim.xt@renesas.com>
Signed-off-by: Kuninori Morimoto <kuninori.morimoto.gx@renesas.com>
Signed-off-by: Paul Mundt <lethal@linux-sh.org>
Diffstat (limited to 'arch')
| -rw-r--r-- | arch/arm/mach-shmobile/board-ap4evb.c | 78 |
1 files changed, 62 insertions, 16 deletions
diff --git a/arch/arm/mach-shmobile/board-ap4evb.c b/arch/arm/mach-shmobile/board-ap4evb.c index e8a9d7990d34..968601201fb5 100644 --- a/arch/arm/mach-shmobile/board-ap4evb.c +++ b/arch/arm/mach-shmobile/board-ap4evb.c | |||
| @@ -576,12 +576,74 @@ static struct platform_device *ap4evb_devices[] __initdata = { | |||
| 576 | &sh_mmcif_device | 576 | &sh_mmcif_device |
| 577 | }; | 577 | }; |
| 578 | 578 | ||
| 579 | /* | ||
| 580 | * FIXME !! | ||
| 581 | * | ||
| 582 | * gpio_no_direction | ||
| 583 | * gpio_pull_up | ||
| 584 | * are quick_hack. | ||
| 585 | * | ||
| 586 | * current gpio frame work doesn't have | ||
| 587 | * the method to control only pull up/down/free. | ||
| 588 | * this function should be replaced by correct gpio function | ||
| 589 | */ | ||
| 590 | static void __init gpio_no_direction(u32 addr) | ||
| 591 | { | ||
| 592 | __raw_writeb(0x00, addr); | ||
| 593 | } | ||
| 594 | |||
| 595 | static void __init gpio_pull_up(u32 addr) | ||
| 596 | { | ||
| 597 | u8 data = __raw_readb(addr); | ||
| 598 | |||
| 599 | data &= 0x0F; | ||
| 600 | data |= 0xC0; | ||
| 601 | __raw_writeb(data, addr); | ||
| 602 | } | ||
| 603 | |||
| 579 | /* TouchScreen */ | 604 | /* TouchScreen */ |
| 580 | #define IRQ28 evt2irq(0x3380) /* IRQ28A */ | 605 | #define IRQ28 evt2irq(0x3380) /* IRQ28A */ |
| 581 | #define IRQ7 evt2irq(0x02e0) /* IRQ7A */ | 606 | #define IRQ7 evt2irq(0x02e0) /* IRQ7A */ |
| 607 | static int ts_get_pendown_state(void) | ||
| 608 | { | ||
| 609 | int val1, val2; | ||
| 610 | |||
| 611 | gpio_free(GPIO_FN_IRQ28_123); | ||
| 612 | gpio_free(GPIO_FN_IRQ7_40); | ||
| 613 | |||
| 614 | gpio_request(GPIO_PORT123, NULL); | ||
| 615 | gpio_request(GPIO_PORT40, NULL); | ||
| 616 | |||
| 617 | gpio_direction_input(GPIO_PORT123); | ||
| 618 | gpio_direction_input(GPIO_PORT40); | ||
| 619 | |||
| 620 | val1 = gpio_get_value(GPIO_PORT123); | ||
| 621 | val2 = gpio_get_value(GPIO_PORT40); | ||
| 622 | |||
| 623 | gpio_request(GPIO_FN_IRQ28_123, NULL); /* for QHD */ | ||
| 624 | gpio_request(GPIO_FN_IRQ7_40, NULL); /* for WVGA */ | ||
| 625 | |||
| 626 | return val1 ^ val2; | ||
| 627 | } | ||
| 628 | |||
| 629 | #define PORT40CR 0xE6051028 | ||
| 630 | #define PORT123CR 0xE605007B | ||
| 631 | static int ts_init(void) | ||
| 632 | { | ||
| 633 | gpio_request(GPIO_FN_IRQ28_123, NULL); /* for QHD */ | ||
| 634 | gpio_request(GPIO_FN_IRQ7_40, NULL); /* for WVGA */ | ||
| 635 | |||
| 636 | gpio_pull_up(PORT40CR); | ||
| 637 | gpio_pull_up(PORT123CR); | ||
| 638 | |||
| 639 | return 0; | ||
| 640 | } | ||
| 641 | |||
| 582 | static struct tsc2007_platform_data tsc2007_info = { | 642 | static struct tsc2007_platform_data tsc2007_info = { |
| 583 | .model = 2007, | 643 | .model = 2007, |
| 584 | .x_plate_ohms = 180, | 644 | .x_plate_ohms = 180, |
| 645 | .get_pendown_state = ts_get_pendown_state, | ||
| 646 | .init_platform_hw = ts_init, | ||
| 585 | }; | 647 | }; |
| 586 | 648 | ||
| 587 | static struct i2c_board_info tsc_device = { | 649 | static struct i2c_board_info tsc_device = { |
| @@ -625,20 +687,6 @@ static void __init ap4evb_map_io(void) | |||
| 625 | shmobile_setup_console(); | 687 | shmobile_setup_console(); |
| 626 | } | 688 | } |
| 627 | 689 | ||
| 628 | /* | ||
| 629 | * FIXME !! | ||
| 630 | * | ||
| 631 | * gpio_no_direction is quick_hack. | ||
| 632 | * | ||
| 633 | * current gpio frame work doesn't have | ||
| 634 | * the method to control only pull up/down/free. | ||
| 635 | * this function should be replaced by correct gpio function | ||
| 636 | */ | ||
| 637 | static void __init gpio_no_direction(u32 addr) | ||
| 638 | { | ||
| 639 | __raw_writeb(0x00, addr); | ||
| 640 | } | ||
| 641 | |||
| 642 | #define GPIO_PORT9CR 0xE6051009 | 690 | #define GPIO_PORT9CR 0xE6051009 |
| 643 | #define GPIO_PORT10CR 0xE605100A | 691 | #define GPIO_PORT10CR 0xE605100A |
| 644 | 692 | ||
| @@ -784,7 +832,6 @@ static void __init ap4evb_init(void) | |||
| 784 | gpio_request(GPIO_FN_KEYIN4, NULL); | 832 | gpio_request(GPIO_FN_KEYIN4, NULL); |
| 785 | 833 | ||
| 786 | /* enable TouchScreen */ | 834 | /* enable TouchScreen */ |
| 787 | gpio_request(GPIO_FN_IRQ28_123, NULL); | ||
| 788 | set_irq_type(IRQ28, IRQ_TYPE_LEVEL_LOW); | 835 | set_irq_type(IRQ28, IRQ_TYPE_LEVEL_LOW); |
| 789 | 836 | ||
| 790 | tsc_device.irq = IRQ28; | 837 | tsc_device.irq = IRQ28; |
| @@ -860,7 +907,6 @@ static void __init ap4evb_init(void) | |||
| 860 | lcdc_info.ch[0].lcd_size_cfg.height = 91; | 907 | lcdc_info.ch[0].lcd_size_cfg.height = 91; |
| 861 | 908 | ||
| 862 | /* enable TouchScreen */ | 909 | /* enable TouchScreen */ |
| 863 | gpio_request(GPIO_FN_IRQ7_40, NULL); | ||
| 864 | set_irq_type(IRQ7, IRQ_TYPE_LEVEL_LOW); | 910 | set_irq_type(IRQ7, IRQ_TYPE_LEVEL_LOW); |
| 865 | 911 | ||
| 866 | tsc_device.irq = IRQ7; | 912 | tsc_device.irq = IRQ7; |
