diff options
Diffstat (limited to 'arch/arm/mach-pxa/magician.c')
-rw-r--r-- | arch/arm/mach-pxa/magician.c | 61 |
1 files changed, 52 insertions, 9 deletions
diff --git a/arch/arm/mach-pxa/magician.c b/arch/arm/mach-pxa/magician.c index d70be75bd199..badba064dc04 100644 --- a/arch/arm/mach-pxa/magician.c +++ b/arch/arm/mach-pxa/magician.c | |||
@@ -114,6 +114,14 @@ static unsigned long magician_pin_config[] = { | |||
114 | GPIO82_CIF_DD_5, | 114 | GPIO82_CIF_DD_5, |
115 | GPIO84_CIF_FV, | 115 | GPIO84_CIF_FV, |
116 | GPIO85_CIF_LV, | 116 | GPIO85_CIF_LV, |
117 | |||
118 | /* Magician specific input GPIOs */ | ||
119 | GPIO9_GPIO, /* unknown */ | ||
120 | GPIO10_GPIO, /* GSM_IRQ */ | ||
121 | GPIO13_GPIO, /* CPLD_IRQ */ | ||
122 | GPIO107_GPIO, /* DS1WM_IRQ */ | ||
123 | GPIO108_GPIO, /* GSM_READY */ | ||
124 | GPIO115_GPIO, /* nPEN_IRQ */ | ||
117 | }; | 125 | }; |
118 | 126 | ||
119 | /* | 127 | /* |
@@ -438,7 +446,7 @@ static struct pasic3_led pasic3_leds[] = { | |||
438 | 446 | ||
439 | static struct platform_device pasic3; | 447 | static struct platform_device pasic3; |
440 | 448 | ||
441 | static struct pasic3_leds_machinfo __devinit pasic3_leds_info = { | 449 | static struct pasic3_leds_machinfo pasic3_leds_info = { |
442 | .num_leds = ARRAY_SIZE(pasic3_leds), | 450 | .num_leds = ARRAY_SIZE(pasic3_leds), |
443 | .power_gpio = EGPIO_MAGICIAN_LED_POWER, | 451 | .power_gpio = EGPIO_MAGICIAN_LED_POWER, |
444 | .leds = pasic3_leds, | 452 | .leds = pasic3_leds, |
@@ -543,9 +551,28 @@ static struct platform_device power_supply = { | |||
543 | static int magician_mci_init(struct device *dev, | 551 | static int magician_mci_init(struct device *dev, |
544 | irq_handler_t detect_irq, void *data) | 552 | irq_handler_t detect_irq, void *data) |
545 | { | 553 | { |
546 | return request_irq(IRQ_MAGICIAN_SD, detect_irq, | 554 | int err; |
555 | |||
556 | err = request_irq(IRQ_MAGICIAN_SD, detect_irq, | ||
547 | IRQF_DISABLED | IRQF_SAMPLE_RANDOM, | 557 | IRQF_DISABLED | IRQF_SAMPLE_RANDOM, |
548 | "MMC card detect", data); | 558 | "MMC card detect", data); |
559 | if (err) | ||
560 | goto err_request_irq; | ||
561 | err = gpio_request(EGPIO_MAGICIAN_SD_POWER, "SD_POWER"); | ||
562 | if (err) | ||
563 | goto err_request_power; | ||
564 | err = gpio_request(EGPIO_MAGICIAN_nSD_READONLY, "nSD_READONLY"); | ||
565 | if (err) | ||
566 | goto err_request_readonly; | ||
567 | |||
568 | return 0; | ||
569 | |||
570 | err_request_readonly: | ||
571 | gpio_free(EGPIO_MAGICIAN_SD_POWER); | ||
572 | err_request_power: | ||
573 | free_irq(IRQ_MAGICIAN_SD, data); | ||
574 | err_request_irq: | ||
575 | return err; | ||
549 | } | 576 | } |
550 | 577 | ||
551 | static void magician_mci_setpower(struct device *dev, unsigned int vdd) | 578 | static void magician_mci_setpower(struct device *dev, unsigned int vdd) |
@@ -562,6 +589,8 @@ static int magician_mci_get_ro(struct device *dev) | |||
562 | 589 | ||
563 | static void magician_mci_exit(struct device *dev, void *data) | 590 | static void magician_mci_exit(struct device *dev, void *data) |
564 | { | 591 | { |
592 | gpio_free(EGPIO_MAGICIAN_nSD_READONLY); | ||
593 | gpio_free(EGPIO_MAGICIAN_SD_POWER); | ||
565 | free_irq(IRQ_MAGICIAN_SD, data); | 594 | free_irq(IRQ_MAGICIAN_SD, data); |
566 | } | 595 | } |
567 | 596 | ||
@@ -643,28 +672,42 @@ static void __init magician_init(void) | |||
643 | { | 672 | { |
644 | void __iomem *cpld; | 673 | void __iomem *cpld; |
645 | int lcd_select; | 674 | int lcd_select; |
675 | int err; | ||
676 | |||
677 | gpio_request(GPIO13_MAGICIAN_CPLD_IRQ, "CPLD_IRQ"); | ||
678 | gpio_request(GPIO107_MAGICIAN_DS1WM_IRQ, "DS1WM_IRQ"); | ||
646 | 679 | ||
647 | pxa2xx_mfp_config(ARRAY_AND_SIZE(magician_pin_config)); | 680 | pxa2xx_mfp_config(ARRAY_AND_SIZE(magician_pin_config)); |
648 | 681 | ||
649 | platform_add_devices(devices, ARRAY_SIZE(devices)); | 682 | platform_add_devices(devices, ARRAY_SIZE(devices)); |
683 | |||
684 | err = gpio_request(GPIO83_MAGICIAN_nIR_EN, "nIR_EN"); | ||
685 | if (!err) { | ||
686 | gpio_direction_output(GPIO83_MAGICIAN_nIR_EN, 1); | ||
687 | pxa_set_ficp_info(&magician_ficp_info); | ||
688 | } | ||
650 | pxa_set_i2c_info(NULL); | 689 | pxa_set_i2c_info(NULL); |
651 | pxa_set_mci_info(&magician_mci_info); | 690 | pxa_set_mci_info(&magician_mci_info); |
652 | pxa_set_ohci_info(&magician_ohci_info); | 691 | pxa_set_ohci_info(&magician_ohci_info); |
653 | pxa_set_ficp_info(&magician_ficp_info); | ||
654 | 692 | ||
655 | /* Check LCD type we have */ | 693 | /* Check LCD type we have */ |
656 | cpld = ioremap_nocache(PXA_CS3_PHYS, 0x1000); | 694 | cpld = ioremap_nocache(PXA_CS3_PHYS, 0x1000); |
657 | if (cpld) { | 695 | if (cpld) { |
658 | u8 board_id = __raw_readb(cpld+0x14); | 696 | u8 board_id = __raw_readb(cpld+0x14); |
697 | iounmap(cpld); | ||
659 | system_rev = board_id & 0x7; | 698 | system_rev = board_id & 0x7; |
660 | lcd_select = board_id & 0x8; | 699 | lcd_select = board_id & 0x8; |
661 | iounmap(cpld); | ||
662 | pr_info("LCD type: %s\n", lcd_select ? "Samsung" : "Toppoly"); | 700 | pr_info("LCD type: %s\n", lcd_select ? "Samsung" : "Toppoly"); |
663 | if (lcd_select && (system_rev < 3)) | 701 | if (lcd_select && (system_rev < 3)) { |
664 | pxa_gpio_mode(GPIO75_MAGICIAN_SAMSUNG_POWER_MD); | 702 | gpio_request(GPIO75_MAGICIAN_SAMSUNG_POWER, "SAMSUNG_POWER"); |
665 | pxa_gpio_mode(GPIO104_MAGICIAN_LCD_POWER_1_MD); | 703 | gpio_direction_output(GPIO75_MAGICIAN_SAMSUNG_POWER, 0); |
666 | pxa_gpio_mode(GPIO105_MAGICIAN_LCD_POWER_2_MD); | 704 | } |
667 | pxa_gpio_mode(GPIO106_MAGICIAN_LCD_POWER_3_MD); | 705 | gpio_request(GPIO104_MAGICIAN_LCD_POWER_1, "LCD_POWER_1"); |
706 | gpio_request(GPIO105_MAGICIAN_LCD_POWER_2, "LCD_POWER_2"); | ||
707 | gpio_request(GPIO106_MAGICIAN_LCD_POWER_3, "LCD_POWER_3"); | ||
708 | gpio_direction_output(GPIO104_MAGICIAN_LCD_POWER_1, 0); | ||
709 | gpio_direction_output(GPIO105_MAGICIAN_LCD_POWER_2, 0); | ||
710 | gpio_direction_output(GPIO106_MAGICIAN_LCD_POWER_3, 0); | ||
668 | set_pxa_fb_info(lcd_select ? &samsung_info : &toppoly_info); | 711 | set_pxa_fb_info(lcd_select ? &samsung_info : &toppoly_info); |
669 | } else | 712 | } else |
670 | pr_err("LCD detection: CPLD mapping failed\n"); | 713 | pr_err("LCD detection: CPLD mapping failed\n"); |