diff options
| author | Russell King <rmk@dyn-67.arm.linux.org.uk> | 2008-05-17 17:55:51 -0400 |
|---|---|---|
| committer | Russell King <rmk+kernel@arm.linux.org.uk> | 2008-05-17 17:55:51 -0400 |
| commit | 1da7807842f7ccd9a3962dc276e489b76cd320c7 (patch) | |
| tree | f9cdd42bdcd291b001e15df2a19686545e8377f0 /arch/arm | |
| parent | 53491e042e79578765e2d33512a45d50eb0d8801 (diff) | |
| parent | 2a52efb2cecf78201d61bd4930153bf52e57503b (diff) | |
Merge branch 'sa1100'
Diffstat (limited to 'arch/arm')
| -rw-r--r-- | arch/arm/common/locomo.c | 66 |
1 files changed, 48 insertions, 18 deletions
diff --git a/arch/arm/common/locomo.c b/arch/arm/common/locomo.c index ae21755872ed..d973c986f721 100644 --- a/arch/arm/common/locomo.c +++ b/arch/arm/common/locomo.c | |||
| @@ -321,11 +321,42 @@ static void locomo_gpio_unmask_irq(unsigned int irq) | |||
| 321 | locomo_writel(r, mapbase + LOCOMO_GIE); | 321 | locomo_writel(r, mapbase + LOCOMO_GIE); |
| 322 | } | 322 | } |
| 323 | 323 | ||
| 324 | static int GPIO_IRQ_rising_edge; | ||
| 325 | static int GPIO_IRQ_falling_edge; | ||
| 326 | |||
| 327 | static int locomo_gpio_type(unsigned int irq, unsigned int type) | ||
| 328 | { | ||
| 329 | unsigned int mask; | ||
| 330 | void __iomem *mapbase = get_irq_chip_data(irq); | ||
| 331 | |||
| 332 | mask = 1 << (irq - LOCOMO_IRQ_GPIO_START); | ||
| 333 | |||
| 334 | if (type == IRQT_PROBE) { | ||
| 335 | if ((GPIO_IRQ_rising_edge | GPIO_IRQ_falling_edge) & mask) | ||
| 336 | return 0; | ||
| 337 | type = __IRQT_RISEDGE | __IRQT_FALEDGE; | ||
| 338 | } | ||
| 339 | |||
| 340 | if (type & __IRQT_RISEDGE) | ||
| 341 | GPIO_IRQ_rising_edge |= mask; | ||
| 342 | else | ||
| 343 | GPIO_IRQ_rising_edge &= ~mask; | ||
| 344 | if (type & __IRQT_FALEDGE) | ||
| 345 | GPIO_IRQ_falling_edge |= mask; | ||
| 346 | else | ||
| 347 | GPIO_IRQ_falling_edge &= ~mask; | ||
| 348 | locomo_writel(GPIO_IRQ_rising_edge, mapbase + LOCOMO_GRIE); | ||
| 349 | locomo_writel(GPIO_IRQ_falling_edge, mapbase + LOCOMO_GFIE); | ||
| 350 | |||
| 351 | return 0; | ||
| 352 | } | ||
| 353 | |||
| 324 | static struct irq_chip locomo_gpio_chip = { | 354 | static struct irq_chip locomo_gpio_chip = { |
| 325 | .name = "LOCOMO-gpio", | 355 | .name = "LOCOMO-gpio", |
| 326 | .ack = locomo_gpio_ack_irq, | 356 | .ack = locomo_gpio_ack_irq, |
| 327 | .mask = locomo_gpio_mask_irq, | 357 | .mask = locomo_gpio_mask_irq, |
| 328 | .unmask = locomo_gpio_unmask_irq, | 358 | .unmask = locomo_gpio_unmask_irq, |
| 359 | .set_type = locomo_gpio_type, | ||
| 329 | }; | 360 | }; |
| 330 | 361 | ||
| 331 | static void locomo_lt_handler(unsigned int irq, struct irq_desc *desc) | 362 | static void locomo_lt_handler(unsigned int irq, struct irq_desc *desc) |
| @@ -450,22 +481,18 @@ static void locomo_setup_irq(struct locomo *lchip) | |||
| 450 | set_irq_chip(IRQ_LOCOMO_KEY_BASE, &locomo_chip); | 481 | set_irq_chip(IRQ_LOCOMO_KEY_BASE, &locomo_chip); |
| 451 | set_irq_chip_data(IRQ_LOCOMO_KEY_BASE, irqbase); | 482 | set_irq_chip_data(IRQ_LOCOMO_KEY_BASE, irqbase); |
| 452 | set_irq_chained_handler(IRQ_LOCOMO_KEY_BASE, locomo_key_handler); | 483 | set_irq_chained_handler(IRQ_LOCOMO_KEY_BASE, locomo_key_handler); |
| 453 | set_irq_flags(IRQ_LOCOMO_KEY_BASE, IRQF_VALID | IRQF_PROBE); | ||
| 454 | 484 | ||
| 455 | set_irq_chip(IRQ_LOCOMO_GPIO_BASE, &locomo_chip); | 485 | set_irq_chip(IRQ_LOCOMO_GPIO_BASE, &locomo_chip); |
| 456 | set_irq_chip_data(IRQ_LOCOMO_GPIO_BASE, irqbase); | 486 | set_irq_chip_data(IRQ_LOCOMO_GPIO_BASE, irqbase); |
| 457 | set_irq_chained_handler(IRQ_LOCOMO_GPIO_BASE, locomo_gpio_handler); | 487 | set_irq_chained_handler(IRQ_LOCOMO_GPIO_BASE, locomo_gpio_handler); |
| 458 | set_irq_flags(IRQ_LOCOMO_GPIO_BASE, IRQF_VALID | IRQF_PROBE); | ||
| 459 | 488 | ||
| 460 | set_irq_chip(IRQ_LOCOMO_LT_BASE, &locomo_chip); | 489 | set_irq_chip(IRQ_LOCOMO_LT_BASE, &locomo_chip); |
| 461 | set_irq_chip_data(IRQ_LOCOMO_LT_BASE, irqbase); | 490 | set_irq_chip_data(IRQ_LOCOMO_LT_BASE, irqbase); |
| 462 | set_irq_chained_handler(IRQ_LOCOMO_LT_BASE, locomo_lt_handler); | 491 | set_irq_chained_handler(IRQ_LOCOMO_LT_BASE, locomo_lt_handler); |
| 463 | set_irq_flags(IRQ_LOCOMO_LT_BASE, IRQF_VALID | IRQF_PROBE); | ||
| 464 | 492 | ||
| 465 | set_irq_chip(IRQ_LOCOMO_SPI_BASE, &locomo_chip); | 493 | set_irq_chip(IRQ_LOCOMO_SPI_BASE, &locomo_chip); |
| 466 | set_irq_chip_data(IRQ_LOCOMO_SPI_BASE, irqbase); | 494 | set_irq_chip_data(IRQ_LOCOMO_SPI_BASE, irqbase); |
| 467 | set_irq_chained_handler(IRQ_LOCOMO_SPI_BASE, locomo_spi_handler); | 495 | set_irq_chained_handler(IRQ_LOCOMO_SPI_BASE, locomo_spi_handler); |
| 468 | set_irq_flags(IRQ_LOCOMO_SPI_BASE, IRQF_VALID | IRQF_PROBE); | ||
| 469 | 496 | ||
| 470 | /* install handlers for IRQ_LOCOMO_KEY_BASE generated interrupts */ | 497 | /* install handlers for IRQ_LOCOMO_KEY_BASE generated interrupts */ |
| 471 | set_irq_chip(LOCOMO_IRQ_KEY_START, &locomo_key_chip); | 498 | set_irq_chip(LOCOMO_IRQ_KEY_START, &locomo_key_chip); |
| @@ -488,7 +515,7 @@ static void locomo_setup_irq(struct locomo *lchip) | |||
| 488 | set_irq_flags(LOCOMO_IRQ_LT_START, IRQF_VALID | IRQF_PROBE); | 515 | set_irq_flags(LOCOMO_IRQ_LT_START, IRQF_VALID | IRQF_PROBE); |
| 489 | 516 | ||
| 490 | /* install handlers for IRQ_LOCOMO_SPI_BASE generated interrupts */ | 517 | /* install handlers for IRQ_LOCOMO_SPI_BASE generated interrupts */ |
| 491 | for (irq = LOCOMO_IRQ_SPI_START; irq < LOCOMO_IRQ_SPI_START + 3; irq++) { | 518 | for (irq = LOCOMO_IRQ_SPI_START; irq < LOCOMO_IRQ_SPI_START + 4; irq++) { |
| 492 | set_irq_chip(irq, &locomo_spi_chip); | 519 | set_irq_chip(irq, &locomo_spi_chip); |
| 493 | set_irq_chip_data(irq, irqbase); | 520 | set_irq_chip_data(irq, irqbase); |
| 494 | set_irq_handler(irq, handle_edge_irq); | 521 | set_irq_handler(irq, handle_edge_irq); |
| @@ -574,20 +601,20 @@ static int locomo_suspend(struct platform_device *dev, pm_message_t state) | |||
| 574 | 601 | ||
| 575 | save->LCM_GPO = locomo_readl(lchip->base + LOCOMO_GPO); /* GPIO */ | 602 | save->LCM_GPO = locomo_readl(lchip->base + LOCOMO_GPO); /* GPIO */ |
| 576 | locomo_writel(0x00, lchip->base + LOCOMO_GPO); | 603 | locomo_writel(0x00, lchip->base + LOCOMO_GPO); |
| 577 | save->LCM_SPICT = locomo_readl(lchip->base + LOCOMO_SPICT); /* SPI */ | 604 | save->LCM_SPICT = locomo_readl(lchip->base + LOCOMO_SPI + LOCOMO_SPICT); /* SPI */ |
| 578 | locomo_writel(0x40, lchip->base + LOCOMO_SPICT); | 605 | locomo_writel(0x40, lchip->base + LOCOMO_SPICT); |
| 579 | save->LCM_GPE = locomo_readl(lchip->base + LOCOMO_GPE); /* GPIO */ | 606 | save->LCM_GPE = locomo_readl(lchip->base + LOCOMO_GPE); /* GPIO */ |
| 580 | locomo_writel(0x00, lchip->base + LOCOMO_GPE); | 607 | locomo_writel(0x00, lchip->base + LOCOMO_GPE); |
| 581 | save->LCM_ASD = locomo_readl(lchip->base + LOCOMO_ASD); /* ADSTART */ | 608 | save->LCM_ASD = locomo_readl(lchip->base + LOCOMO_ASD); /* ADSTART */ |
| 582 | locomo_writel(0x00, lchip->base + LOCOMO_ASD); | 609 | locomo_writel(0x00, lchip->base + LOCOMO_ASD); |
| 583 | save->LCM_SPIMD = locomo_readl(lchip->base + LOCOMO_SPIMD); /* SPI */ | 610 | save->LCM_SPIMD = locomo_readl(lchip->base + LOCOMO_SPI + LOCOMO_SPIMD); /* SPI */ |
| 584 | locomo_writel(0x3C14, lchip->base + LOCOMO_SPIMD); | 611 | locomo_writel(0x3C14, lchip->base + LOCOMO_SPI + LOCOMO_SPIMD); |
| 585 | 612 | ||
| 586 | locomo_writel(0x00, lchip->base + LOCOMO_PAIF); | 613 | locomo_writel(0x00, lchip->base + LOCOMO_PAIF); |
| 587 | locomo_writel(0x00, lchip->base + LOCOMO_DAC); | 614 | locomo_writel(0x00, lchip->base + LOCOMO_DAC); |
| 588 | locomo_writel(0x00, lchip->base + LOCOMO_BACKLIGHT + LOCOMO_TC); | 615 | locomo_writel(0x00, lchip->base + LOCOMO_BACKLIGHT + LOCOMO_TC); |
| 589 | 616 | ||
| 590 | if ( (locomo_readl(lchip->base + LOCOMO_LED + LOCOMO_LPT0) & 0x88) && (locomo_readl(lchip->base + LOCOMO_LED + LOCOMO_LPT1) & 0x88) ) | 617 | if ((locomo_readl(lchip->base + LOCOMO_LED + LOCOMO_LPT0) & 0x88) && (locomo_readl(lchip->base + LOCOMO_LED + LOCOMO_LPT1) & 0x88)) |
| 591 | locomo_writel(0x00, lchip->base + LOCOMO_C32K); /* CLK32 off */ | 618 | locomo_writel(0x00, lchip->base + LOCOMO_C32K); /* CLK32 off */ |
| 592 | else | 619 | else |
| 593 | /* 18MHz already enabled, so no wait */ | 620 | /* 18MHz already enabled, so no wait */ |
| @@ -616,10 +643,10 @@ static int locomo_resume(struct platform_device *dev) | |||
| 616 | spin_lock_irqsave(&lchip->lock, flags); | 643 | spin_lock_irqsave(&lchip->lock, flags); |
| 617 | 644 | ||
| 618 | locomo_writel(save->LCM_GPO, lchip->base + LOCOMO_GPO); | 645 | locomo_writel(save->LCM_GPO, lchip->base + LOCOMO_GPO); |
| 619 | locomo_writel(save->LCM_SPICT, lchip->base + LOCOMO_SPICT); | 646 | locomo_writel(save->LCM_SPICT, lchip->base + LOCOMO_SPI + LOCOMO_SPICT); |
| 620 | locomo_writel(save->LCM_GPE, lchip->base + LOCOMO_GPE); | 647 | locomo_writel(save->LCM_GPE, lchip->base + LOCOMO_GPE); |
| 621 | locomo_writel(save->LCM_ASD, lchip->base + LOCOMO_ASD); | 648 | locomo_writel(save->LCM_ASD, lchip->base + LOCOMO_ASD); |
| 622 | locomo_writel(save->LCM_SPIMD, lchip->base + LOCOMO_SPIMD); | 649 | locomo_writel(save->LCM_SPIMD, lchip->base + LOCOMO_SPI + LOCOMO_SPIMD); |
| 623 | 650 | ||
| 624 | locomo_writel(0x00, lchip->base + LOCOMO_C32K); | 651 | locomo_writel(0x00, lchip->base + LOCOMO_C32K); |
| 625 | locomo_writel(0x90, lchip->base + LOCOMO_TADC); | 652 | locomo_writel(0x90, lchip->base + LOCOMO_TADC); |
| @@ -688,9 +715,9 @@ __locomo_probe(struct device *me, struct resource *mem, int irq) | |||
| 688 | 715 | ||
| 689 | /* GPIO */ | 716 | /* GPIO */ |
| 690 | locomo_writel(0, lchip->base + LOCOMO_GPO); | 717 | locomo_writel(0, lchip->base + LOCOMO_GPO); |
| 691 | locomo_writel( (LOCOMO_GPIO(2) | LOCOMO_GPIO(3) | LOCOMO_GPIO(13) | LOCOMO_GPIO(14)) | 718 | locomo_writel((LOCOMO_GPIO(1) | LOCOMO_GPIO(2) | LOCOMO_GPIO(13) | LOCOMO_GPIO(14)) |
| 692 | , lchip->base + LOCOMO_GPE); | 719 | , lchip->base + LOCOMO_GPE); |
| 693 | locomo_writel( (LOCOMO_GPIO(2) | LOCOMO_GPIO(3) | LOCOMO_GPIO(13) | LOCOMO_GPIO(14)) | 720 | locomo_writel((LOCOMO_GPIO(1) | LOCOMO_GPIO(2) | LOCOMO_GPIO(13) | LOCOMO_GPIO(14)) |
| 694 | , lchip->base + LOCOMO_GPD); | 721 | , lchip->base + LOCOMO_GPD); |
| 695 | locomo_writel(0, lchip->base + LOCOMO_GIE); | 722 | locomo_writel(0, lchip->base + LOCOMO_GIE); |
| 696 | 723 | ||
| @@ -833,7 +860,10 @@ void locomo_gpio_set_dir(struct device *dev, unsigned int bits, unsigned int dir | |||
| 833 | spin_lock_irqsave(&lchip->lock, flags); | 860 | spin_lock_irqsave(&lchip->lock, flags); |
| 834 | 861 | ||
| 835 | r = locomo_readl(lchip->base + LOCOMO_GPD); | 862 | r = locomo_readl(lchip->base + LOCOMO_GPD); |
| 836 | r &= ~bits; | 863 | if (dir) |
| 864 | r |= bits; | ||
| 865 | else | ||
| 866 | r &= ~bits; | ||
| 837 | locomo_writel(r, lchip->base + LOCOMO_GPD); | 867 | locomo_writel(r, lchip->base + LOCOMO_GPD); |
| 838 | 868 | ||
| 839 | r = locomo_readl(lchip->base + LOCOMO_GPE); | 869 | r = locomo_readl(lchip->base + LOCOMO_GPE); |
