diff options
Diffstat (limited to 'arch/arm')
48 files changed, 1153 insertions, 1744 deletions
diff --git a/arch/arm/Kconfig b/arch/arm/Kconfig index 94422601ea5b..5098564d5879 100644 --- a/arch/arm/Kconfig +++ b/arch/arm/Kconfig | |||
@@ -738,7 +738,6 @@ config ARCH_RPC | |||
738 | bool "RiscPC" | 738 | bool "RiscPC" |
739 | select ARCH_ACORN | 739 | select ARCH_ACORN |
740 | select FIQ | 740 | select FIQ |
741 | select TIMER_ACORN | ||
742 | select ARCH_MAY_HAVE_PC_FDC | 741 | select ARCH_MAY_HAVE_PC_FDC |
743 | select HAVE_PATA_PLATFORM | 742 | select HAVE_PATA_PLATFORM |
744 | select ISA_DMA_API | 743 | select ISA_DMA_API |
@@ -767,6 +766,7 @@ config ARCH_SA1100 | |||
767 | select ARCH_REQUIRE_GPIOLIB | 766 | select ARCH_REQUIRE_GPIOLIB |
768 | select HAVE_IDE | 767 | select HAVE_IDE |
769 | select NEED_MACH_MEMORY_H | 768 | select NEED_MACH_MEMORY_H |
769 | select SPARSE_IRQ | ||
770 | help | 770 | help |
771 | Support for StrongARM 11x0 based boards. | 771 | Support for StrongARM 11x0 based boards. |
772 | 772 | ||
diff --git a/arch/arm/common/Kconfig b/arch/arm/common/Kconfig index 81a933eb0903..3bb1d7589bd9 100644 --- a/arch/arm/common/Kconfig +++ b/arch/arm/common/Kconfig | |||
@@ -35,9 +35,6 @@ config DMABOUNCE | |||
35 | bool | 35 | bool |
36 | select ZONE_DMA | 36 | select ZONE_DMA |
37 | 37 | ||
38 | config TIMER_ACORN | ||
39 | bool | ||
40 | |||
41 | config SHARP_LOCOMO | 38 | config SHARP_LOCOMO |
42 | bool | 39 | bool |
43 | 40 | ||
diff --git a/arch/arm/common/Makefile b/arch/arm/common/Makefile index 6ea9b6f3607a..69feafe7286c 100644 --- a/arch/arm/common/Makefile +++ b/arch/arm/common/Makefile | |||
@@ -9,7 +9,6 @@ obj-$(CONFIG_PL330) += pl330.o | |||
9 | obj-$(CONFIG_SA1111) += sa1111.o | 9 | obj-$(CONFIG_SA1111) += sa1111.o |
10 | obj-$(CONFIG_PCI_HOST_VIA82C505) += via82c505.o | 10 | obj-$(CONFIG_PCI_HOST_VIA82C505) += via82c505.o |
11 | obj-$(CONFIG_DMABOUNCE) += dmabounce.o | 11 | obj-$(CONFIG_DMABOUNCE) += dmabounce.o |
12 | obj-$(CONFIG_TIMER_ACORN) += time-acorn.o | ||
13 | obj-$(CONFIG_SHARP_LOCOMO) += locomo.o | 12 | obj-$(CONFIG_SHARP_LOCOMO) += locomo.o |
14 | obj-$(CONFIG_SHARP_PARAM) += sharpsl_param.o | 13 | obj-$(CONFIG_SHARP_PARAM) += sharpsl_param.o |
15 | obj-$(CONFIG_SHARP_SCOOP) += scoop.o | 14 | obj-$(CONFIG_SHARP_SCOOP) += scoop.o |
diff --git a/arch/arm/common/sa1111.c b/arch/arm/common/sa1111.c index 61691cdbdcf2..9173d112ea01 100644 --- a/arch/arm/common/sa1111.c +++ b/arch/arm/common/sa1111.c | |||
@@ -16,6 +16,7 @@ | |||
16 | */ | 16 | */ |
17 | #include <linux/module.h> | 17 | #include <linux/module.h> |
18 | #include <linux/init.h> | 18 | #include <linux/init.h> |
19 | #include <linux/irq.h> | ||
19 | #include <linux/kernel.h> | 20 | #include <linux/kernel.h> |
20 | #include <linux/delay.h> | 21 | #include <linux/delay.h> |
21 | #include <linux/errno.h> | 22 | #include <linux/errno.h> |
@@ -28,9 +29,8 @@ | |||
28 | #include <linux/io.h> | 29 | #include <linux/io.h> |
29 | 30 | ||
30 | #include <mach/hardware.h> | 31 | #include <mach/hardware.h> |
31 | #include <asm/mach-types.h> | ||
32 | #include <asm/irq.h> | ||
33 | #include <asm/mach/irq.h> | 32 | #include <asm/mach/irq.h> |
33 | #include <asm/mach-types.h> | ||
34 | #include <asm/sizes.h> | 34 | #include <asm/sizes.h> |
35 | 35 | ||
36 | #include <asm/hardware/sa1111.h> | 36 | #include <asm/hardware/sa1111.h> |
@@ -86,8 +86,10 @@ | |||
86 | #define IRQ_S1_CD_VALID (52) | 86 | #define IRQ_S1_CD_VALID (52) |
87 | #define IRQ_S0_BVD1_STSCHG (53) | 87 | #define IRQ_S0_BVD1_STSCHG (53) |
88 | #define IRQ_S1_BVD1_STSCHG (54) | 88 | #define IRQ_S1_BVD1_STSCHG (54) |
89 | #define SA1111_IRQ_NR (55) | ||
89 | 90 | ||
90 | extern void __init sa1110_mb_enable(void); | 91 | extern void sa1110_mb_enable(void); |
92 | extern void sa1110_mb_disable(void); | ||
91 | 93 | ||
92 | /* | 94 | /* |
93 | * We keep the following data for the overall SA1111. Note that the | 95 | * We keep the following data for the overall SA1111. Note that the |
@@ -104,6 +106,7 @@ struct sa1111 { | |||
104 | int irq_base; /* base for cascaded on-chip IRQs */ | 106 | int irq_base; /* base for cascaded on-chip IRQs */ |
105 | spinlock_t lock; | 107 | spinlock_t lock; |
106 | void __iomem *base; | 108 | void __iomem *base; |
109 | struct sa1111_platform_data *pdata; | ||
107 | #ifdef CONFIG_PM | 110 | #ifdef CONFIG_PM |
108 | void *saved_state; | 111 | void *saved_state; |
109 | #endif | 112 | #endif |
@@ -118,6 +121,7 @@ static struct sa1111 *g_sa1111; | |||
118 | struct sa1111_dev_info { | 121 | struct sa1111_dev_info { |
119 | unsigned long offset; | 122 | unsigned long offset; |
120 | unsigned long skpcr_mask; | 123 | unsigned long skpcr_mask; |
124 | bool dma; | ||
121 | unsigned int devid; | 125 | unsigned int devid; |
122 | unsigned int irq[6]; | 126 | unsigned int irq[6]; |
123 | }; | 127 | }; |
@@ -126,6 +130,7 @@ static struct sa1111_dev_info sa1111_devices[] = { | |||
126 | { | 130 | { |
127 | .offset = SA1111_USB, | 131 | .offset = SA1111_USB, |
128 | .skpcr_mask = SKPCR_UCLKEN, | 132 | .skpcr_mask = SKPCR_UCLKEN, |
133 | .dma = true, | ||
129 | .devid = SA1111_DEVID_USB, | 134 | .devid = SA1111_DEVID_USB, |
130 | .irq = { | 135 | .irq = { |
131 | IRQ_USBPWR, | 136 | IRQ_USBPWR, |
@@ -139,6 +144,7 @@ static struct sa1111_dev_info sa1111_devices[] = { | |||
139 | { | 144 | { |
140 | .offset = 0x0600, | 145 | .offset = 0x0600, |
141 | .skpcr_mask = SKPCR_I2SCLKEN | SKPCR_L3CLKEN, | 146 | .skpcr_mask = SKPCR_I2SCLKEN | SKPCR_L3CLKEN, |
147 | .dma = true, | ||
142 | .devid = SA1111_DEVID_SAC, | 148 | .devid = SA1111_DEVID_SAC, |
143 | .irq = { | 149 | .irq = { |
144 | AUDXMTDMADONEA, | 150 | AUDXMTDMADONEA, |
@@ -155,7 +161,7 @@ static struct sa1111_dev_info sa1111_devices[] = { | |||
155 | { | 161 | { |
156 | .offset = SA1111_KBD, | 162 | .offset = SA1111_KBD, |
157 | .skpcr_mask = SKPCR_PTCLKEN, | 163 | .skpcr_mask = SKPCR_PTCLKEN, |
158 | .devid = SA1111_DEVID_PS2, | 164 | .devid = SA1111_DEVID_PS2_KBD, |
159 | .irq = { | 165 | .irq = { |
160 | IRQ_TPRXINT, | 166 | IRQ_TPRXINT, |
161 | IRQ_TPTXINT | 167 | IRQ_TPTXINT |
@@ -164,7 +170,7 @@ static struct sa1111_dev_info sa1111_devices[] = { | |||
164 | { | 170 | { |
165 | .offset = SA1111_MSE, | 171 | .offset = SA1111_MSE, |
166 | .skpcr_mask = SKPCR_PMCLKEN, | 172 | .skpcr_mask = SKPCR_PMCLKEN, |
167 | .devid = SA1111_DEVID_PS2, | 173 | .devid = SA1111_DEVID_PS2_MSE, |
168 | .irq = { | 174 | .irq = { |
169 | IRQ_MSRXINT, | 175 | IRQ_MSRXINT, |
170 | IRQ_MSTXINT | 176 | IRQ_MSTXINT |
@@ -434,16 +440,28 @@ static struct irq_chip sa1111_high_chip = { | |||
434 | .irq_set_wake = sa1111_wake_highirq, | 440 | .irq_set_wake = sa1111_wake_highirq, |
435 | }; | 441 | }; |
436 | 442 | ||
437 | static void sa1111_setup_irq(struct sa1111 *sachip) | 443 | static int sa1111_setup_irq(struct sa1111 *sachip, unsigned irq_base) |
438 | { | 444 | { |
439 | void __iomem *irqbase = sachip->base + SA1111_INTC; | 445 | void __iomem *irqbase = sachip->base + SA1111_INTC; |
440 | unsigned int irq; | 446 | unsigned i, irq; |
447 | int ret; | ||
441 | 448 | ||
442 | /* | 449 | /* |
443 | * We're guaranteed that this region hasn't been taken. | 450 | * We're guaranteed that this region hasn't been taken. |
444 | */ | 451 | */ |
445 | request_mem_region(sachip->phys + SA1111_INTC, 512, "irq"); | 452 | request_mem_region(sachip->phys + SA1111_INTC, 512, "irq"); |
446 | 453 | ||
454 | ret = irq_alloc_descs(-1, irq_base, SA1111_IRQ_NR, -1); | ||
455 | if (ret <= 0) { | ||
456 | dev_err(sachip->dev, "unable to allocate %u irqs: %d\n", | ||
457 | SA1111_IRQ_NR, ret); | ||
458 | if (ret == 0) | ||
459 | ret = -EINVAL; | ||
460 | return ret; | ||
461 | } | ||
462 | |||
463 | sachip->irq_base = ret; | ||
464 | |||
447 | /* disable all IRQs */ | 465 | /* disable all IRQs */ |
448 | sa1111_writel(0, irqbase + SA1111_INTEN0); | 466 | sa1111_writel(0, irqbase + SA1111_INTEN0); |
449 | sa1111_writel(0, irqbase + SA1111_INTEN1); | 467 | sa1111_writel(0, irqbase + SA1111_INTEN1); |
@@ -463,14 +481,16 @@ static void sa1111_setup_irq(struct sa1111 *sachip) | |||
463 | sa1111_writel(~0, irqbase + SA1111_INTSTATCLR0); | 481 | sa1111_writel(~0, irqbase + SA1111_INTSTATCLR0); |
464 | sa1111_writel(~0, irqbase + SA1111_INTSTATCLR1); | 482 | sa1111_writel(~0, irqbase + SA1111_INTSTATCLR1); |
465 | 483 | ||
466 | for (irq = IRQ_GPAIN0; irq <= SSPROR; irq++) { | 484 | for (i = IRQ_GPAIN0; i <= SSPROR; i++) { |
485 | irq = sachip->irq_base + i; | ||
467 | irq_set_chip_and_handler(irq, &sa1111_low_chip, | 486 | irq_set_chip_and_handler(irq, &sa1111_low_chip, |
468 | handle_edge_irq); | 487 | handle_edge_irq); |
469 | irq_set_chip_data(irq, sachip); | 488 | irq_set_chip_data(irq, sachip); |
470 | set_irq_flags(irq, IRQF_VALID | IRQF_PROBE); | 489 | set_irq_flags(irq, IRQF_VALID | IRQF_PROBE); |
471 | } | 490 | } |
472 | 491 | ||
473 | for (irq = AUDXMTDMADONEA; irq <= IRQ_S1_BVD1_STSCHG; irq++) { | 492 | for (i = AUDXMTDMADONEA; i <= IRQ_S1_BVD1_STSCHG; i++) { |
493 | irq = sachip->irq_base + i; | ||
474 | irq_set_chip_and_handler(irq, &sa1111_high_chip, | 494 | irq_set_chip_and_handler(irq, &sa1111_high_chip, |
475 | handle_edge_irq); | 495 | handle_edge_irq); |
476 | irq_set_chip_data(irq, sachip); | 496 | irq_set_chip_data(irq, sachip); |
@@ -483,6 +503,11 @@ static void sa1111_setup_irq(struct sa1111 *sachip) | |||
483 | irq_set_irq_type(sachip->irq, IRQ_TYPE_EDGE_RISING); | 503 | irq_set_irq_type(sachip->irq, IRQ_TYPE_EDGE_RISING); |
484 | irq_set_handler_data(sachip->irq, sachip); | 504 | irq_set_handler_data(sachip->irq, sachip); |
485 | irq_set_chained_handler(sachip->irq, sa1111_irq_handler); | 505 | irq_set_chained_handler(sachip->irq, sa1111_irq_handler); |
506 | |||
507 | dev_info(sachip->dev, "Providing IRQ%u-%u\n", | ||
508 | sachip->irq_base, sachip->irq_base + SA1111_IRQ_NR - 1); | ||
509 | |||
510 | return 0; | ||
486 | } | 511 | } |
487 | 512 | ||
488 | /* | 513 | /* |
@@ -581,41 +606,10 @@ sa1111_configure_smc(struct sa1111 *sachip, int sdram, unsigned int drac, | |||
581 | } | 606 | } |
582 | #endif | 607 | #endif |
583 | 608 | ||
584 | #ifdef CONFIG_DMABOUNCE | ||
585 | /* | ||
586 | * According to the "Intel StrongARM SA-1111 Microprocessor Companion | ||
587 | * Chip Specification Update" (June 2000), erratum #7, there is a | ||
588 | * significant bug in the SA1111 SDRAM shared memory controller. If | ||
589 | * an access to a region of memory above 1MB relative to the bank base, | ||
590 | * it is important that address bit 10 _NOT_ be asserted. Depending | ||
591 | * on the configuration of the RAM, bit 10 may correspond to one | ||
592 | * of several different (processor-relative) address bits. | ||
593 | * | ||
594 | * This routine only identifies whether or not a given DMA address | ||
595 | * is susceptible to the bug. | ||
596 | * | ||
597 | * This should only get called for sa1111_device types due to the | ||
598 | * way we configure our device dma_masks. | ||
599 | */ | ||
600 | static int sa1111_needs_bounce(struct device *dev, dma_addr_t addr, size_t size) | ||
601 | { | ||
602 | /* | ||
603 | * Section 4.6 of the "Intel StrongARM SA-1111 Development Module | ||
604 | * User's Guide" mentions that jumpers R51 and R52 control the | ||
605 | * target of SA-1111 DMA (either SDRAM bank 0 on Assabet, or | ||
606 | * SDRAM bank 1 on Neponset). The default configuration selects | ||
607 | * Assabet, so any address in bank 1 is necessarily invalid. | ||
608 | */ | ||
609 | return (machine_is_assabet() || machine_is_pfs168()) && | ||
610 | (addr >= 0xc8000000 || (addr + size) >= 0xc8000000); | ||
611 | } | ||
612 | #endif | ||
613 | |||
614 | static void sa1111_dev_release(struct device *_dev) | 609 | static void sa1111_dev_release(struct device *_dev) |
615 | { | 610 | { |
616 | struct sa1111_dev *dev = SA1111_DEV(_dev); | 611 | struct sa1111_dev *dev = SA1111_DEV(_dev); |
617 | 612 | ||
618 | release_resource(&dev->res); | ||
619 | kfree(dev); | 613 | kfree(dev); |
620 | } | 614 | } |
621 | 615 | ||
@@ -624,67 +618,58 @@ sa1111_init_one_child(struct sa1111 *sachip, struct resource *parent, | |||
624 | struct sa1111_dev_info *info) | 618 | struct sa1111_dev_info *info) |
625 | { | 619 | { |
626 | struct sa1111_dev *dev; | 620 | struct sa1111_dev *dev; |
621 | unsigned i; | ||
627 | int ret; | 622 | int ret; |
628 | 623 | ||
629 | dev = kzalloc(sizeof(struct sa1111_dev), GFP_KERNEL); | 624 | dev = kzalloc(sizeof(struct sa1111_dev), GFP_KERNEL); |
630 | if (!dev) { | 625 | if (!dev) { |
631 | ret = -ENOMEM; | 626 | ret = -ENOMEM; |
632 | goto out; | 627 | goto err_alloc; |
633 | } | 628 | } |
634 | 629 | ||
630 | device_initialize(&dev->dev); | ||
635 | dev_set_name(&dev->dev, "%4.4lx", info->offset); | 631 | dev_set_name(&dev->dev, "%4.4lx", info->offset); |
636 | dev->devid = info->devid; | 632 | dev->devid = info->devid; |
637 | dev->dev.parent = sachip->dev; | 633 | dev->dev.parent = sachip->dev; |
638 | dev->dev.bus = &sa1111_bus_type; | 634 | dev->dev.bus = &sa1111_bus_type; |
639 | dev->dev.release = sa1111_dev_release; | 635 | dev->dev.release = sa1111_dev_release; |
640 | dev->dev.coherent_dma_mask = sachip->dev->coherent_dma_mask; | ||
641 | dev->res.start = sachip->phys + info->offset; | 636 | dev->res.start = sachip->phys + info->offset; |
642 | dev->res.end = dev->res.start + 511; | 637 | dev->res.end = dev->res.start + 511; |
643 | dev->res.name = dev_name(&dev->dev); | 638 | dev->res.name = dev_name(&dev->dev); |
644 | dev->res.flags = IORESOURCE_MEM; | 639 | dev->res.flags = IORESOURCE_MEM; |
645 | dev->mapbase = sachip->base + info->offset; | 640 | dev->mapbase = sachip->base + info->offset; |
646 | dev->skpcr_mask = info->skpcr_mask; | 641 | dev->skpcr_mask = info->skpcr_mask; |
647 | memmove(dev->irq, info->irq, sizeof(dev->irq)); | ||
648 | |||
649 | ret = request_resource(parent, &dev->res); | ||
650 | if (ret) { | ||
651 | printk("SA1111: failed to allocate resource for %s\n", | ||
652 | dev->res.name); | ||
653 | dev_set_name(&dev->dev, NULL); | ||
654 | kfree(dev); | ||
655 | goto out; | ||
656 | } | ||
657 | |||
658 | 642 | ||
659 | ret = device_register(&dev->dev); | 643 | for (i = 0; i < ARRAY_SIZE(info->irq); i++) |
660 | if (ret) { | 644 | dev->irq[i] = sachip->irq_base + info->irq[i]; |
661 | release_resource(&dev->res); | ||
662 | kfree(dev); | ||
663 | goto out; | ||
664 | } | ||
665 | 645 | ||
666 | #ifdef CONFIG_DMABOUNCE | ||
667 | /* | 646 | /* |
668 | * If the parent device has a DMA mask associated with it, | 647 | * If the parent device has a DMA mask associated with it, and |
669 | * propagate it down to the children. | 648 | * this child supports DMA, propagate it down to the children. |
670 | */ | 649 | */ |
671 | if (sachip->dev->dma_mask) { | 650 | if (info->dma && sachip->dev->dma_mask) { |
672 | dev->dma_mask = *sachip->dev->dma_mask; | 651 | dev->dma_mask = *sachip->dev->dma_mask; |
673 | dev->dev.dma_mask = &dev->dma_mask; | 652 | dev->dev.dma_mask = &dev->dma_mask; |
653 | dev->dev.coherent_dma_mask = sachip->dev->coherent_dma_mask; | ||
654 | } | ||
674 | 655 | ||
675 | if (dev->dma_mask != 0xffffffffUL) { | 656 | ret = request_resource(parent, &dev->res); |
676 | ret = dmabounce_register_dev(&dev->dev, 1024, 4096, | 657 | if (ret) { |
677 | sa1111_needs_bounce); | 658 | dev_err(sachip->dev, "failed to allocate resource for %s\n", |
678 | if (ret) { | 659 | dev->res.name); |
679 | dev_err(&dev->dev, "SA1111: Failed to register" | 660 | goto err_resource; |
680 | " with dmabounce\n"); | ||
681 | device_unregister(&dev->dev); | ||
682 | } | ||
683 | } | ||
684 | } | 661 | } |
685 | #endif | ||
686 | 662 | ||
687 | out: | 663 | ret = device_add(&dev->dev); |
664 | if (ret) | ||
665 | goto err_add; | ||
666 | return 0; | ||
667 | |||
668 | err_add: | ||
669 | release_resource(&dev->res); | ||
670 | err_resource: | ||
671 | put_device(&dev->dev); | ||
672 | err_alloc: | ||
688 | return ret; | 673 | return ret; |
689 | } | 674 | } |
690 | 675 | ||
@@ -698,16 +683,21 @@ out: | |||
698 | * Returns: | 683 | * Returns: |
699 | * %-ENODEV device not found. | 684 | * %-ENODEV device not found. |
700 | * %-EBUSY physical address already marked in-use. | 685 | * %-EBUSY physical address already marked in-use. |
686 | * %-EINVAL no platform data passed | ||
701 | * %0 successful. | 687 | * %0 successful. |
702 | */ | 688 | */ |
703 | static int __devinit | 689 | static int __devinit |
704 | __sa1111_probe(struct device *me, struct resource *mem, int irq) | 690 | __sa1111_probe(struct device *me, struct resource *mem, int irq) |
705 | { | 691 | { |
692 | struct sa1111_platform_data *pd = me->platform_data; | ||
706 | struct sa1111 *sachip; | 693 | struct sa1111 *sachip; |
707 | unsigned long id; | 694 | unsigned long id; |
708 | unsigned int has_devs; | 695 | unsigned int has_devs; |
709 | int i, ret = -ENODEV; | 696 | int i, ret = -ENODEV; |
710 | 697 | ||
698 | if (!pd) | ||
699 | return -EINVAL; | ||
700 | |||
711 | sachip = kzalloc(sizeof(struct sa1111), GFP_KERNEL); | 701 | sachip = kzalloc(sizeof(struct sa1111), GFP_KERNEL); |
712 | if (!sachip) | 702 | if (!sachip) |
713 | return -ENOMEM; | 703 | return -ENOMEM; |
@@ -727,6 +717,7 @@ __sa1111_probe(struct device *me, struct resource *mem, int irq) | |||
727 | sachip->dev = me; | 717 | sachip->dev = me; |
728 | dev_set_drvdata(sachip->dev, sachip); | 718 | dev_set_drvdata(sachip->dev, sachip); |
729 | 719 | ||
720 | sachip->pdata = pd; | ||
730 | sachip->phys = mem->start; | 721 | sachip->phys = mem->start; |
731 | sachip->irq = irq; | 722 | sachip->irq = irq; |
732 | 723 | ||
@@ -759,6 +750,16 @@ __sa1111_probe(struct device *me, struct resource *mem, int irq) | |||
759 | */ | 750 | */ |
760 | sa1111_wake(sachip); | 751 | sa1111_wake(sachip); |
761 | 752 | ||
753 | /* | ||
754 | * The interrupt controller must be initialised before any | ||
755 | * other device to ensure that the interrupts are available. | ||
756 | */ | ||
757 | if (sachip->irq != NO_IRQ) { | ||
758 | ret = sa1111_setup_irq(sachip, pd->irq_base); | ||
759 | if (ret) | ||
760 | goto err_unmap; | ||
761 | } | ||
762 | |||
762 | #ifdef CONFIG_ARCH_SA1100 | 763 | #ifdef CONFIG_ARCH_SA1100 |
763 | { | 764 | { |
764 | unsigned int val; | 765 | unsigned int val; |
@@ -789,24 +790,14 @@ __sa1111_probe(struct device *me, struct resource *mem, int irq) | |||
789 | } | 790 | } |
790 | #endif | 791 | #endif |
791 | 792 | ||
792 | /* | ||
793 | * The interrupt controller must be initialised before any | ||
794 | * other device to ensure that the interrupts are available. | ||
795 | */ | ||
796 | if (sachip->irq != NO_IRQ) | ||
797 | sa1111_setup_irq(sachip); | ||
798 | |||
799 | g_sa1111 = sachip; | 793 | g_sa1111 = sachip; |
800 | 794 | ||
801 | has_devs = ~0; | 795 | has_devs = ~0; |
802 | if (machine_is_assabet() || machine_is_jornada720() || | 796 | if (pd) |
803 | machine_is_badge4()) | 797 | has_devs &= ~pd->disable_devs; |
804 | has_devs &= ~(1 << 4); | ||
805 | else | ||
806 | has_devs &= ~(1 << 1); | ||
807 | 798 | ||
808 | for (i = 0; i < ARRAY_SIZE(sa1111_devices); i++) | 799 | for (i = 0; i < ARRAY_SIZE(sa1111_devices); i++) |
809 | if (has_devs & (1 << i)) | 800 | if (sa1111_devices[i].devid & has_devs) |
810 | sa1111_init_one_child(sachip, mem, &sa1111_devices[i]); | 801 | sa1111_init_one_child(sachip, mem, &sa1111_devices[i]); |
811 | 802 | ||
812 | return 0; | 803 | return 0; |
@@ -824,7 +815,10 @@ __sa1111_probe(struct device *me, struct resource *mem, int irq) | |||
824 | 815 | ||
825 | static int sa1111_remove_one(struct device *dev, void *data) | 816 | static int sa1111_remove_one(struct device *dev, void *data) |
826 | { | 817 | { |
827 | device_unregister(dev); | 818 | struct sa1111_dev *sadev = SA1111_DEV(dev); |
819 | device_del(&sadev->dev); | ||
820 | release_resource(&sadev->res); | ||
821 | put_device(&sadev->dev); | ||
828 | return 0; | 822 | return 0; |
829 | } | 823 | } |
830 | 824 | ||
@@ -846,6 +840,7 @@ static void __sa1111_remove(struct sa1111 *sachip) | |||
846 | if (sachip->irq != NO_IRQ) { | 840 | if (sachip->irq != NO_IRQ) { |
847 | irq_set_chained_handler(sachip->irq, NULL); | 841 | irq_set_chained_handler(sachip->irq, NULL); |
848 | irq_set_handler_data(sachip->irq, NULL); | 842 | irq_set_handler_data(sachip->irq, NULL); |
843 | irq_free_descs(sachip->irq_base, SA1111_IRQ_NR); | ||
849 | 844 | ||
850 | release_mem_region(sachip->phys + SA1111_INTC, 512); | 845 | release_mem_region(sachip->phys + SA1111_INTC, 512); |
851 | } | 846 | } |
@@ -904,6 +899,9 @@ static int sa1111_suspend(struct platform_device *dev, pm_message_t state) | |||
904 | save->skpwm0 = sa1111_readl(base + SA1111_SKPWM0); | 899 | save->skpwm0 = sa1111_readl(base + SA1111_SKPWM0); |
905 | save->skpwm1 = sa1111_readl(base + SA1111_SKPWM1); | 900 | save->skpwm1 = sa1111_readl(base + SA1111_SKPWM1); |
906 | 901 | ||
902 | sa1111_writel(0, sachip->base + SA1111_SKPWM0); | ||
903 | sa1111_writel(0, sachip->base + SA1111_SKPWM1); | ||
904 | |||
907 | base = sachip->base + SA1111_INTC; | 905 | base = sachip->base + SA1111_INTC; |
908 | save->intpol0 = sa1111_readl(base + SA1111_INTPOL0); | 906 | save->intpol0 = sa1111_readl(base + SA1111_INTPOL0); |
909 | save->intpol1 = sa1111_readl(base + SA1111_INTPOL1); | 907 | save->intpol1 = sa1111_readl(base + SA1111_INTPOL1); |
@@ -919,13 +917,15 @@ static int sa1111_suspend(struct platform_device *dev, pm_message_t state) | |||
919 | */ | 917 | */ |
920 | val = sa1111_readl(sachip->base + SA1111_SKCR); | 918 | val = sa1111_readl(sachip->base + SA1111_SKCR); |
921 | sa1111_writel(val | SKCR_SLEEP, sachip->base + SA1111_SKCR); | 919 | sa1111_writel(val | SKCR_SLEEP, sachip->base + SA1111_SKCR); |
922 | sa1111_writel(0, sachip->base + SA1111_SKPWM0); | ||
923 | sa1111_writel(0, sachip->base + SA1111_SKPWM1); | ||
924 | 920 | ||
925 | clk_disable(sachip->clk); | 921 | clk_disable(sachip->clk); |
926 | 922 | ||
927 | spin_unlock_irqrestore(&sachip->lock, flags); | 923 | spin_unlock_irqrestore(&sachip->lock, flags); |
928 | 924 | ||
925 | #ifdef CONFIG_ARCH_SA1100 | ||
926 | sa1110_mb_disable(); | ||
927 | #endif | ||
928 | |||
929 | return 0; | 929 | return 0; |
930 | } | 930 | } |
931 | 931 | ||
@@ -966,6 +966,11 @@ static int sa1111_resume(struct platform_device *dev) | |||
966 | */ | 966 | */ |
967 | sa1111_wake(sachip); | 967 | sa1111_wake(sachip); |
968 | 968 | ||
969 | #ifdef CONFIG_ARCH_SA1100 | ||
970 | /* Enable the memory bus request/grant signals */ | ||
971 | sa1110_mb_enable(); | ||
972 | #endif | ||
973 | |||
969 | /* | 974 | /* |
970 | * Only lock for write ops. Also, sa1111_wake must be called with | 975 | * Only lock for write ops. Also, sa1111_wake must be called with |
971 | * released spinlock! | 976 | * released spinlock! |
@@ -1053,6 +1058,7 @@ static struct platform_driver sa1111_device_driver = { | |||
1053 | .resume = sa1111_resume, | 1058 | .resume = sa1111_resume, |
1054 | .driver = { | 1059 | .driver = { |
1055 | .name = "sa1111", | 1060 | .name = "sa1111", |
1061 | .owner = THIS_MODULE, | ||
1056 | }, | 1062 | }, |
1057 | }; | 1063 | }; |
1058 | 1064 | ||
@@ -1238,16 +1244,23 @@ EXPORT_SYMBOL(sa1111_set_sleep_io); | |||
1238 | * sa1111_enable_device - enable an on-chip SA1111 function block | 1244 | * sa1111_enable_device - enable an on-chip SA1111 function block |
1239 | * @sadev: SA1111 function block device to enable | 1245 | * @sadev: SA1111 function block device to enable |
1240 | */ | 1246 | */ |
1241 | void sa1111_enable_device(struct sa1111_dev *sadev) | 1247 | int sa1111_enable_device(struct sa1111_dev *sadev) |
1242 | { | 1248 | { |
1243 | struct sa1111 *sachip = sa1111_chip_driver(sadev); | 1249 | struct sa1111 *sachip = sa1111_chip_driver(sadev); |
1244 | unsigned long flags; | 1250 | unsigned long flags; |
1245 | unsigned int val; | 1251 | unsigned int val; |
1252 | int ret = 0; | ||
1246 | 1253 | ||
1247 | spin_lock_irqsave(&sachip->lock, flags); | 1254 | if (sachip->pdata && sachip->pdata->enable) |
1248 | val = sa1111_readl(sachip->base + SA1111_SKPCR); | 1255 | ret = sachip->pdata->enable(sachip->pdata->data, sadev->devid); |
1249 | sa1111_writel(val | sadev->skpcr_mask, sachip->base + SA1111_SKPCR); | 1256 | |
1250 | spin_unlock_irqrestore(&sachip->lock, flags); | 1257 | if (ret == 0) { |
1258 | spin_lock_irqsave(&sachip->lock, flags); | ||
1259 | val = sa1111_readl(sachip->base + SA1111_SKPCR); | ||
1260 | sa1111_writel(val | sadev->skpcr_mask, sachip->base + SA1111_SKPCR); | ||
1261 | spin_unlock_irqrestore(&sachip->lock, flags); | ||
1262 | } | ||
1263 | return ret; | ||
1251 | } | 1264 | } |
1252 | EXPORT_SYMBOL(sa1111_enable_device); | 1265 | EXPORT_SYMBOL(sa1111_enable_device); |
1253 | 1266 | ||
@@ -1265,6 +1278,9 @@ void sa1111_disable_device(struct sa1111_dev *sadev) | |||
1265 | val = sa1111_readl(sachip->base + SA1111_SKPCR); | 1278 | val = sa1111_readl(sachip->base + SA1111_SKPCR); |
1266 | sa1111_writel(val & ~sadev->skpcr_mask, sachip->base + SA1111_SKPCR); | 1279 | sa1111_writel(val & ~sadev->skpcr_mask, sachip->base + SA1111_SKPCR); |
1267 | spin_unlock_irqrestore(&sachip->lock, flags); | 1280 | spin_unlock_irqrestore(&sachip->lock, flags); |
1281 | |||
1282 | if (sachip->pdata && sachip->pdata->disable) | ||
1283 | sachip->pdata->disable(sachip->pdata->data, sadev->devid); | ||
1268 | } | 1284 | } |
1269 | EXPORT_SYMBOL(sa1111_disable_device); | 1285 | EXPORT_SYMBOL(sa1111_disable_device); |
1270 | 1286 | ||
@@ -1279,7 +1295,7 @@ static int sa1111_match(struct device *_dev, struct device_driver *_drv) | |||
1279 | struct sa1111_dev *dev = SA1111_DEV(_dev); | 1295 | struct sa1111_dev *dev = SA1111_DEV(_dev); |
1280 | struct sa1111_driver *drv = SA1111_DRV(_drv); | 1296 | struct sa1111_driver *drv = SA1111_DRV(_drv); |
1281 | 1297 | ||
1282 | return dev->devid == drv->devid; | 1298 | return dev->devid & drv->devid; |
1283 | } | 1299 | } |
1284 | 1300 | ||
1285 | static int sa1111_bus_suspend(struct device *dev, pm_message_t state) | 1301 | static int sa1111_bus_suspend(struct device *dev, pm_message_t state) |
@@ -1304,6 +1320,14 @@ static int sa1111_bus_resume(struct device *dev) | |||
1304 | return ret; | 1320 | return ret; |
1305 | } | 1321 | } |
1306 | 1322 | ||
1323 | static void sa1111_bus_shutdown(struct device *dev) | ||
1324 | { | ||
1325 | struct sa1111_driver *drv = SA1111_DRV(dev->driver); | ||
1326 | |||
1327 | if (drv && drv->shutdown) | ||
1328 | drv->shutdown(SA1111_DEV(dev)); | ||
1329 | } | ||
1330 | |||
1307 | static int sa1111_bus_probe(struct device *dev) | 1331 | static int sa1111_bus_probe(struct device *dev) |
1308 | { | 1332 | { |
1309 | struct sa1111_dev *sadev = SA1111_DEV(dev); | 1333 | struct sa1111_dev *sadev = SA1111_DEV(dev); |
@@ -1333,6 +1357,7 @@ struct bus_type sa1111_bus_type = { | |||
1333 | .remove = sa1111_bus_remove, | 1357 | .remove = sa1111_bus_remove, |
1334 | .suspend = sa1111_bus_suspend, | 1358 | .suspend = sa1111_bus_suspend, |
1335 | .resume = sa1111_bus_resume, | 1359 | .resume = sa1111_bus_resume, |
1360 | .shutdown = sa1111_bus_shutdown, | ||
1336 | }; | 1361 | }; |
1337 | EXPORT_SYMBOL(sa1111_bus_type); | 1362 | EXPORT_SYMBOL(sa1111_bus_type); |
1338 | 1363 | ||
@@ -1349,9 +1374,70 @@ void sa1111_driver_unregister(struct sa1111_driver *driver) | |||
1349 | } | 1374 | } |
1350 | EXPORT_SYMBOL(sa1111_driver_unregister); | 1375 | EXPORT_SYMBOL(sa1111_driver_unregister); |
1351 | 1376 | ||
1377 | #ifdef CONFIG_DMABOUNCE | ||
1378 | /* | ||
1379 | * According to the "Intel StrongARM SA-1111 Microprocessor Companion | ||
1380 | * Chip Specification Update" (June 2000), erratum #7, there is a | ||
1381 | * significant bug in the SA1111 SDRAM shared memory controller. If | ||
1382 | * an access to a region of memory above 1MB relative to the bank base, | ||
1383 | * it is important that address bit 10 _NOT_ be asserted. Depending | ||
1384 | * on the configuration of the RAM, bit 10 may correspond to one | ||
1385 | * of several different (processor-relative) address bits. | ||
1386 | * | ||
1387 | * This routine only identifies whether or not a given DMA address | ||
1388 | * is susceptible to the bug. | ||
1389 | * | ||
1390 | * This should only get called for sa1111_device types due to the | ||
1391 | * way we configure our device dma_masks. | ||
1392 | */ | ||
1393 | static int sa1111_needs_bounce(struct device *dev, dma_addr_t addr, size_t size) | ||
1394 | { | ||
1395 | /* | ||
1396 | * Section 4.6 of the "Intel StrongARM SA-1111 Development Module | ||
1397 | * User's Guide" mentions that jumpers R51 and R52 control the | ||
1398 | * target of SA-1111 DMA (either SDRAM bank 0 on Assabet, or | ||
1399 | * SDRAM bank 1 on Neponset). The default configuration selects | ||
1400 | * Assabet, so any address in bank 1 is necessarily invalid. | ||
1401 | */ | ||
1402 | return (machine_is_assabet() || machine_is_pfs168()) && | ||
1403 | (addr >= 0xc8000000 || (addr + size) >= 0xc8000000); | ||
1404 | } | ||
1405 | |||
1406 | static int sa1111_notifier_call(struct notifier_block *n, unsigned long action, | ||
1407 | void *data) | ||
1408 | { | ||
1409 | struct sa1111_dev *dev = SA1111_DEV(data); | ||
1410 | |||
1411 | switch (action) { | ||
1412 | case BUS_NOTIFY_ADD_DEVICE: | ||
1413 | if (dev->dev.dma_mask && dev->dma_mask < 0xffffffffUL) { | ||
1414 | int ret = dmabounce_register_dev(&dev->dev, 1024, 4096, | ||
1415 | sa1111_needs_bounce); | ||
1416 | if (ret) | ||
1417 | dev_err(&dev->dev, "failed to register with dmabounce: %d\n", ret); | ||
1418 | } | ||
1419 | break; | ||
1420 | |||
1421 | case BUS_NOTIFY_DEL_DEVICE: | ||
1422 | if (dev->dev.dma_mask && dev->dma_mask < 0xffffffffUL) | ||
1423 | dmabounce_unregister_dev(&dev->dev); | ||
1424 | break; | ||
1425 | } | ||
1426 | return NOTIFY_OK; | ||
1427 | } | ||
1428 | |||
1429 | static struct notifier_block sa1111_bus_notifier = { | ||
1430 | .notifier_call = sa1111_notifier_call, | ||
1431 | }; | ||
1432 | #endif | ||
1433 | |||
1352 | static int __init sa1111_init(void) | 1434 | static int __init sa1111_init(void) |
1353 | { | 1435 | { |
1354 | int ret = bus_register(&sa1111_bus_type); | 1436 | int ret = bus_register(&sa1111_bus_type); |
1437 | #ifdef CONFIG_DMABOUNCE | ||
1438 | if (ret == 0) | ||
1439 | bus_register_notifier(&sa1111_bus_type, &sa1111_bus_notifier); | ||
1440 | #endif | ||
1355 | if (ret == 0) | 1441 | if (ret == 0) |
1356 | platform_driver_register(&sa1111_device_driver); | 1442 | platform_driver_register(&sa1111_device_driver); |
1357 | return ret; | 1443 | return ret; |
@@ -1360,6 +1446,9 @@ static int __init sa1111_init(void) | |||
1360 | static void __exit sa1111_exit(void) | 1446 | static void __exit sa1111_exit(void) |
1361 | { | 1447 | { |
1362 | platform_driver_unregister(&sa1111_device_driver); | 1448 | platform_driver_unregister(&sa1111_device_driver); |
1449 | #ifdef CONFIG_DMABOUNCE | ||
1450 | bus_unregister_notifier(&sa1111_bus_type, &sa1111_bus_notifier); | ||
1451 | #endif | ||
1363 | bus_unregister(&sa1111_bus_type); | 1452 | bus_unregister(&sa1111_bus_type); |
1364 | } | 1453 | } |
1365 | 1454 | ||
diff --git a/arch/arm/include/asm/hardware/sa1111.h b/arch/arm/include/asm/hardware/sa1111.h index 92ed254c175b..7c2bbc7f0be1 100644 --- a/arch/arm/include/asm/hardware/sa1111.h +++ b/arch/arm/include/asm/hardware/sa1111.h | |||
@@ -132,34 +132,10 @@ | |||
132 | #define SKPCR_DCLKEN (1<<7) | 132 | #define SKPCR_DCLKEN (1<<7) |
133 | #define SKPCR_PWMCLKEN (1<<8) | 133 | #define SKPCR_PWMCLKEN (1<<8) |
134 | 134 | ||
135 | /* | 135 | /* USB Host controller */ |
136 | * USB Host controller | ||
137 | */ | ||
138 | #define SA1111_USB 0x0400 | 136 | #define SA1111_USB 0x0400 |
139 | 137 | ||
140 | /* | 138 | /* |
141 | * Offsets from SA1111_USB_BASE | ||
142 | */ | ||
143 | #define SA1111_USB_STATUS 0x0118 | ||
144 | #define SA1111_USB_RESET 0x011c | ||
145 | #define SA1111_USB_IRQTEST 0x0120 | ||
146 | |||
147 | #define USB_RESET_FORCEIFRESET (1 << 0) | ||
148 | #define USB_RESET_FORCEHCRESET (1 << 1) | ||
149 | #define USB_RESET_CLKGENRESET (1 << 2) | ||
150 | #define USB_RESET_SIMSCALEDOWN (1 << 3) | ||
151 | #define USB_RESET_USBINTTEST (1 << 4) | ||
152 | #define USB_RESET_SLEEPSTBYEN (1 << 5) | ||
153 | #define USB_RESET_PWRSENSELOW (1 << 6) | ||
154 | #define USB_RESET_PWRCTRLLOW (1 << 7) | ||
155 | |||
156 | #define USB_STATUS_IRQHCIRMTWKUP (1 << 7) | ||
157 | #define USB_STATUS_IRQHCIBUFFACC (1 << 8) | ||
158 | #define USB_STATUS_NIRQHCIM (1 << 9) | ||
159 | #define USB_STATUS_NHCIMFCLR (1 << 10) | ||
160 | #define USB_STATUS_USBPWRSENSE (1 << 11) | ||
161 | |||
162 | /* | ||
163 | * Serial Audio Controller | 139 | * Serial Audio Controller |
164 | * | 140 | * |
165 | * Registers | 141 | * Registers |
@@ -327,22 +303,6 @@ | |||
327 | * PC_SSR GPIO Block C Sleep State | 303 | * PC_SSR GPIO Block C Sleep State |
328 | */ | 304 | */ |
329 | 305 | ||
330 | #define _PA_DDR _SA1111( 0x1000 ) | ||
331 | #define _PA_DRR _SA1111( 0x1004 ) | ||
332 | #define _PA_DWR _SA1111( 0x1004 ) | ||
333 | #define _PA_SDR _SA1111( 0x1008 ) | ||
334 | #define _PA_SSR _SA1111( 0x100c ) | ||
335 | #define _PB_DDR _SA1111( 0x1010 ) | ||
336 | #define _PB_DRR _SA1111( 0x1014 ) | ||
337 | #define _PB_DWR _SA1111( 0x1014 ) | ||
338 | #define _PB_SDR _SA1111( 0x1018 ) | ||
339 | #define _PB_SSR _SA1111( 0x101c ) | ||
340 | #define _PC_DDR _SA1111( 0x1020 ) | ||
341 | #define _PC_DRR _SA1111( 0x1024 ) | ||
342 | #define _PC_DWR _SA1111( 0x1024 ) | ||
343 | #define _PC_SDR _SA1111( 0x1028 ) | ||
344 | #define _PC_SSR _SA1111( 0x102c ) | ||
345 | |||
346 | #define SA1111_GPIO 0x1000 | 306 | #define SA1111_GPIO 0x1000 |
347 | 307 | ||
348 | #define SA1111_GPIO_PADDR (0x000) | 308 | #define SA1111_GPIO_PADDR (0x000) |
@@ -425,106 +385,30 @@ | |||
425 | #define SA1111_WAKEPOL0 0x0034 | 385 | #define SA1111_WAKEPOL0 0x0034 |
426 | #define SA1111_WAKEPOL1 0x0038 | 386 | #define SA1111_WAKEPOL1 0x0038 |
427 | 387 | ||
428 | /* | 388 | /* PS/2 Trackpad and Mouse Interfaces */ |
429 | * PS/2 Trackpad and Mouse Interfaces | ||
430 | * | ||
431 | * Registers | ||
432 | * PS2CR Control Register | ||
433 | * PS2STAT Status Register | ||
434 | * PS2DATA Transmit/Receive Data register | ||
435 | * PS2CLKDIV Clock Division Register | ||
436 | * PS2PRECNT Clock Precount Register | ||
437 | * PS2TEST1 Test register 1 | ||
438 | * PS2TEST2 Test register 2 | ||
439 | * PS2TEST3 Test register 3 | ||
440 | * PS2TEST4 Test register 4 | ||
441 | */ | ||
442 | |||
443 | #define SA1111_KBD 0x0a00 | 389 | #define SA1111_KBD 0x0a00 |
444 | #define SA1111_MSE 0x0c00 | 390 | #define SA1111_MSE 0x0c00 |
445 | 391 | ||
446 | /* | 392 | /* PCMCIA Interface */ |
447 | * These are offsets from the above bases. | 393 | #define SA1111_PCMCIA 0x1600 |
448 | */ | ||
449 | #define SA1111_PS2CR 0x0000 | ||
450 | #define SA1111_PS2STAT 0x0004 | ||
451 | #define SA1111_PS2DATA 0x0008 | ||
452 | #define SA1111_PS2CLKDIV 0x000c | ||
453 | #define SA1111_PS2PRECNT 0x0010 | ||
454 | |||
455 | #define PS2CR_ENA 0x08 | ||
456 | #define PS2CR_FKD 0x02 | ||
457 | #define PS2CR_FKC 0x01 | ||
458 | |||
459 | #define PS2STAT_STP 0x0100 | ||
460 | #define PS2STAT_TXE 0x0080 | ||
461 | #define PS2STAT_TXB 0x0040 | ||
462 | #define PS2STAT_RXF 0x0020 | ||
463 | #define PS2STAT_RXB 0x0010 | ||
464 | #define PS2STAT_ENA 0x0008 | ||
465 | #define PS2STAT_RXP 0x0004 | ||
466 | #define PS2STAT_KBD 0x0002 | ||
467 | #define PS2STAT_KBC 0x0001 | ||
468 | 394 | ||
469 | /* | ||
470 | * PCMCIA Interface | ||
471 | * | ||
472 | * Registers | ||
473 | * PCSR Status Register | ||
474 | * PCCR Control Register | ||
475 | * PCSSR Sleep State Register | ||
476 | */ | ||
477 | |||
478 | #define SA1111_PCMCIA 0x1600 | ||
479 | |||
480 | /* | ||
481 | * These are offsets from the above base. | ||
482 | */ | ||
483 | #define SA1111_PCCR 0x0000 | ||
484 | #define SA1111_PCSSR 0x0004 | ||
485 | #define SA1111_PCSR 0x0008 | ||
486 | |||
487 | #define PCSR_S0_READY (1<<0) | ||
488 | #define PCSR_S1_READY (1<<1) | ||
489 | #define PCSR_S0_DETECT (1<<2) | ||
490 | #define PCSR_S1_DETECT (1<<3) | ||
491 | #define PCSR_S0_VS1 (1<<4) | ||
492 | #define PCSR_S0_VS2 (1<<5) | ||
493 | #define PCSR_S1_VS1 (1<<6) | ||
494 | #define PCSR_S1_VS2 (1<<7) | ||
495 | #define PCSR_S0_WP (1<<8) | ||
496 | #define PCSR_S1_WP (1<<9) | ||
497 | #define PCSR_S0_BVD1 (1<<10) | ||
498 | #define PCSR_S0_BVD2 (1<<11) | ||
499 | #define PCSR_S1_BVD1 (1<<12) | ||
500 | #define PCSR_S1_BVD2 (1<<13) | ||
501 | |||
502 | #define PCCR_S0_RST (1<<0) | ||
503 | #define PCCR_S1_RST (1<<1) | ||
504 | #define PCCR_S0_FLT (1<<2) | ||
505 | #define PCCR_S1_FLT (1<<3) | ||
506 | #define PCCR_S0_PWAITEN (1<<4) | ||
507 | #define PCCR_S1_PWAITEN (1<<5) | ||
508 | #define PCCR_S0_PSE (1<<6) | ||
509 | #define PCCR_S1_PSE (1<<7) | ||
510 | |||
511 | #define PCSSR_S0_SLEEP (1<<0) | ||
512 | #define PCSSR_S1_SLEEP (1<<1) | ||
513 | 395 | ||
514 | 396 | ||
515 | 397 | ||
516 | 398 | ||
517 | extern struct bus_type sa1111_bus_type; | 399 | extern struct bus_type sa1111_bus_type; |
518 | 400 | ||
519 | #define SA1111_DEVID_SBI 0 | 401 | #define SA1111_DEVID_SBI (1 << 0) |
520 | #define SA1111_DEVID_SK 1 | 402 | #define SA1111_DEVID_SK (1 << 1) |
521 | #define SA1111_DEVID_USB 2 | 403 | #define SA1111_DEVID_USB (1 << 2) |
522 | #define SA1111_DEVID_SAC 3 | 404 | #define SA1111_DEVID_SAC (1 << 3) |
523 | #define SA1111_DEVID_SSP 4 | 405 | #define SA1111_DEVID_SSP (1 << 4) |
524 | #define SA1111_DEVID_PS2 5 | 406 | #define SA1111_DEVID_PS2 (3 << 5) |
525 | #define SA1111_DEVID_GPIO 6 | 407 | #define SA1111_DEVID_PS2_KBD (1 << 5) |
526 | #define SA1111_DEVID_INT 7 | 408 | #define SA1111_DEVID_PS2_MSE (1 << 6) |
527 | #define SA1111_DEVID_PCMCIA 8 | 409 | #define SA1111_DEVID_GPIO (1 << 7) |
410 | #define SA1111_DEVID_INT (1 << 8) | ||
411 | #define SA1111_DEVID_PCMCIA (1 << 9) | ||
528 | 412 | ||
529 | struct sa1111_dev { | 413 | struct sa1111_dev { |
530 | struct device dev; | 414 | struct device dev; |
@@ -548,6 +432,7 @@ struct sa1111_driver { | |||
548 | int (*remove)(struct sa1111_dev *); | 432 | int (*remove)(struct sa1111_dev *); |
549 | int (*suspend)(struct sa1111_dev *, pm_message_t); | 433 | int (*suspend)(struct sa1111_dev *, pm_message_t); |
550 | int (*resume)(struct sa1111_dev *); | 434 | int (*resume)(struct sa1111_dev *); |
435 | void (*shutdown)(struct sa1111_dev *); | ||
551 | }; | 436 | }; |
552 | 437 | ||
553 | #define SA1111_DRV(_d) container_of((_d), struct sa1111_driver, drv) | 438 | #define SA1111_DRV(_d) container_of((_d), struct sa1111_driver, drv) |
@@ -555,9 +440,10 @@ struct sa1111_driver { | |||
555 | #define SA1111_DRIVER_NAME(_sadev) ((_sadev)->dev.driver->name) | 440 | #define SA1111_DRIVER_NAME(_sadev) ((_sadev)->dev.driver->name) |
556 | 441 | ||
557 | /* | 442 | /* |
558 | * These frob the SKPCR register. | 443 | * These frob the SKPCR register, and call platform specific |
444 | * enable/disable functions. | ||
559 | */ | 445 | */ |
560 | void sa1111_enable_device(struct sa1111_dev *); | 446 | int sa1111_enable_device(struct sa1111_dev *); |
561 | void sa1111_disable_device(struct sa1111_dev *); | 447 | void sa1111_disable_device(struct sa1111_dev *); |
562 | 448 | ||
563 | unsigned int sa1111_pll_clock(struct sa1111_dev *); | 449 | unsigned int sa1111_pll_clock(struct sa1111_dev *); |
@@ -580,6 +466,10 @@ void sa1111_set_sleep_io(struct sa1111_dev *sadev, unsigned int bits, unsigned i | |||
580 | 466 | ||
581 | struct sa1111_platform_data { | 467 | struct sa1111_platform_data { |
582 | int irq_base; /* base for cascaded on-chip IRQs */ | 468 | int irq_base; /* base for cascaded on-chip IRQs */ |
469 | unsigned disable_devs; | ||
470 | void *data; | ||
471 | int (*enable)(void *, unsigned); | ||
472 | void (*disable)(void *, unsigned); | ||
583 | }; | 473 | }; |
584 | 474 | ||
585 | #endif /* _ASM_ARCH_SA1111 */ | 475 | #endif /* _ASM_ARCH_SA1111 */ |
diff --git a/arch/arm/kernel/Makefile b/arch/arm/kernel/Makefile index f16d7652f34b..3a274878412e 100644 --- a/arch/arm/kernel/Makefile +++ b/arch/arm/kernel/Makefile | |||
@@ -23,7 +23,6 @@ obj-$(CONFIG_LEDS) += leds.o | |||
23 | obj-$(CONFIG_OC_ETM) += etm.o | 23 | obj-$(CONFIG_OC_ETM) += etm.o |
24 | 24 | ||
25 | obj-$(CONFIG_ISA_DMA_API) += dma.o | 25 | obj-$(CONFIG_ISA_DMA_API) += dma.o |
26 | obj-$(CONFIG_ARCH_ACORN) += ecard.o | ||
27 | obj-$(CONFIG_FIQ) += fiq.o fiqasm.o | 26 | obj-$(CONFIG_FIQ) += fiq.o fiqasm.o |
28 | obj-$(CONFIG_MODULES) += armksyms.o module.o | 27 | obj-$(CONFIG_MODULES) += armksyms.o module.o |
29 | obj-$(CONFIG_ARTHUR) += arthur.o | 28 | obj-$(CONFIG_ARTHUR) += arthur.o |
diff --git a/arch/arm/mach-ebsa110/core.c b/arch/arm/mach-ebsa110/core.c index 804c9122b7b3..e400d75d11ae 100644 --- a/arch/arm/mach-ebsa110/core.c +++ b/arch/arm/mach-ebsa110/core.c | |||
@@ -30,10 +30,7 @@ | |||
30 | 30 | ||
31 | #include <asm/mach/time.h> | 31 | #include <asm/mach/time.h> |
32 | 32 | ||
33 | #define IRQ_MASK 0xfe000000 /* read */ | 33 | #include "core.h" |
34 | #define IRQ_MSET 0xfe000000 /* write */ | ||
35 | #define IRQ_STAT 0xff000000 /* read */ | ||
36 | #define IRQ_MCLR 0xff000000 /* write */ | ||
37 | 34 | ||
38 | static void ebsa110_mask_irq(struct irq_data *d) | 35 | static void ebsa110_mask_irq(struct irq_data *d) |
39 | { | 36 | { |
@@ -79,22 +76,22 @@ static struct map_desc ebsa110_io_desc[] __initdata = { | |||
79 | { /* IRQ_STAT/IRQ_MCLR */ | 76 | { /* IRQ_STAT/IRQ_MCLR */ |
80 | .virtual = IRQ_STAT, | 77 | .virtual = IRQ_STAT, |
81 | .pfn = __phys_to_pfn(TRICK4_PHYS), | 78 | .pfn = __phys_to_pfn(TRICK4_PHYS), |
82 | .length = PGDIR_SIZE, | 79 | .length = TRICK4_SIZE, |
83 | .type = MT_DEVICE | 80 | .type = MT_DEVICE |
84 | }, { /* IRQ_MASK/IRQ_MSET */ | 81 | }, { /* IRQ_MASK/IRQ_MSET */ |
85 | .virtual = IRQ_MASK, | 82 | .virtual = IRQ_MASK, |
86 | .pfn = __phys_to_pfn(TRICK3_PHYS), | 83 | .pfn = __phys_to_pfn(TRICK3_PHYS), |
87 | .length = PGDIR_SIZE, | 84 | .length = TRICK3_SIZE, |
88 | .type = MT_DEVICE | 85 | .type = MT_DEVICE |
89 | }, { /* SOFT_BASE */ | 86 | }, { /* SOFT_BASE */ |
90 | .virtual = SOFT_BASE, | 87 | .virtual = SOFT_BASE, |
91 | .pfn = __phys_to_pfn(TRICK1_PHYS), | 88 | .pfn = __phys_to_pfn(TRICK1_PHYS), |
92 | .length = PGDIR_SIZE, | 89 | .length = TRICK1_SIZE, |
93 | .type = MT_DEVICE | 90 | .type = MT_DEVICE |
94 | }, { /* PIT_BASE */ | 91 | }, { /* PIT_BASE */ |
95 | .virtual = PIT_BASE, | 92 | .virtual = PIT_BASE, |
96 | .pfn = __phys_to_pfn(TRICK0_PHYS), | 93 | .pfn = __phys_to_pfn(TRICK0_PHYS), |
97 | .length = PGDIR_SIZE, | 94 | .length = TRICK0_SIZE, |
98 | .type = MT_DEVICE | 95 | .type = MT_DEVICE |
99 | }, | 96 | }, |
100 | 97 | ||
diff --git a/arch/arm/mach-ebsa110/core.h b/arch/arm/mach-ebsa110/core.h new file mode 100644 index 000000000000..c93c9e43012d --- /dev/null +++ b/arch/arm/mach-ebsa110/core.h | |||
@@ -0,0 +1,41 @@ | |||
1 | /* | ||
2 | * Copyright (C) 1996-2000 Russell King. | ||
3 | * | ||
4 | * This program is free software; you can redistribute it and/or modify | ||
5 | * it under the terms of the GNU General Public License version 2 as | ||
6 | * published by the Free Software Foundation. | ||
7 | * | ||
8 | * This file contains the core hardware definitions of the EBSA-110. | ||
9 | */ | ||
10 | #ifndef CORE_H | ||
11 | #define CORE_H | ||
12 | |||
13 | /* Physical addresses/sizes */ | ||
14 | #define ISAMEM_PHYS 0xe0000000 | ||
15 | #define ISAMEM_SIZE 0x10000000 | ||
16 | |||
17 | #define ISAIO_PHYS 0xf0000000 | ||
18 | #define ISAIO_SIZE PGDIR_SIZE | ||
19 | |||
20 | #define TRICK0_PHYS 0xf2000000 | ||
21 | #define TRICK0_SIZE PGDIR_SIZE | ||
22 | #define TRICK1_PHYS 0xf2400000 | ||
23 | #define TRICK1_SIZE PGDIR_SIZE | ||
24 | #define TRICK2_PHYS 0xf2800000 | ||
25 | #define TRICK3_PHYS 0xf2c00000 | ||
26 | #define TRICK3_SIZE PGDIR_SIZE | ||
27 | #define TRICK4_PHYS 0xf3000000 | ||
28 | #define TRICK4_SIZE PGDIR_SIZE | ||
29 | #define TRICK5_PHYS 0xf3400000 | ||
30 | #define TRICK6_PHYS 0xf3800000 | ||
31 | #define TRICK7_PHYS 0xf3c00000 | ||
32 | |||
33 | /* Virtual addresses */ | ||
34 | #define PIT_BASE 0xfc000000 /* trick 0 */ | ||
35 | #define SOFT_BASE 0xfd000000 /* trick 1 */ | ||
36 | #define IRQ_MASK 0xfe000000 /* trick 3 - read */ | ||
37 | #define IRQ_MSET 0xfe000000 /* trick 3 - write */ | ||
38 | #define IRQ_STAT 0xff000000 /* trick 4 - read */ | ||
39 | #define IRQ_MCLR 0xff000000 /* trick 4 - write */ | ||
40 | |||
41 | #endif | ||
diff --git a/arch/arm/mach-ebsa110/include/mach/hardware.h b/arch/arm/mach-ebsa110/include/mach/hardware.h index 4b2fb7743909..f4e5407bd004 100644 --- a/arch/arm/mach-ebsa110/include/mach/hardware.h +++ b/arch/arm/mach-ebsa110/include/mach/hardware.h | |||
@@ -12,48 +12,9 @@ | |||
12 | #ifndef __ASM_ARCH_HARDWARE_H | 12 | #ifndef __ASM_ARCH_HARDWARE_H |
13 | #define __ASM_ARCH_HARDWARE_H | 13 | #define __ASM_ARCH_HARDWARE_H |
14 | 14 | ||
15 | /* | ||
16 | * The EBSA110 has a weird "ISA IO" region: | ||
17 | * | ||
18 | * Region 0 (addr = 0xf0000000 + io << 2) | ||
19 | * -------------------------------------------------------- | ||
20 | * Physical region IO region | ||
21 | * f0000fe0 - f0000ffc 3f8 - 3ff ttyS0 | ||
22 | * f0000e60 - f0000e64 398 - 399 | ||
23 | * f0000de0 - f0000dfc 378 - 37f lp0 | ||
24 | * f0000be0 - f0000bfc 2f8 - 2ff ttyS1 | ||
25 | * | ||
26 | * Region 1 (addr = 0xf0000000 + (io & ~1) << 1 + (io & 1)) | ||
27 | * -------------------------------------------------------- | ||
28 | * Physical region IO region | ||
29 | * f00014f1 a79 pnp write data | ||
30 | * f00007c0 - f00007c1 3e0 - 3e1 pcmcia | ||
31 | * f00004f1 279 pnp address | ||
32 | * f0000440 - f000046c 220 - 236 eth0 | ||
33 | * f0000405 203 pnp read data | ||
34 | */ | ||
35 | |||
36 | #define ISAMEM_PHYS 0xe0000000 | ||
37 | #define ISAMEM_SIZE 0x10000000 | ||
38 | |||
39 | #define ISAIO_PHYS 0xf0000000 | ||
40 | #define ISAIO_SIZE PGDIR_SIZE | ||
41 | |||
42 | #define TRICK0_PHYS 0xf2000000 | ||
43 | #define TRICK1_PHYS 0xf2400000 | ||
44 | #define TRICK2_PHYS 0xf2800000 | ||
45 | #define TRICK3_PHYS 0xf2c00000 | ||
46 | #define TRICK4_PHYS 0xf3000000 | ||
47 | #define TRICK5_PHYS 0xf3400000 | ||
48 | #define TRICK6_PHYS 0xf3800000 | ||
49 | #define TRICK7_PHYS 0xf3c00000 | ||
50 | |||
51 | #define ISAMEM_BASE 0xe0000000 | 15 | #define ISAMEM_BASE 0xe0000000 |
52 | #define ISAIO_BASE 0xf0000000 | 16 | #define ISAIO_BASE 0xf0000000 |
53 | 17 | ||
54 | #define PIT_BASE 0xfc000000 | ||
55 | #define SOFT_BASE 0xfd000000 | ||
56 | |||
57 | /* | 18 | /* |
58 | * RAM definitions | 19 | * RAM definitions |
59 | */ | 20 | */ |
diff --git a/arch/arm/mach-ebsa110/io.c b/arch/arm/mach-ebsa110/io.c index c52e3047a7eb..756cc377a73d 100644 --- a/arch/arm/mach-ebsa110/io.c +++ b/arch/arm/mach-ebsa110/io.c | |||
@@ -177,6 +177,26 @@ void writesl(void __iomem *addr, const void *data, int len) | |||
177 | } | 177 | } |
178 | EXPORT_SYMBOL(writesl); | 178 | EXPORT_SYMBOL(writesl); |
179 | 179 | ||
180 | /* | ||
181 | * The EBSA110 has a weird "ISA IO" region: | ||
182 | * | ||
183 | * Region 0 (addr = 0xf0000000 + io << 2) | ||
184 | * -------------------------------------------------------- | ||
185 | * Physical region IO region | ||
186 | * f0000fe0 - f0000ffc 3f8 - 3ff ttyS0 | ||
187 | * f0000e60 - f0000e64 398 - 399 | ||
188 | * f0000de0 - f0000dfc 378 - 37f lp0 | ||
189 | * f0000be0 - f0000bfc 2f8 - 2ff ttyS1 | ||
190 | * | ||
191 | * Region 1 (addr = 0xf0000000 + (io & ~1) << 1 + (io & 1)) | ||
192 | * -------------------------------------------------------- | ||
193 | * Physical region IO region | ||
194 | * f00014f1 a79 pnp write data | ||
195 | * f00007c0 - f00007c1 3e0 - 3e1 pcmcia | ||
196 | * f00004f1 279 pnp address | ||
197 | * f0000440 - f000046c 220 - 236 eth0 | ||
198 | * f0000405 203 pnp read data | ||
199 | */ | ||
180 | #define SUPERIO_PORT(p) \ | 200 | #define SUPERIO_PORT(p) \ |
181 | (((p) >> 3) == (0x3f8 >> 3) || \ | 201 | (((p) >> 3) == (0x3f8 >> 3) || \ |
182 | ((p) >> 3) == (0x2f8 >> 3) || \ | 202 | ((p) >> 3) == (0x2f8 >> 3) || \ |
diff --git a/arch/arm/mach-ebsa110/leds.c b/arch/arm/mach-ebsa110/leds.c index 6a6ea57c2a4e..d43121a30aa7 100644 --- a/arch/arm/mach-ebsa110/leds.c +++ b/arch/arm/mach-ebsa110/leds.c | |||
@@ -20,6 +20,8 @@ | |||
20 | #include <asm/system.h> | 20 | #include <asm/system.h> |
21 | #include <asm/mach-types.h> | 21 | #include <asm/mach-types.h> |
22 | 22 | ||
23 | #include "core.h" | ||
24 | |||
23 | static spinlock_t leds_lock; | 25 | static spinlock_t leds_lock; |
24 | 26 | ||
25 | static void ebsa110_leds_event(led_event_t ledevt) | 27 | static void ebsa110_leds_event(led_event_t ledevt) |
diff --git a/arch/arm/mach-pxa/lubbock.c b/arch/arm/mach-pxa/lubbock.c index 6ebd276aebeb..6bb3f47b1f14 100644 --- a/arch/arm/mach-pxa/lubbock.c +++ b/arch/arm/mach-pxa/lubbock.c | |||
@@ -223,6 +223,7 @@ static struct resource sa1111_resources[] = { | |||
223 | 223 | ||
224 | static struct sa1111_platform_data sa1111_info = { | 224 | static struct sa1111_platform_data sa1111_info = { |
225 | .irq_base = LUBBOCK_SA1111_IRQ_BASE, | 225 | .irq_base = LUBBOCK_SA1111_IRQ_BASE, |
226 | .disable_devs = SA1111_DEVID_SAC, | ||
226 | }; | 227 | }; |
227 | 228 | ||
228 | static struct platform_device sa1111_device = { | 229 | static struct platform_device sa1111_device = { |
diff --git a/arch/arm/mach-rpc/Makefile b/arch/arm/mach-rpc/Makefile index dfa405c0cfde..992e28b4ae9a 100644 --- a/arch/arm/mach-rpc/Makefile +++ b/arch/arm/mach-rpc/Makefile | |||
@@ -4,7 +4,7 @@ | |||
4 | 4 | ||
5 | # Object file lists. | 5 | # Object file lists. |
6 | 6 | ||
7 | obj-y := dma.o fiq.o irq.o riscpc.o | 7 | obj-y := dma.o ecard.o fiq.o irq.o riscpc.o time.o |
8 | obj-m := | 8 | obj-m := |
9 | obj-n := | 9 | obj-n := |
10 | obj- := | 10 | obj- := |
diff --git a/arch/arm/kernel/ecard.c b/arch/arm/mach-rpc/ecard.c index 1651d4950744..b91bc87b3dcf 100644 --- a/arch/arm/kernel/ecard.c +++ b/arch/arm/mach-rpc/ecard.c | |||
@@ -42,6 +42,7 @@ | |||
42 | #include <linux/init.h> | 42 | #include <linux/init.h> |
43 | #include <linux/mutex.h> | 43 | #include <linux/mutex.h> |
44 | #include <linux/kthread.h> | 44 | #include <linux/kthread.h> |
45 | #include <linux/irq.h> | ||
45 | #include <linux/io.h> | 46 | #include <linux/io.h> |
46 | 47 | ||
47 | #include <asm/dma.h> | 48 | #include <asm/dma.h> |
@@ -54,10 +55,6 @@ | |||
54 | 55 | ||
55 | #include "ecard.h" | 56 | #include "ecard.h" |
56 | 57 | ||
57 | #ifndef CONFIG_ARCH_RPC | ||
58 | #define HAVE_EXPMASK | ||
59 | #endif | ||
60 | |||
61 | struct ecard_request { | 58 | struct ecard_request { |
62 | void (*fn)(struct ecard_request *); | 59 | void (*fn)(struct ecard_request *); |
63 | ecard_t *ec; | 60 | ecard_t *ec; |
@@ -77,9 +74,6 @@ struct expcard_blacklist { | |||
77 | static ecard_t *cards; | 74 | static ecard_t *cards; |
78 | static ecard_t *slot_to_expcard[MAX_ECARDS]; | 75 | static ecard_t *slot_to_expcard[MAX_ECARDS]; |
79 | static unsigned int ectcr; | 76 | static unsigned int ectcr; |
80 | #ifdef HAS_EXPMASK | ||
81 | static unsigned int have_expmask; | ||
82 | #endif | ||
83 | 77 | ||
84 | /* List of descriptions of cards which don't have an extended | 78 | /* List of descriptions of cards which don't have an extended |
85 | * identification, or chunk directories containing a description. | 79 | * identification, or chunk directories containing a description. |
@@ -391,22 +385,10 @@ int ecard_readchunk(struct in_chunk_dir *cd, ecard_t *ec, int id, int num) | |||
391 | 385 | ||
392 | static void ecard_def_irq_enable(ecard_t *ec, int irqnr) | 386 | static void ecard_def_irq_enable(ecard_t *ec, int irqnr) |
393 | { | 387 | { |
394 | #ifdef HAS_EXPMASK | ||
395 | if (irqnr < 4 && have_expmask) { | ||
396 | have_expmask |= 1 << irqnr; | ||
397 | __raw_writeb(have_expmask, EXPMASK_ENABLE); | ||
398 | } | ||
399 | #endif | ||
400 | } | 388 | } |
401 | 389 | ||
402 | static void ecard_def_irq_disable(ecard_t *ec, int irqnr) | 390 | static void ecard_def_irq_disable(ecard_t *ec, int irqnr) |
403 | { | 391 | { |
404 | #ifdef HAS_EXPMASK | ||
405 | if (irqnr < 4 && have_expmask) { | ||
406 | have_expmask &= ~(1 << irqnr); | ||
407 | __raw_writeb(have_expmask, EXPMASK_ENABLE); | ||
408 | } | ||
409 | #endif | ||
410 | } | 392 | } |
411 | 393 | ||
412 | static int ecard_def_irq_pending(ecard_t *ec) | 394 | static int ecard_def_irq_pending(ecard_t *ec) |
@@ -446,7 +428,7 @@ static expansioncard_ops_t ecard_default_ops = { | |||
446 | */ | 428 | */ |
447 | static void ecard_irq_unmask(struct irq_data *d) | 429 | static void ecard_irq_unmask(struct irq_data *d) |
448 | { | 430 | { |
449 | ecard_t *ec = slot_to_ecard(d->irq - 32); | 431 | ecard_t *ec = irq_data_get_irq_chip_data(d); |
450 | 432 | ||
451 | if (ec) { | 433 | if (ec) { |
452 | if (!ec->ops) | 434 | if (!ec->ops) |
@@ -462,7 +444,7 @@ static void ecard_irq_unmask(struct irq_data *d) | |||
462 | 444 | ||
463 | static void ecard_irq_mask(struct irq_data *d) | 445 | static void ecard_irq_mask(struct irq_data *d) |
464 | { | 446 | { |
465 | ecard_t *ec = slot_to_ecard(d->irq - 32); | 447 | ecard_t *ec = irq_data_get_irq_chip_data(d); |
466 | 448 | ||
467 | if (ec) { | 449 | if (ec) { |
468 | if (!ec->ops) | 450 | if (!ec->ops) |
@@ -579,7 +561,7 @@ ecard_irq_handler(unsigned int irq, struct irq_desc *desc) | |||
579 | for (ec = cards; ec; ec = ec->next) { | 561 | for (ec = cards; ec; ec = ec->next) { |
580 | int pending; | 562 | int pending; |
581 | 563 | ||
582 | if (!ec->claimed || ec->irq == NO_IRQ || ec->slot_no == 8) | 564 | if (!ec->claimed || !ec->irq || ec->slot_no == 8) |
583 | continue; | 565 | continue; |
584 | 566 | ||
585 | if (ec->ops && ec->ops->irqpending) | 567 | if (ec->ops && ec->ops->irqpending) |
@@ -598,83 +580,6 @@ ecard_irq_handler(unsigned int irq, struct irq_desc *desc) | |||
598 | ecard_check_lockup(desc); | 580 | ecard_check_lockup(desc); |
599 | } | 581 | } |
600 | 582 | ||
601 | #ifdef HAS_EXPMASK | ||
602 | static unsigned char priority_masks[] = | ||
603 | { | ||
604 | 0xf0, 0xf1, 0xf3, 0xf7, 0xff, 0xff, 0xff, 0xff | ||
605 | }; | ||
606 | |||
607 | static unsigned char first_set[] = | ||
608 | { | ||
609 | 0x00, 0x00, 0x01, 0x00, 0x02, 0x00, 0x01, 0x00, | ||
610 | 0x03, 0x00, 0x01, 0x00, 0x02, 0x00, 0x01, 0x00 | ||
611 | }; | ||
612 | |||
613 | static void | ||
614 | ecard_irqexp_handler(unsigned int irq, struct irq_desc *desc) | ||
615 | { | ||
616 | const unsigned int statusmask = 15; | ||
617 | unsigned int status; | ||
618 | |||
619 | status = __raw_readb(EXPMASK_STATUS) & statusmask; | ||
620 | if (status) { | ||
621 | unsigned int slot = first_set[status]; | ||
622 | ecard_t *ec = slot_to_ecard(slot); | ||
623 | |||
624 | if (ec->claimed) { | ||
625 | /* | ||
626 | * this ugly code is so that we can operate a | ||
627 | * prioritorising system: | ||
628 | * | ||
629 | * Card 0 highest priority | ||
630 | * Card 1 | ||
631 | * Card 2 | ||
632 | * Card 3 lowest priority | ||
633 | * | ||
634 | * Serial cards should go in 0/1, ethernet/scsi in 2/3 | ||
635 | * otherwise you will lose serial data at high speeds! | ||
636 | */ | ||
637 | generic_handle_irq(ec->irq); | ||
638 | } else { | ||
639 | printk(KERN_WARNING "card%d: interrupt from unclaimed " | ||
640 | "card???\n", slot); | ||
641 | have_expmask &= ~(1 << slot); | ||
642 | __raw_writeb(have_expmask, EXPMASK_ENABLE); | ||
643 | } | ||
644 | } else | ||
645 | printk(KERN_WARNING "Wild interrupt from backplane (masks)\n"); | ||
646 | } | ||
647 | |||
648 | static int __init ecard_probeirqhw(void) | ||
649 | { | ||
650 | ecard_t *ec; | ||
651 | int found; | ||
652 | |||
653 | __raw_writeb(0x00, EXPMASK_ENABLE); | ||
654 | __raw_writeb(0xff, EXPMASK_STATUS); | ||
655 | found = (__raw_readb(EXPMASK_STATUS) & 15) == 0; | ||
656 | __raw_writeb(0xff, EXPMASK_ENABLE); | ||
657 | |||
658 | if (found) { | ||
659 | printk(KERN_DEBUG "Expansion card interrupt " | ||
660 | "management hardware found\n"); | ||
661 | |||
662 | /* for each card present, set a bit to '1' */ | ||
663 | have_expmask = 0x80000000; | ||
664 | |||
665 | for (ec = cards; ec; ec = ec->next) | ||
666 | have_expmask |= 1 << ec->slot_no; | ||
667 | |||
668 | __raw_writeb(have_expmask, EXPMASK_ENABLE); | ||
669 | } | ||
670 | |||
671 | return found; | ||
672 | } | ||
673 | #else | ||
674 | #define ecard_irqexp_handler NULL | ||
675 | #define ecard_probeirqhw() (0) | ||
676 | #endif | ||
677 | |||
678 | static void __iomem *__ecard_address(ecard_t *ec, card_type_t type, card_speed_t speed) | 583 | static void __iomem *__ecard_address(ecard_t *ec, card_type_t type, card_speed_t speed) |
679 | { | 584 | { |
680 | void __iomem *address = NULL; | 585 | void __iomem *address = NULL; |
@@ -806,8 +711,8 @@ static struct expansion_card *__init ecard_alloc_card(int type, int slot) | |||
806 | 711 | ||
807 | ec->slot_no = slot; | 712 | ec->slot_no = slot; |
808 | ec->easi = type == ECARD_EASI; | 713 | ec->easi = type == ECARD_EASI; |
809 | ec->irq = NO_IRQ; | 714 | ec->irq = 0; |
810 | ec->fiq = NO_IRQ; | 715 | ec->fiq = 0; |
811 | ec->dma = NO_DMA; | 716 | ec->dma = NO_DMA; |
812 | ec->ops = &ecard_default_ops; | 717 | ec->ops = &ecard_default_ops; |
813 | 718 | ||
@@ -978,8 +883,7 @@ EXPORT_SYMBOL(ecardm_iomap); | |||
978 | * If bit 1 of the first byte of the card is set, then the | 883 | * If bit 1 of the first byte of the card is set, then the |
979 | * card does not exist. | 884 | * card does not exist. |
980 | */ | 885 | */ |
981 | static int __init | 886 | static int __init ecard_probe(int slot, unsigned irq, card_type_t type) |
982 | ecard_probe(int slot, card_type_t type) | ||
983 | { | 887 | { |
984 | ecard_t **ecp; | 888 | ecard_t **ecp; |
985 | ecard_t *ec; | 889 | ecard_t *ec; |
@@ -1033,18 +937,18 @@ ecard_probe(int slot, card_type_t type) | |||
1033 | break; | 937 | break; |
1034 | } | 938 | } |
1035 | 939 | ||
940 | ec->irq = irq; | ||
941 | |||
1036 | /* | 942 | /* |
1037 | * hook the interrupt handlers | 943 | * hook the interrupt handlers |
1038 | */ | 944 | */ |
1039 | if (slot < 8) { | 945 | if (slot < 8) { |
1040 | ec->irq = 32 + slot; | ||
1041 | irq_set_chip_and_handler(ec->irq, &ecard_chip, | 946 | irq_set_chip_and_handler(ec->irq, &ecard_chip, |
1042 | handle_level_irq); | 947 | handle_level_irq); |
948 | irq_set_chip_data(ec->irq, ec); | ||
1043 | set_irq_flags(ec->irq, IRQF_VALID); | 949 | set_irq_flags(ec->irq, IRQF_VALID); |
1044 | } | 950 | } |
1045 | 951 | ||
1046 | if (slot == 8) | ||
1047 | ec->irq = 11; | ||
1048 | #ifdef CONFIG_ARCH_RPC | 952 | #ifdef CONFIG_ARCH_RPC |
1049 | /* On RiscPC, only first two slots have DMA capability */ | 953 | /* On RiscPC, only first two slots have DMA capability */ |
1050 | if (slot < 2) | 954 | if (slot < 2) |
@@ -1074,28 +978,30 @@ ecard_probe(int slot, card_type_t type) | |||
1074 | static int __init ecard_init(void) | 978 | static int __init ecard_init(void) |
1075 | { | 979 | { |
1076 | struct task_struct *task; | 980 | struct task_struct *task; |
1077 | int slot, irqhw; | 981 | int slot, irqbase; |
982 | |||
983 | irqbase = irq_alloc_descs(-1, 0, 8, -1); | ||
984 | if (irqbase < 0) | ||
985 | return irqbase; | ||
1078 | 986 | ||
1079 | task = kthread_run(ecard_task, NULL, "kecardd"); | 987 | task = kthread_run(ecard_task, NULL, "kecardd"); |
1080 | if (IS_ERR(task)) { | 988 | if (IS_ERR(task)) { |
1081 | printk(KERN_ERR "Ecard: unable to create kernel thread: %ld\n", | 989 | printk(KERN_ERR "Ecard: unable to create kernel thread: %ld\n", |
1082 | PTR_ERR(task)); | 990 | PTR_ERR(task)); |
991 | irq_free_descs(irqbase, 8); | ||
1083 | return PTR_ERR(task); | 992 | return PTR_ERR(task); |
1084 | } | 993 | } |
1085 | 994 | ||
1086 | printk("Probing expansion cards\n"); | 995 | printk("Probing expansion cards\n"); |
1087 | 996 | ||
1088 | for (slot = 0; slot < 8; slot ++) { | 997 | for (slot = 0; slot < 8; slot ++) { |
1089 | if (ecard_probe(slot, ECARD_EASI) == -ENODEV) | 998 | if (ecard_probe(slot, irqbase + slot, ECARD_EASI) == -ENODEV) |
1090 | ecard_probe(slot, ECARD_IOC); | 999 | ecard_probe(slot, irqbase + slot, ECARD_IOC); |
1091 | } | 1000 | } |
1092 | 1001 | ||
1093 | ecard_probe(8, ECARD_IOC); | 1002 | ecard_probe(8, 11, ECARD_IOC); |
1094 | |||
1095 | irqhw = ecard_probeirqhw(); | ||
1096 | 1003 | ||
1097 | irq_set_chained_handler(IRQ_EXPANSIONCARD, | 1004 | irq_set_chained_handler(IRQ_EXPANSIONCARD, ecard_irq_handler); |
1098 | irqhw ? ecard_irqexp_handler : ecard_irq_handler); | ||
1099 | 1005 | ||
1100 | ecard_proc_init(); | 1006 | ecard_proc_init(); |
1101 | 1007 | ||
diff --git a/arch/arm/kernel/ecard.h b/arch/arm/mach-rpc/ecard.h index 4642d436be2a..4642d436be2a 100644 --- a/arch/arm/kernel/ecard.h +++ b/arch/arm/mach-rpc/ecard.h | |||
diff --git a/arch/arm/mach-rpc/include/mach/irqs.h b/arch/arm/mach-rpc/include/mach/irqs.h index 3d2037496e38..6868e178274d 100644 --- a/arch/arm/mach-rpc/include/mach/irqs.h +++ b/arch/arm/mach-rpc/include/mach/irqs.h | |||
@@ -42,6 +42,4 @@ | |||
42 | */ | 42 | */ |
43 | #define FIQ_START 64 | 43 | #define FIQ_START 64 |
44 | 44 | ||
45 | #define IRQ_TIMER IRQ_TIMER0 | ||
46 | |||
47 | #define NR_IRQS 128 | 45 | #define NR_IRQS 128 |
diff --git a/arch/arm/mach-rpc/riscpc.c b/arch/arm/mach-rpc/riscpc.c index 3d44a59fc0df..731552d68adf 100644 --- a/arch/arm/mach-rpc/riscpc.c +++ b/arch/arm/mach-rpc/riscpc.c | |||
@@ -98,15 +98,9 @@ static void __init rpc_map_io(void) | |||
98 | } | 98 | } |
99 | 99 | ||
100 | static struct resource acornfb_resources[] = { | 100 | static struct resource acornfb_resources[] = { |
101 | { /* VIDC */ | 101 | /* VIDC */ |
102 | .start = 0x03400000, | 102 | DEFINE_RES_MEM(0x03400000, 0x00200000), |
103 | .end = 0x035fffff, | 103 | DEFINE_RES_IRQ(IRQ_VSYNCPULSE), |
104 | .flags = IORESOURCE_MEM, | ||
105 | }, { | ||
106 | .start = IRQ_VSYNCPULSE, | ||
107 | .end = IRQ_VSYNCPULSE, | ||
108 | .flags = IORESOURCE_IRQ, | ||
109 | }, | ||
110 | }; | 104 | }; |
111 | 105 | ||
112 | static struct platform_device acornfb_device = { | 106 | static struct platform_device acornfb_device = { |
@@ -120,11 +114,7 @@ static struct platform_device acornfb_device = { | |||
120 | }; | 114 | }; |
121 | 115 | ||
122 | static struct resource iomd_resources[] = { | 116 | static struct resource iomd_resources[] = { |
123 | { | 117 | DEFINE_RES_MEM(0x03200000, 0x10000), |
124 | .start = 0x03200000, | ||
125 | .end = 0x0320ffff, | ||
126 | .flags = IORESOURCE_MEM, | ||
127 | }, | ||
128 | }; | 118 | }; |
129 | 119 | ||
130 | static struct platform_device iomd_device = { | 120 | static struct platform_device iomd_device = { |
@@ -134,18 +124,25 @@ static struct platform_device iomd_device = { | |||
134 | .resource = iomd_resources, | 124 | .resource = iomd_resources, |
135 | }; | 125 | }; |
136 | 126 | ||
127 | static struct resource iomd_kart_resources[] = { | ||
128 | DEFINE_RES_IRQ(IRQ_KEYBOARDRX), | ||
129 | DEFINE_RES_IRQ(IRQ_KEYBOARDTX), | ||
130 | }; | ||
131 | |||
137 | static struct platform_device kbd_device = { | 132 | static struct platform_device kbd_device = { |
138 | .name = "kart", | 133 | .name = "kart", |
139 | .id = -1, | 134 | .id = -1, |
140 | .dev = { | 135 | .dev = { |
141 | .parent = &iomd_device.dev, | 136 | .parent = &iomd_device.dev, |
142 | }, | 137 | }, |
138 | .num_resources = ARRAY_SIZE(iomd_kart_resources), | ||
139 | .resource = iomd_kart_resources, | ||
143 | }; | 140 | }; |
144 | 141 | ||
145 | static struct plat_serial8250_port serial_platform_data[] = { | 142 | static struct plat_serial8250_port serial_platform_data[] = { |
146 | { | 143 | { |
147 | .mapbase = 0x03010fe0, | 144 | .mapbase = 0x03010fe0, |
148 | .irq = 10, | 145 | .irq = IRQ_SERIALPORT, |
149 | .uartclk = 1843200, | 146 | .uartclk = 1843200, |
150 | .regshift = 2, | 147 | .regshift = 2, |
151 | .iotype = UPIO_MEM, | 148 | .iotype = UPIO_MEM, |
@@ -167,21 +164,9 @@ static struct pata_platform_info pata_platform_data = { | |||
167 | }; | 164 | }; |
168 | 165 | ||
169 | static struct resource pata_resources[] = { | 166 | static struct resource pata_resources[] = { |
170 | [0] = { | 167 | DEFINE_RES_MEM(0x030107c0, 0x20), |
171 | .start = 0x030107c0, | 168 | DEFINE_RES_MEM(0x03010fd8, 0x04), |
172 | .end = 0x030107df, | 169 | DEFINE_RES_IRQ(IRQ_HARDDISK), |
173 | .flags = IORESOURCE_MEM, | ||
174 | }, | ||
175 | [1] = { | ||
176 | .start = 0x03010fd8, | ||
177 | .end = 0x03010fdb, | ||
178 | .flags = IORESOURCE_MEM, | ||
179 | }, | ||
180 | [2] = { | ||
181 | .start = IRQ_HARDDISK, | ||
182 | .end = IRQ_HARDDISK, | ||
183 | .flags = IORESOURCE_IRQ, | ||
184 | }, | ||
185 | }; | 170 | }; |
186 | 171 | ||
187 | static struct platform_device pata_device = { | 172 | static struct platform_device pata_device = { |
diff --git a/arch/arm/common/time-acorn.c b/arch/arm/mach-rpc/time.c index deeed561b168..581fca934bb3 100644 --- a/arch/arm/common/time-acorn.c +++ b/arch/arm/mach-rpc/time.c | |||
@@ -85,7 +85,7 @@ static struct irqaction ioc_timer_irq = { | |||
85 | static void __init ioc_timer_init(void) | 85 | static void __init ioc_timer_init(void) |
86 | { | 86 | { |
87 | ioctime_init(); | 87 | ioctime_init(); |
88 | setup_irq(IRQ_TIMER, &ioc_timer_irq); | 88 | setup_irq(IRQ_TIMER0, &ioc_timer_irq); |
89 | } | 89 | } |
90 | 90 | ||
91 | struct sys_timer ioc_timer = { | 91 | struct sys_timer ioc_timer = { |
diff --git a/arch/arm/mach-sa1100/Makefile b/arch/arm/mach-sa1100/Makefile index ed7408d3216c..60b97ec01676 100644 --- a/arch/arm/mach-sa1100/Makefile +++ b/arch/arm/mach-sa1100/Makefile | |||
@@ -3,7 +3,7 @@ | |||
3 | # | 3 | # |
4 | 4 | ||
5 | # Common support | 5 | # Common support |
6 | obj-y := clock.o generic.o irq.o dma.o time.o #nmi-oopser.o | 6 | obj-y := clock.o generic.o irq.o time.o #nmi-oopser.o |
7 | obj-m := | 7 | obj-m := |
8 | obj-n := | 8 | obj-n := |
9 | obj- := | 9 | obj- := |
diff --git a/arch/arm/mach-sa1100/assabet.c b/arch/arm/mach-sa1100/assabet.c index 0c4b76ab4d8e..375d3f779a88 100644 --- a/arch/arm/mach-sa1100/assabet.c +++ b/arch/arm/mach-sa1100/assabet.c | |||
@@ -15,14 +15,16 @@ | |||
15 | #include <linux/errno.h> | 15 | #include <linux/errno.h> |
16 | #include <linux/ioport.h> | 16 | #include <linux/ioport.h> |
17 | #include <linux/serial_core.h> | 17 | #include <linux/serial_core.h> |
18 | #include <linux/mfd/ucb1x00.h> | ||
18 | #include <linux/mtd/mtd.h> | 19 | #include <linux/mtd/mtd.h> |
19 | #include <linux/mtd/partitions.h> | 20 | #include <linux/mtd/partitions.h> |
20 | #include <linux/delay.h> | 21 | #include <linux/delay.h> |
21 | #include <linux/mm.h> | 22 | #include <linux/mm.h> |
22 | 23 | ||
24 | #include <video/sa1100fb.h> | ||
25 | |||
23 | #include <mach/hardware.h> | 26 | #include <mach/hardware.h> |
24 | #include <asm/mach-types.h> | 27 | #include <asm/mach-types.h> |
25 | #include <asm/irq.h> | ||
26 | #include <asm/setup.h> | 28 | #include <asm/setup.h> |
27 | #include <asm/page.h> | 29 | #include <asm/page.h> |
28 | #include <asm/pgtable-hwdef.h> | 30 | #include <asm/pgtable-hwdef.h> |
@@ -36,17 +38,18 @@ | |||
36 | #include <asm/mach/serial_sa1100.h> | 38 | #include <asm/mach/serial_sa1100.h> |
37 | #include <mach/assabet.h> | 39 | #include <mach/assabet.h> |
38 | #include <mach/mcp.h> | 40 | #include <mach/mcp.h> |
41 | #include <mach/irqs.h> | ||
39 | 42 | ||
40 | #include "generic.h" | 43 | #include "generic.h" |
41 | 44 | ||
42 | #define ASSABET_BCR_DB1110 \ | 45 | #define ASSABET_BCR_DB1110 \ |
43 | (ASSABET_BCR_SPK_OFF | ASSABET_BCR_QMUTE | \ | 46 | (ASSABET_BCR_SPK_OFF | \ |
44 | ASSABET_BCR_LED_GREEN | ASSABET_BCR_LED_RED | \ | 47 | ASSABET_BCR_LED_GREEN | ASSABET_BCR_LED_RED | \ |
45 | ASSABET_BCR_RS232EN | ASSABET_BCR_LCD_12RGB | \ | 48 | ASSABET_BCR_RS232EN | ASSABET_BCR_LCD_12RGB | \ |
46 | ASSABET_BCR_IRDA_MD0) | 49 | ASSABET_BCR_IRDA_MD0) |
47 | 50 | ||
48 | #define ASSABET_BCR_DB1111 \ | 51 | #define ASSABET_BCR_DB1111 \ |
49 | (ASSABET_BCR_SPK_OFF | ASSABET_BCR_QMUTE | \ | 52 | (ASSABET_BCR_SPK_OFF | \ |
50 | ASSABET_BCR_LED_GREEN | ASSABET_BCR_LED_RED | \ | 53 | ASSABET_BCR_LED_GREEN | ASSABET_BCR_LED_RED | \ |
51 | ASSABET_BCR_RS232EN | ASSABET_BCR_LCD_12RGB | \ | 54 | ASSABET_BCR_RS232EN | ASSABET_BCR_LCD_12RGB | \ |
52 | ASSABET_BCR_CF_BUS_OFF | ASSABET_BCR_STEREO_LB | \ | 55 | ASSABET_BCR_CF_BUS_OFF | ASSABET_BCR_STEREO_LB | \ |
@@ -69,31 +72,10 @@ void ASSABET_BCR_frob(unsigned int mask, unsigned int val) | |||
69 | 72 | ||
70 | EXPORT_SYMBOL(ASSABET_BCR_frob); | 73 | EXPORT_SYMBOL(ASSABET_BCR_frob); |
71 | 74 | ||
72 | static void assabet_backlight_power(int on) | 75 | static void assabet_ucb1x00_reset(enum ucb1x00_reset state) |
73 | { | ||
74 | #ifndef ASSABET_PAL_VIDEO | ||
75 | if (on) | ||
76 | ASSABET_BCR_set(ASSABET_BCR_LIGHT_ON); | ||
77 | else | ||
78 | #endif | ||
79 | ASSABET_BCR_clear(ASSABET_BCR_LIGHT_ON); | ||
80 | } | ||
81 | |||
82 | /* | ||
83 | * Turn on/off the backlight. When turning the backlight on, | ||
84 | * we wait 500us after turning it on so we don't cause the | ||
85 | * supplies to droop when we enable the LCD controller (and | ||
86 | * cause a hard reset.) | ||
87 | */ | ||
88 | static void assabet_lcd_power(int on) | ||
89 | { | 76 | { |
90 | #ifndef ASSABET_PAL_VIDEO | 77 | if (state == UCB_RST_PROBE) |
91 | if (on) { | 78 | ASSABET_BCR_set(ASSABET_BCR_CODEC_RST); |
92 | ASSABET_BCR_set(ASSABET_BCR_LCD_ON); | ||
93 | udelay(500); | ||
94 | } else | ||
95 | #endif | ||
96 | ASSABET_BCR_clear(ASSABET_BCR_LCD_ON); | ||
97 | } | 79 | } |
98 | 80 | ||
99 | 81 | ||
@@ -152,15 +134,8 @@ static struct flash_platform_data assabet_flash_data = { | |||
152 | }; | 134 | }; |
153 | 135 | ||
154 | static struct resource assabet_flash_resources[] = { | 136 | static struct resource assabet_flash_resources[] = { |
155 | { | 137 | DEFINE_RES_MEM(SA1100_CS0_PHYS, SZ_32M), |
156 | .start = SA1100_CS0_PHYS, | 138 | DEFINE_RES_MEM(SA1100_CS1_PHYS, SZ_32M), |
157 | .end = SA1100_CS0_PHYS + SZ_32M - 1, | ||
158 | .flags = IORESOURCE_MEM, | ||
159 | }, { | ||
160 | .start = SA1100_CS1_PHYS, | ||
161 | .end = SA1100_CS1_PHYS + SZ_32M - 1, | ||
162 | .flags = IORESOURCE_MEM, | ||
163 | } | ||
164 | }; | 139 | }; |
165 | 140 | ||
166 | 141 | ||
@@ -199,18 +174,126 @@ static struct irda_platform_data assabet_irda_data = { | |||
199 | .set_speed = assabet_irda_set_speed, | 174 | .set_speed = assabet_irda_set_speed, |
200 | }; | 175 | }; |
201 | 176 | ||
177 | static struct ucb1x00_plat_data assabet_ucb1x00_data = { | ||
178 | .reset = assabet_ucb1x00_reset, | ||
179 | .gpio_base = -1, | ||
180 | }; | ||
181 | |||
202 | static struct mcp_plat_data assabet_mcp_data = { | 182 | static struct mcp_plat_data assabet_mcp_data = { |
203 | .mccr0 = MCCR0_ADM, | 183 | .mccr0 = MCCR0_ADM, |
204 | .sclk_rate = 11981000, | 184 | .sclk_rate = 11981000, |
185 | .codec_pdata = &assabet_ucb1x00_data, | ||
186 | }; | ||
187 | |||
188 | static void assabet_lcd_set_visual(u32 visual) | ||
189 | { | ||
190 | u_int is_true_color = visual == FB_VISUAL_TRUECOLOR; | ||
191 | |||
192 | if (machine_is_assabet()) { | ||
193 | #if 1 // phase 4 or newer Assabet's | ||
194 | if (is_true_color) | ||
195 | ASSABET_BCR_set(ASSABET_BCR_LCD_12RGB); | ||
196 | else | ||
197 | ASSABET_BCR_clear(ASSABET_BCR_LCD_12RGB); | ||
198 | #else | ||
199 | // older Assabet's | ||
200 | if (is_true_color) | ||
201 | ASSABET_BCR_clear(ASSABET_BCR_LCD_12RGB); | ||
202 | else | ||
203 | ASSABET_BCR_set(ASSABET_BCR_LCD_12RGB); | ||
204 | #endif | ||
205 | } | ||
206 | } | ||
207 | |||
208 | #ifndef ASSABET_PAL_VIDEO | ||
209 | static void assabet_lcd_backlight_power(int on) | ||
210 | { | ||
211 | if (on) | ||
212 | ASSABET_BCR_set(ASSABET_BCR_LIGHT_ON); | ||
213 | else | ||
214 | ASSABET_BCR_clear(ASSABET_BCR_LIGHT_ON); | ||
215 | } | ||
216 | |||
217 | /* | ||
218 | * Turn on/off the backlight. When turning the backlight on, we wait | ||
219 | * 500us after turning it on so we don't cause the supplies to droop | ||
220 | * when we enable the LCD controller (and cause a hard reset.) | ||
221 | */ | ||
222 | static void assabet_lcd_power(int on) | ||
223 | { | ||
224 | if (on) { | ||
225 | ASSABET_BCR_set(ASSABET_BCR_LCD_ON); | ||
226 | udelay(500); | ||
227 | } else | ||
228 | ASSABET_BCR_clear(ASSABET_BCR_LCD_ON); | ||
229 | } | ||
230 | |||
231 | /* | ||
232 | * The assabet uses a sharp LQ039Q2DS54 LCD module. It is actually | ||
233 | * takes an RGB666 signal, but we provide it with an RGB565 signal | ||
234 | * instead (def_rgb_16). | ||
235 | */ | ||
236 | static struct sa1100fb_mach_info lq039q2ds54_info = { | ||
237 | .pixclock = 171521, .bpp = 16, | ||
238 | .xres = 320, .yres = 240, | ||
239 | |||
240 | .hsync_len = 5, .vsync_len = 1, | ||
241 | .left_margin = 61, .upper_margin = 3, | ||
242 | .right_margin = 9, .lower_margin = 0, | ||
243 | |||
244 | .sync = FB_SYNC_HOR_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT, | ||
245 | |||
246 | .lccr0 = LCCR0_Color | LCCR0_Sngl | LCCR0_Act, | ||
247 | .lccr3 = LCCR3_OutEnH | LCCR3_PixRsEdg | LCCR3_ACBsDiv(2), | ||
248 | |||
249 | .backlight_power = assabet_lcd_backlight_power, | ||
250 | .lcd_power = assabet_lcd_power, | ||
251 | .set_visual = assabet_lcd_set_visual, | ||
252 | }; | ||
253 | #else | ||
254 | static void assabet_pal_backlight_power(int on) | ||
255 | { | ||
256 | ASSABET_BCR_clear(ASSABET_BCR_LIGHT_ON); | ||
257 | } | ||
258 | |||
259 | static void assabet_pal_power(int on) | ||
260 | { | ||
261 | ASSABET_BCR_clear(ASSABET_BCR_LCD_ON); | ||
262 | } | ||
263 | |||
264 | static struct sa1100fb_mach_info pal_info = { | ||
265 | .pixclock = 67797, .bpp = 16, | ||
266 | .xres = 640, .yres = 512, | ||
267 | |||
268 | .hsync_len = 64, .vsync_len = 6, | ||
269 | .left_margin = 125, .upper_margin = 70, | ||
270 | .right_margin = 115, .lower_margin = 36, | ||
271 | |||
272 | .lccr0 = LCCR0_Color | LCCR0_Sngl | LCCR0_Act, | ||
273 | .lccr3 = LCCR3_OutEnH | LCCR3_PixRsEdg | LCCR3_ACBsDiv(512), | ||
274 | |||
275 | .backlight_power = assabet_pal_backlight_power, | ||
276 | .lcd_power = assabet_pal_power, | ||
277 | .set_visual = assabet_lcd_set_visual, | ||
205 | }; | 278 | }; |
279 | #endif | ||
280 | |||
281 | #ifdef CONFIG_ASSABET_NEPONSET | ||
282 | static struct resource neponset_resources[] = { | ||
283 | DEFINE_RES_MEM(0x10000000, 0x08000000), | ||
284 | DEFINE_RES_MEM(0x18000000, 0x04000000), | ||
285 | DEFINE_RES_MEM(0x40000000, SZ_8K), | ||
286 | DEFINE_RES_IRQ(IRQ_GPIO25), | ||
287 | }; | ||
288 | #endif | ||
206 | 289 | ||
207 | static void __init assabet_init(void) | 290 | static void __init assabet_init(void) |
208 | { | 291 | { |
209 | /* | 292 | /* |
210 | * Ensure that the power supply is in "high power" mode. | 293 | * Ensure that the power supply is in "high power" mode. |
211 | */ | 294 | */ |
212 | GPDR |= GPIO_GPIO16; | ||
213 | GPSR = GPIO_GPIO16; | 295 | GPSR = GPIO_GPIO16; |
296 | GPDR |= GPIO_GPIO16; | ||
214 | 297 | ||
215 | /* | 298 | /* |
216 | * Ensure that these pins are set as outputs and are driving | 299 | * Ensure that these pins are set as outputs and are driving |
@@ -218,8 +301,16 @@ static void __init assabet_init(void) | |||
218 | * the WS latch in the CPLD, and we don't float causing | 301 | * the WS latch in the CPLD, and we don't float causing |
219 | * excessive power drain. --rmk | 302 | * excessive power drain. --rmk |
220 | */ | 303 | */ |
221 | GPDR |= GPIO_SSP_TXD | GPIO_SSP_SCLK | GPIO_SSP_SFRM; | ||
222 | GPCR = GPIO_SSP_TXD | GPIO_SSP_SCLK | GPIO_SSP_SFRM; | 304 | GPCR = GPIO_SSP_TXD | GPIO_SSP_SCLK | GPIO_SSP_SFRM; |
305 | GPDR |= GPIO_SSP_TXD | GPIO_SSP_SCLK | GPIO_SSP_SFRM; | ||
306 | |||
307 | /* | ||
308 | * Also set GPIO27 as an output; this is used to clock UART3 | ||
309 | * via the FPGA and as otherwise has no pullups or pulldowns, | ||
310 | * so stop it floating. | ||
311 | */ | ||
312 | GPCR = GPIO_GPIO27; | ||
313 | GPDR |= GPIO_GPIO27; | ||
223 | 314 | ||
224 | /* | 315 | /* |
225 | * Set up registers for sleep mode. | 316 | * Set up registers for sleep mode. |
@@ -231,8 +322,7 @@ static void __init assabet_init(void) | |||
231 | PPDR |= PPC_TXD3 | PPC_TXD1; | 322 | PPDR |= PPC_TXD3 | PPC_TXD1; |
232 | PPSR |= PPC_TXD3 | PPC_TXD1; | 323 | PPSR |= PPC_TXD3 | PPC_TXD1; |
233 | 324 | ||
234 | sa1100fb_lcd_power = assabet_lcd_power; | 325 | sa11x0_ppc_configure_mcp(); |
235 | sa1100fb_backlight_power = assabet_backlight_power; | ||
236 | 326 | ||
237 | if (machine_has_neponset()) { | 327 | if (machine_has_neponset()) { |
238 | /* | 328 | /* |
@@ -246,9 +336,17 @@ static void __init assabet_init(void) | |||
246 | #ifndef CONFIG_ASSABET_NEPONSET | 336 | #ifndef CONFIG_ASSABET_NEPONSET |
247 | printk( "Warning: Neponset detected but full support " | 337 | printk( "Warning: Neponset detected but full support " |
248 | "hasn't been configured in the kernel\n" ); | 338 | "hasn't been configured in the kernel\n" ); |
339 | #else | ||
340 | platform_device_register_simple("neponset", 0, | ||
341 | neponset_resources, ARRAY_SIZE(neponset_resources)); | ||
249 | #endif | 342 | #endif |
250 | } | 343 | } |
251 | 344 | ||
345 | #ifndef ASSABET_PAL_VIDEO | ||
346 | sa11x0_register_lcd(&lq039q2ds54_info); | ||
347 | #else | ||
348 | sa11x0_register_lcd(&pal_video); | ||
349 | #endif | ||
252 | sa11x0_register_mtd(&assabet_flash_data, assabet_flash_resources, | 350 | sa11x0_register_mtd(&assabet_flash_data, assabet_flash_resources, |
253 | ARRAY_SIZE(assabet_flash_resources)); | 351 | ARRAY_SIZE(assabet_flash_resources)); |
254 | sa11x0_register_irda(&assabet_irda_data); | 352 | sa11x0_register_irda(&assabet_irda_data); |
@@ -412,21 +510,8 @@ static void __init assabet_map_io(void) | |||
412 | */ | 510 | */ |
413 | Ser1SDCR0 |= SDCR0_SUS; | 511 | Ser1SDCR0 |= SDCR0_SUS; |
414 | 512 | ||
415 | if (machine_has_neponset()) { | 513 | if (!machine_has_neponset()) |
416 | #ifdef CONFIG_ASSABET_NEPONSET | ||
417 | extern void neponset_map_io(void); | ||
418 | |||
419 | /* | ||
420 | * We map Neponset registers even if it isn't present since | ||
421 | * many drivers will try to probe their stuff (and fail). | ||
422 | * This is still more friendly than a kernel paging request | ||
423 | * crash. | ||
424 | */ | ||
425 | neponset_map_io(); | ||
426 | #endif | ||
427 | } else { | ||
428 | sa1100_register_uart_fns(&assabet_port_fns); | 514 | sa1100_register_uart_fns(&assabet_port_fns); |
429 | } | ||
430 | 515 | ||
431 | /* | 516 | /* |
432 | * When Neponset is attached, the first UART should be | 517 | * When Neponset is attached, the first UART should be |
@@ -449,6 +534,7 @@ MACHINE_START(ASSABET, "Intel-Assabet") | |||
449 | .atag_offset = 0x100, | 534 | .atag_offset = 0x100, |
450 | .fixup = fixup_assabet, | 535 | .fixup = fixup_assabet, |
451 | .map_io = assabet_map_io, | 536 | .map_io = assabet_map_io, |
537 | .nr_irqs = SA1100_NR_IRQS, | ||
452 | .init_irq = sa1100_init_irq, | 538 | .init_irq = sa1100_init_irq, |
453 | .timer = &sa1100_timer, | 539 | .timer = &sa1100_timer, |
454 | .init_machine = assabet_init, | 540 | .init_machine = assabet_init, |
diff --git a/arch/arm/mach-sa1100/badge4.c b/arch/arm/mach-sa1100/badge4.c index b07a2c024cb7..e0f0c030258c 100644 --- a/arch/arm/mach-sa1100/badge4.c +++ b/arch/arm/mach-sa1100/badge4.c | |||
@@ -39,20 +39,27 @@ | |||
39 | #include "generic.h" | 39 | #include "generic.h" |
40 | 40 | ||
41 | static struct resource sa1111_resources[] = { | 41 | static struct resource sa1111_resources[] = { |
42 | [0] = { | 42 | [0] = DEFINE_RES_MEM(BADGE4_SA1111_BASE, 0x2000), |
43 | .start = BADGE4_SA1111_BASE, | 43 | [1] = DEFINE_RES_IRQ(BADGE4_IRQ_GPIO_SA1111), |
44 | .end = BADGE4_SA1111_BASE + 0x00001fff, | ||
45 | .flags = IORESOURCE_MEM, | ||
46 | }, | ||
47 | [1] = { | ||
48 | .start = BADGE4_IRQ_GPIO_SA1111, | ||
49 | .end = BADGE4_IRQ_GPIO_SA1111, | ||
50 | .flags = IORESOURCE_IRQ, | ||
51 | }, | ||
52 | }; | 44 | }; |
53 | 45 | ||
46 | static int badge4_sa1111_enable(void *data, unsigned devid) | ||
47 | { | ||
48 | if (devid == SA1111_DEVID_USB) | ||
49 | badge4_set_5V(BADGE4_5V_USB, 1); | ||
50 | return 0; | ||
51 | } | ||
52 | |||
53 | static void badge4_sa1111_disable(void *data, unsigned devid) | ||
54 | { | ||
55 | if (devid == SA1111_DEVID_USB) | ||
56 | badge4_set_5V(BADGE4_5V_USB, 0); | ||
57 | } | ||
58 | |||
54 | static struct sa1111_platform_data sa1111_info = { | 59 | static struct sa1111_platform_data sa1111_info = { |
55 | .irq_base = IRQ_BOARD_END, | 60 | .disable_devs = SA1111_DEVID_PS2_MSE, |
61 | .enable = badge4_sa1111_enable, | ||
62 | .disable = badge4_sa1111_disable, | ||
56 | }; | 63 | }; |
57 | 64 | ||
58 | static u64 sa1111_dmamask = 0xffffffffUL; | 65 | static u64 sa1111_dmamask = 0xffffffffUL; |
@@ -121,11 +128,8 @@ static struct flash_platform_data badge4_flash_data = { | |||
121 | .nr_parts = ARRAY_SIZE(badge4_partitions), | 128 | .nr_parts = ARRAY_SIZE(badge4_partitions), |
122 | }; | 129 | }; |
123 | 130 | ||
124 | static struct resource badge4_flash_resource = { | 131 | static struct resource badge4_flash_resource = |
125 | .start = SA1100_CS0_PHYS, | 132 | DEFINE_RES_MEM(SA1100_CS0_PHYS, SZ_64M); |
126 | .end = SA1100_CS0_PHYS + SZ_64M - 1, | ||
127 | .flags = IORESOURCE_MEM, | ||
128 | }; | ||
129 | 133 | ||
130 | static int five_v_on __initdata = 0; | 134 | static int five_v_on __initdata = 0; |
131 | 135 | ||
@@ -269,11 +273,6 @@ static struct map_desc badge4_io_desc[] __initdata = { | |||
269 | .pfn = __phys_to_pfn(0x10000000), | 273 | .pfn = __phys_to_pfn(0x10000000), |
270 | .length = 0x00100000, | 274 | .length = 0x00100000, |
271 | .type = MT_DEVICE | 275 | .type = MT_DEVICE |
272 | }, { /* SA-1111 */ | ||
273 | .virtual = 0xf4000000, | ||
274 | .pfn = __phys_to_pfn(0x48000000), | ||
275 | .length = 0x00100000, | ||
276 | .type = MT_DEVICE | ||
277 | } | 276 | } |
278 | }; | 277 | }; |
279 | 278 | ||
@@ -304,6 +303,7 @@ static void __init badge4_map_io(void) | |||
304 | MACHINE_START(BADGE4, "Hewlett-Packard Laboratories BadgePAD 4") | 303 | MACHINE_START(BADGE4, "Hewlett-Packard Laboratories BadgePAD 4") |
305 | .atag_offset = 0x100, | 304 | .atag_offset = 0x100, |
306 | .map_io = badge4_map_io, | 305 | .map_io = badge4_map_io, |
306 | .nr_irqs = SA1100_NR_IRQS, | ||
307 | .init_irq = sa1100_init_irq, | 307 | .init_irq = sa1100_init_irq, |
308 | .timer = &sa1100_timer, | 308 | .timer = &sa1100_timer, |
309 | #ifdef CONFIG_SA1111 | 309 | #ifdef CONFIG_SA1111 |
diff --git a/arch/arm/mach-sa1100/cerf.c b/arch/arm/mach-sa1100/cerf.c index 11bb6d0b9be3..4a61f60e0502 100644 --- a/arch/arm/mach-sa1100/cerf.c +++ b/arch/arm/mach-sa1100/cerf.c | |||
@@ -18,7 +18,6 @@ | |||
18 | #include <linux/mtd/mtd.h> | 18 | #include <linux/mtd/mtd.h> |
19 | #include <linux/mtd/partitions.h> | 19 | #include <linux/mtd/partitions.h> |
20 | 20 | ||
21 | #include <asm/irq.h> | ||
22 | #include <mach/hardware.h> | 21 | #include <mach/hardware.h> |
23 | #include <asm/setup.h> | 22 | #include <asm/setup.h> |
24 | 23 | ||
@@ -30,14 +29,11 @@ | |||
30 | 29 | ||
31 | #include <mach/cerf.h> | 30 | #include <mach/cerf.h> |
32 | #include <mach/mcp.h> | 31 | #include <mach/mcp.h> |
32 | #include <mach/irqs.h> | ||
33 | #include "generic.h" | 33 | #include "generic.h" |
34 | 34 | ||
35 | static struct resource cerfuart2_resources[] = { | 35 | static struct resource cerfuart2_resources[] = { |
36 | [0] = { | 36 | [0] = DEFINE_RES_MEM(0x80030000, SZ_64K), |
37 | .start = 0x80030000, | ||
38 | .end = 0x8003ffff, | ||
39 | .flags = IORESOURCE_MEM, | ||
40 | }, | ||
41 | }; | 37 | }; |
42 | 38 | ||
43 | static struct platform_device cerfuart2_device = { | 39 | static struct platform_device cerfuart2_device = { |
@@ -87,11 +83,8 @@ static struct flash_platform_data cerf_flash_data = { | |||
87 | .nr_parts = ARRAY_SIZE(cerf_partitions), | 83 | .nr_parts = ARRAY_SIZE(cerf_partitions), |
88 | }; | 84 | }; |
89 | 85 | ||
90 | static struct resource cerf_flash_resource = { | 86 | static struct resource cerf_flash_resource = |
91 | .start = SA1100_CS0_PHYS, | 87 | DEFINE_RES_MEM(SA1100_CS0_PHYS, SZ_32M); |
92 | .end = SA1100_CS0_PHYS + SZ_32M - 1, | ||
93 | .flags = IORESOURCE_MEM, | ||
94 | }; | ||
95 | 88 | ||
96 | static void __init cerf_init_irq(void) | 89 | static void __init cerf_init_irq(void) |
97 | { | 90 | { |
@@ -128,6 +121,7 @@ static struct mcp_plat_data cerf_mcp_data = { | |||
128 | 121 | ||
129 | static void __init cerf_init(void) | 122 | static void __init cerf_init(void) |
130 | { | 123 | { |
124 | sa11x0_ppc_configure_mcp(); | ||
131 | platform_add_devices(cerf_devices, ARRAY_SIZE(cerf_devices)); | 125 | platform_add_devices(cerf_devices, ARRAY_SIZE(cerf_devices)); |
132 | sa11x0_register_mtd(&cerf_flash_data, &cerf_flash_resource, 1); | 126 | sa11x0_register_mtd(&cerf_flash_data, &cerf_flash_resource, 1); |
133 | sa11x0_register_mcp(&cerf_mcp_data); | 127 | sa11x0_register_mcp(&cerf_mcp_data); |
@@ -136,6 +130,7 @@ static void __init cerf_init(void) | |||
136 | MACHINE_START(CERF, "Intrinsyc CerfBoard/CerfCube") | 130 | MACHINE_START(CERF, "Intrinsyc CerfBoard/CerfCube") |
137 | /* Maintainer: support@intrinsyc.com */ | 131 | /* Maintainer: support@intrinsyc.com */ |
138 | .map_io = cerf_map_io, | 132 | .map_io = cerf_map_io, |
133 | .nr_irqs = SA1100_NR_IRQS, | ||
139 | .init_irq = cerf_init_irq, | 134 | .init_irq = cerf_init_irq, |
140 | .timer = &sa1100_timer, | 135 | .timer = &sa1100_timer, |
141 | .init_machine = cerf_init, | 136 | .init_machine = cerf_init, |
diff --git a/arch/arm/mach-sa1100/collie.c b/arch/arm/mach-sa1100/collie.c index fd5652118ed1..48885b7efd6b 100644 --- a/arch/arm/mach-sa1100/collie.c +++ b/arch/arm/mach-sa1100/collie.c | |||
@@ -22,15 +22,17 @@ | |||
22 | #include <linux/tty.h> | 22 | #include <linux/tty.h> |
23 | #include <linux/delay.h> | 23 | #include <linux/delay.h> |
24 | #include <linux/platform_device.h> | 24 | #include <linux/platform_device.h> |
25 | #include <linux/mfd/ucb1x00.h> | ||
25 | #include <linux/mtd/mtd.h> | 26 | #include <linux/mtd/mtd.h> |
26 | #include <linux/mtd/partitions.h> | 27 | #include <linux/mtd/partitions.h> |
27 | #include <linux/timer.h> | 28 | #include <linux/timer.h> |
28 | #include <linux/gpio.h> | 29 | #include <linux/gpio.h> |
29 | #include <linux/pda_power.h> | 30 | #include <linux/pda_power.h> |
30 | 31 | ||
32 | #include <video/sa1100fb.h> | ||
33 | |||
31 | #include <mach/hardware.h> | 34 | #include <mach/hardware.h> |
32 | #include <asm/mach-types.h> | 35 | #include <asm/mach-types.h> |
33 | #include <asm/irq.h> | ||
34 | #include <asm/page.h> | 36 | #include <asm/page.h> |
35 | #include <asm/setup.h> | 37 | #include <asm/setup.h> |
36 | #include <mach/collie.h> | 38 | #include <mach/collie.h> |
@@ -44,15 +46,12 @@ | |||
44 | #include <asm/mach/sharpsl_param.h> | 46 | #include <asm/mach/sharpsl_param.h> |
45 | #include <asm/hardware/locomo.h> | 47 | #include <asm/hardware/locomo.h> |
46 | #include <mach/mcp.h> | 48 | #include <mach/mcp.h> |
49 | #include <mach/irqs.h> | ||
47 | 50 | ||
48 | #include "generic.h" | 51 | #include "generic.h" |
49 | 52 | ||
50 | static struct resource collie_scoop_resources[] = { | 53 | static struct resource collie_scoop_resources[] = { |
51 | [0] = { | 54 | [0] = DEFINE_RES_MEM(0x40800000, SZ_4K), |
52 | .start = 0x40800000, | ||
53 | .end = 0x40800fff, | ||
54 | .flags = IORESOURCE_MEM, | ||
55 | }, | ||
56 | }; | 55 | }; |
57 | 56 | ||
58 | static struct scoop_config collie_scoop_setup = { | 57 | static struct scoop_config collie_scoop_setup = { |
@@ -85,10 +84,14 @@ static struct scoop_pcmcia_config collie_pcmcia_config = { | |||
85 | .num_devs = 1, | 84 | .num_devs = 1, |
86 | }; | 85 | }; |
87 | 86 | ||
87 | static struct ucb1x00_plat_data collie_ucb1x00_data = { | ||
88 | .gpio_base = COLLIE_TC35143_GPIO_BASE, | ||
89 | }; | ||
90 | |||
88 | static struct mcp_plat_data collie_mcp_data = { | 91 | static struct mcp_plat_data collie_mcp_data = { |
89 | .mccr0 = MCCR0_ADM | MCCR0_ExtClk, | 92 | .mccr0 = MCCR0_ADM | MCCR0_ExtClk, |
90 | .sclk_rate = 9216000, | 93 | .sclk_rate = 9216000, |
91 | .gpio_base = COLLIE_TC35143_GPIO_BASE, | 94 | .codec_pdata = &collie_ucb1x00_data, |
92 | }; | 95 | }; |
93 | 96 | ||
94 | /* | 97 | /* |
@@ -221,16 +224,8 @@ device_initcall(collie_uart_init); | |||
221 | 224 | ||
222 | 225 | ||
223 | static struct resource locomo_resources[] = { | 226 | static struct resource locomo_resources[] = { |
224 | [0] = { | 227 | [0] = DEFINE_RES_MEM(0x40000000, SZ_8K), |
225 | .start = 0x40000000, | 228 | [1] = DEFINE_RES_IRQ(IRQ_GPIO25), |
226 | .end = 0x40001fff, | ||
227 | .flags = IORESOURCE_MEM, | ||
228 | }, | ||
229 | [1] = { | ||
230 | .start = IRQ_GPIO25, | ||
231 | .end = IRQ_GPIO25, | ||
232 | .flags = IORESOURCE_IRQ, | ||
233 | }, | ||
234 | }; | 229 | }; |
235 | 230 | ||
236 | static struct locomo_platform_data locomo_info = { | 231 | static struct locomo_platform_data locomo_info = { |
@@ -303,11 +298,21 @@ static struct flash_platform_data collie_flash_data = { | |||
303 | }; | 298 | }; |
304 | 299 | ||
305 | static struct resource collie_flash_resources[] = { | 300 | static struct resource collie_flash_resources[] = { |
306 | { | 301 | DEFINE_RES_MEM(SA1100_CS0_PHYS, SZ_32M), |
307 | .start = SA1100_CS0_PHYS, | 302 | }; |
308 | .end = SA1100_CS0_PHYS + SZ_32M - 1, | 303 | |
309 | .flags = IORESOURCE_MEM, | 304 | static struct sa1100fb_mach_info collie_lcd_info = { |
310 | } | 305 | .pixclock = 171521, .bpp = 16, |
306 | .xres = 320, .yres = 240, | ||
307 | |||
308 | .hsync_len = 5, .vsync_len = 1, | ||
309 | .left_margin = 11, .upper_margin = 2, | ||
310 | .right_margin = 30, .lower_margin = 0, | ||
311 | |||
312 | .sync = FB_SYNC_HOR_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT, | ||
313 | |||
314 | .lccr0 = LCCR0_Color | LCCR0_Sngl | LCCR0_Act, | ||
315 | .lccr3 = LCCR3_OutEnH | LCCR3_PixRsEdg | LCCR3_ACBsDiv(2), | ||
311 | }; | 316 | }; |
312 | 317 | ||
313 | static void __init collie_init(void) | 318 | static void __init collie_init(void) |
@@ -341,6 +346,10 @@ static void __init collie_init(void) | |||
341 | 346 | ||
342 | collie_power_resource[0].start = gpio_to_irq(COLLIE_GPIO_AC_IN); | 347 | collie_power_resource[0].start = gpio_to_irq(COLLIE_GPIO_AC_IN); |
343 | collie_power_resource[0].end = gpio_to_irq(COLLIE_GPIO_AC_IN); | 348 | collie_power_resource[0].end = gpio_to_irq(COLLIE_GPIO_AC_IN); |
349 | |||
350 | sa11x0_ppc_configure_mcp(); | ||
351 | |||
352 | |||
344 | platform_scoop_config = &collie_pcmcia_config; | 353 | platform_scoop_config = &collie_pcmcia_config; |
345 | 354 | ||
346 | ret = platform_add_devices(devices, ARRAY_SIZE(devices)); | 355 | ret = platform_add_devices(devices, ARRAY_SIZE(devices)); |
@@ -348,6 +357,7 @@ static void __init collie_init(void) | |||
348 | printk(KERN_WARNING "collie: Unable to register LoCoMo device\n"); | 357 | printk(KERN_WARNING "collie: Unable to register LoCoMo device\n"); |
349 | } | 358 | } |
350 | 359 | ||
360 | sa11x0_register_lcd(&collie_lcd_info); | ||
351 | sa11x0_register_mtd(&collie_flash_data, collie_flash_resources, | 361 | sa11x0_register_mtd(&collie_flash_data, collie_flash_resources, |
352 | ARRAY_SIZE(collie_flash_resources)); | 362 | ARRAY_SIZE(collie_flash_resources)); |
353 | sa11x0_register_mcp(&collie_mcp_data); | 363 | sa11x0_register_mcp(&collie_mcp_data); |
@@ -383,6 +393,7 @@ static void __init collie_map_io(void) | |||
383 | 393 | ||
384 | MACHINE_START(COLLIE, "Sharp-Collie") | 394 | MACHINE_START(COLLIE, "Sharp-Collie") |
385 | .map_io = collie_map_io, | 395 | .map_io = collie_map_io, |
396 | .nr_irqs = SA1100_NR_IRQS, | ||
386 | .init_irq = sa1100_init_irq, | 397 | .init_irq = sa1100_init_irq, |
387 | .timer = &sa1100_timer, | 398 | .timer = &sa1100_timer, |
388 | .init_machine = collie_init, | 399 | .init_machine = collie_init, |
diff --git a/arch/arm/mach-sa1100/dma.c b/arch/arm/mach-sa1100/dma.c deleted file mode 100644 index ad660350c296..000000000000 --- a/arch/arm/mach-sa1100/dma.c +++ /dev/null | |||
@@ -1,348 +0,0 @@ | |||
1 | /* | ||
2 | * arch/arm/mach-sa1100/dma.c | ||
3 | * | ||
4 | * Support functions for the SA11x0 internal DMA channels. | ||
5 | * | ||
6 | * Copyright (C) 2000, 2001 by Nicolas Pitre | ||
7 | * | ||
8 | * This program is free software; you can redistribute it and/or modify | ||
9 | * it under the terms of the GNU General Public License version 2 as | ||
10 | * published by the Free Software Foundation. | ||
11 | */ | ||
12 | |||
13 | #include <linux/module.h> | ||
14 | #include <linux/interrupt.h> | ||
15 | #include <linux/init.h> | ||
16 | #include <linux/spinlock.h> | ||
17 | #include <linux/errno.h> | ||
18 | |||
19 | #include <asm/system.h> | ||
20 | #include <asm/irq.h> | ||
21 | #include <mach/hardware.h> | ||
22 | #include <mach/dma.h> | ||
23 | |||
24 | |||
25 | #undef DEBUG | ||
26 | #ifdef DEBUG | ||
27 | #define DPRINTK( s, arg... ) printk( "dma<%p>: " s, regs , ##arg ) | ||
28 | #else | ||
29 | #define DPRINTK( x... ) | ||
30 | #endif | ||
31 | |||
32 | |||
33 | typedef struct { | ||
34 | const char *device_id; /* device name */ | ||
35 | u_long device; /* this channel device, 0 if unused*/ | ||
36 | dma_callback_t callback; /* to call when DMA completes */ | ||
37 | void *data; /* ... with private data ptr */ | ||
38 | } sa1100_dma_t; | ||
39 | |||
40 | static sa1100_dma_t dma_chan[SA1100_DMA_CHANNELS]; | ||
41 | |||
42 | static DEFINE_SPINLOCK(dma_list_lock); | ||
43 | |||
44 | |||
45 | static irqreturn_t dma_irq_handler(int irq, void *dev_id) | ||
46 | { | ||
47 | dma_regs_t *dma_regs = dev_id; | ||
48 | sa1100_dma_t *dma = dma_chan + (((u_int)dma_regs >> 5) & 7); | ||
49 | int status = dma_regs->RdDCSR; | ||
50 | |||
51 | if (status & (DCSR_ERROR)) { | ||
52 | printk(KERN_CRIT "DMA on \"%s\" caused an error\n", dma->device_id); | ||
53 | dma_regs->ClrDCSR = DCSR_ERROR; | ||
54 | } | ||
55 | |||
56 | dma_regs->ClrDCSR = status & (DCSR_DONEA | DCSR_DONEB); | ||
57 | if (dma->callback) { | ||
58 | if (status & DCSR_DONEA) | ||
59 | dma->callback(dma->data); | ||
60 | if (status & DCSR_DONEB) | ||
61 | dma->callback(dma->data); | ||
62 | } | ||
63 | return IRQ_HANDLED; | ||
64 | } | ||
65 | |||
66 | |||
67 | /** | ||
68 | * sa1100_request_dma - allocate one of the SA11x0's DMA channels | ||
69 | * @device: The SA11x0 peripheral targeted by this request | ||
70 | * @device_id: An ascii name for the claiming device | ||
71 | * @callback: Function to be called when the DMA completes | ||
72 | * @data: A cookie passed back to the callback function | ||
73 | * @dma_regs: Pointer to the location of the allocated channel's identifier | ||
74 | * | ||
75 | * This function will search for a free DMA channel and returns the | ||
76 | * address of the hardware registers for that channel as the channel | ||
77 | * identifier. This identifier is written to the location pointed by | ||
78 | * @dma_regs. The list of possible values for @device are listed into | ||
79 | * arch/arm/mach-sa1100/include/mach/dma.h as a dma_device_t enum. | ||
80 | * | ||
81 | * Note that reading from a port and writing to the same port are | ||
82 | * actually considered as two different streams requiring separate | ||
83 | * DMA registrations. | ||
84 | * | ||
85 | * The @callback function is called from interrupt context when one | ||
86 | * of the two possible DMA buffers in flight has terminated. That | ||
87 | * function has to be small and efficient while posponing more complex | ||
88 | * processing to a lower priority execution context. | ||
89 | * | ||
90 | * If no channels are available, or if the desired @device is already in | ||
91 | * use by another DMA channel, then an error code is returned. This | ||
92 | * function must be called before any other DMA calls. | ||
93 | **/ | ||
94 | |||
95 | int sa1100_request_dma (dma_device_t device, const char *device_id, | ||
96 | dma_callback_t callback, void *data, | ||
97 | dma_regs_t **dma_regs) | ||
98 | { | ||
99 | sa1100_dma_t *dma = NULL; | ||
100 | dma_regs_t *regs; | ||
101 | int i, err; | ||
102 | |||
103 | *dma_regs = NULL; | ||
104 | |||
105 | err = 0; | ||
106 | spin_lock(&dma_list_lock); | ||
107 | for (i = 0; i < SA1100_DMA_CHANNELS; i++) { | ||
108 | if (dma_chan[i].device == device) { | ||
109 | err = -EBUSY; | ||
110 | break; | ||
111 | } else if (!dma_chan[i].device && !dma) { | ||
112 | dma = &dma_chan[i]; | ||
113 | } | ||
114 | } | ||
115 | if (!err) { | ||
116 | if (dma) | ||
117 | dma->device = device; | ||
118 | else | ||
119 | err = -ENOSR; | ||
120 | } | ||
121 | spin_unlock(&dma_list_lock); | ||
122 | if (err) | ||
123 | return err; | ||
124 | |||
125 | i = dma - dma_chan; | ||
126 | regs = (dma_regs_t *)&DDAR(i); | ||
127 | err = request_irq(IRQ_DMA0 + i, dma_irq_handler, IRQF_DISABLED, | ||
128 | device_id, regs); | ||
129 | if (err) { | ||
130 | printk(KERN_ERR | ||
131 | "%s: unable to request IRQ %d for %s\n", | ||
132 | __func__, IRQ_DMA0 + i, device_id); | ||
133 | dma->device = 0; | ||
134 | return err; | ||
135 | } | ||
136 | |||
137 | *dma_regs = regs; | ||
138 | dma->device_id = device_id; | ||
139 | dma->callback = callback; | ||
140 | dma->data = data; | ||
141 | |||
142 | regs->ClrDCSR = | ||
143 | (DCSR_DONEA | DCSR_DONEB | DCSR_STRTA | DCSR_STRTB | | ||
144 | DCSR_IE | DCSR_ERROR | DCSR_RUN); | ||
145 | regs->DDAR = device; | ||
146 | |||
147 | return 0; | ||
148 | } | ||
149 | |||
150 | |||
151 | /** | ||
152 | * sa1100_free_dma - free a SA11x0 DMA channel | ||
153 | * @regs: identifier for the channel to free | ||
154 | * | ||
155 | * This clears all activities on a given DMA channel and releases it | ||
156 | * for future requests. The @regs identifier is provided by a | ||
157 | * successful call to sa1100_request_dma(). | ||
158 | **/ | ||
159 | |||
160 | void sa1100_free_dma(dma_regs_t *regs) | ||
161 | { | ||
162 | int i; | ||
163 | |||
164 | for (i = 0; i < SA1100_DMA_CHANNELS; i++) | ||
165 | if (regs == (dma_regs_t *)&DDAR(i)) | ||
166 | break; | ||
167 | if (i >= SA1100_DMA_CHANNELS) { | ||
168 | printk(KERN_ERR "%s: bad DMA identifier\n", __func__); | ||
169 | return; | ||
170 | } | ||
171 | |||
172 | if (!dma_chan[i].device) { | ||
173 | printk(KERN_ERR "%s: Trying to free free DMA\n", __func__); | ||
174 | return; | ||
175 | } | ||
176 | |||
177 | regs->ClrDCSR = | ||
178 | (DCSR_DONEA | DCSR_DONEB | DCSR_STRTA | DCSR_STRTB | | ||
179 | DCSR_IE | DCSR_ERROR | DCSR_RUN); | ||
180 | free_irq(IRQ_DMA0 + i, regs); | ||
181 | dma_chan[i].device = 0; | ||
182 | } | ||
183 | |||
184 | |||
185 | /** | ||
186 | * sa1100_start_dma - submit a data buffer for DMA | ||
187 | * @regs: identifier for the channel to use | ||
188 | * @dma_ptr: buffer physical (or bus) start address | ||
189 | * @size: buffer size | ||
190 | * | ||
191 | * This function hands the given data buffer to the hardware for DMA | ||
192 | * access. If another buffer is already in flight then this buffer | ||
193 | * will be queued so the DMA engine will switch to it automatically | ||
194 | * when the previous one is done. The DMA engine is actually toggling | ||
195 | * between two buffers so at most 2 successful calls can be made before | ||
196 | * one of them terminates and the callback function is called. | ||
197 | * | ||
198 | * The @regs identifier is provided by a successful call to | ||
199 | * sa1100_request_dma(). | ||
200 | * | ||
201 | * The @size must not be larger than %MAX_DMA_SIZE. If a given buffer | ||
202 | * is larger than that then it's the caller's responsibility to split | ||
203 | * it into smaller chunks and submit them separately. If this is the | ||
204 | * case then a @size of %CUT_DMA_SIZE is recommended to avoid ending | ||
205 | * up with too small chunks. The callback function can be used to chain | ||
206 | * submissions of buffer chunks. | ||
207 | * | ||
208 | * Error return values: | ||
209 | * %-EOVERFLOW: Given buffer size is too big. | ||
210 | * %-EBUSY: Both DMA buffers are already in use. | ||
211 | * %-EAGAIN: Both buffers were busy but one of them just completed | ||
212 | * but the interrupt handler has to execute first. | ||
213 | * | ||
214 | * This function returs 0 on success. | ||
215 | **/ | ||
216 | |||
217 | int sa1100_start_dma(dma_regs_t *regs, dma_addr_t dma_ptr, u_int size) | ||
218 | { | ||
219 | unsigned long flags; | ||
220 | u_long status; | ||
221 | int ret; | ||
222 | |||
223 | if (dma_ptr & 3) | ||
224 | printk(KERN_WARNING "DMA: unaligned start address (0x%08lx)\n", | ||
225 | (unsigned long)dma_ptr); | ||
226 | |||
227 | if (size > MAX_DMA_SIZE) | ||
228 | return -EOVERFLOW; | ||
229 | |||
230 | local_irq_save(flags); | ||
231 | status = regs->RdDCSR; | ||
232 | |||
233 | /* If both DMA buffers are started, there's nothing else we can do. */ | ||
234 | if ((status & (DCSR_STRTA | DCSR_STRTB)) == (DCSR_STRTA | DCSR_STRTB)) { | ||
235 | DPRINTK("start: st %#x busy\n", status); | ||
236 | ret = -EBUSY; | ||
237 | goto out; | ||
238 | } | ||
239 | |||
240 | if (((status & DCSR_BIU) && (status & DCSR_STRTB)) || | ||
241 | (!(status & DCSR_BIU) && !(status & DCSR_STRTA))) { | ||
242 | if (status & DCSR_DONEA) { | ||
243 | /* give a chance for the interrupt to be processed */ | ||
244 | ret = -EAGAIN; | ||
245 | goto out; | ||
246 | } | ||
247 | regs->DBSA = dma_ptr; | ||
248 | regs->DBTA = size; | ||
249 | regs->SetDCSR = DCSR_STRTA | DCSR_IE | DCSR_RUN; | ||
250 | DPRINTK("start a=%#x s=%d on A\n", dma_ptr, size); | ||
251 | } else { | ||
252 | if (status & DCSR_DONEB) { | ||
253 | /* give a chance for the interrupt to be processed */ | ||
254 | ret = -EAGAIN; | ||
255 | goto out; | ||
256 | } | ||
257 | regs->DBSB = dma_ptr; | ||
258 | regs->DBTB = size; | ||
259 | regs->SetDCSR = DCSR_STRTB | DCSR_IE | DCSR_RUN; | ||
260 | DPRINTK("start a=%#x s=%d on B\n", dma_ptr, size); | ||
261 | } | ||
262 | ret = 0; | ||
263 | |||
264 | out: | ||
265 | local_irq_restore(flags); | ||
266 | return ret; | ||
267 | } | ||
268 | |||
269 | |||
270 | /** | ||
271 | * sa1100_get_dma_pos - return current DMA position | ||
272 | * @regs: identifier for the channel to use | ||
273 | * | ||
274 | * This function returns the current physical (or bus) address for the | ||
275 | * given DMA channel. If the channel is running i.e. not in a stopped | ||
276 | * state then the caller must disable interrupts prior calling this | ||
277 | * function and process the returned value before re-enabling them to | ||
278 | * prevent races with the completion interrupt handler and the callback | ||
279 | * function. The validation of the returned value is the caller's | ||
280 | * responsibility as well -- the hardware seems to return out of range | ||
281 | * values when the DMA engine completes a buffer. | ||
282 | * | ||
283 | * The @regs identifier is provided by a successful call to | ||
284 | * sa1100_request_dma(). | ||
285 | **/ | ||
286 | |||
287 | dma_addr_t sa1100_get_dma_pos(dma_regs_t *regs) | ||
288 | { | ||
289 | int status; | ||
290 | |||
291 | /* | ||
292 | * We must determine whether buffer A or B is active. | ||
293 | * Two possibilities: either we are in the middle of | ||
294 | * a buffer, or the DMA controller just switched to the | ||
295 | * next toggle but the interrupt hasn't been serviced yet. | ||
296 | * The former case is straight forward. In the later case, | ||
297 | * we'll do like if DMA is just at the end of the previous | ||
298 | * toggle since all registers haven't been reset yet. | ||
299 | * This goes around the edge case and since we're always | ||
300 | * a little behind anyways it shouldn't make a big difference. | ||
301 | * If DMA has been stopped prior calling this then the | ||
302 | * position is exact. | ||
303 | */ | ||
304 | status = regs->RdDCSR; | ||
305 | if ((!(status & DCSR_BIU) && (status & DCSR_STRTA)) || | ||
306 | ( (status & DCSR_BIU) && !(status & DCSR_STRTB))) | ||
307 | return regs->DBSA; | ||
308 | else | ||
309 | return regs->DBSB; | ||
310 | } | ||
311 | |||
312 | |||
313 | /** | ||
314 | * sa1100_reset_dma - reset a DMA channel | ||
315 | * @regs: identifier for the channel to use | ||
316 | * | ||
317 | * This function resets and reconfigure the given DMA channel. This is | ||
318 | * particularly useful after a sleep/wakeup event. | ||
319 | * | ||
320 | * The @regs identifier is provided by a successful call to | ||
321 | * sa1100_request_dma(). | ||
322 | **/ | ||
323 | |||
324 | void sa1100_reset_dma(dma_regs_t *regs) | ||
325 | { | ||
326 | int i; | ||
327 | |||
328 | for (i = 0; i < SA1100_DMA_CHANNELS; i++) | ||
329 | if (regs == (dma_regs_t *)&DDAR(i)) | ||
330 | break; | ||
331 | if (i >= SA1100_DMA_CHANNELS) { | ||
332 | printk(KERN_ERR "%s: bad DMA identifier\n", __func__); | ||
333 | return; | ||
334 | } | ||
335 | |||
336 | regs->ClrDCSR = | ||
337 | (DCSR_DONEA | DCSR_DONEB | DCSR_STRTA | DCSR_STRTB | | ||
338 | DCSR_IE | DCSR_ERROR | DCSR_RUN); | ||
339 | regs->DDAR = dma_chan[i].device; | ||
340 | } | ||
341 | |||
342 | |||
343 | EXPORT_SYMBOL(sa1100_request_dma); | ||
344 | EXPORT_SYMBOL(sa1100_free_dma); | ||
345 | EXPORT_SYMBOL(sa1100_start_dma); | ||
346 | EXPORT_SYMBOL(sa1100_get_dma_pos); | ||
347 | EXPORT_SYMBOL(sa1100_reset_dma); | ||
348 | |||
diff --git a/arch/arm/mach-sa1100/generic.c b/arch/arm/mach-sa1100/generic.c index 7c1ebf4a7920..1d0f71b17a26 100644 --- a/arch/arm/mach-sa1100/generic.c +++ b/arch/arm/mach-sa1100/generic.c | |||
@@ -14,18 +14,23 @@ | |||
14 | #include <linux/kernel.h> | 14 | #include <linux/kernel.h> |
15 | #include <linux/init.h> | 15 | #include <linux/init.h> |
16 | #include <linux/delay.h> | 16 | #include <linux/delay.h> |
17 | #include <linux/dma-mapping.h> | ||
17 | #include <linux/pm.h> | 18 | #include <linux/pm.h> |
18 | #include <linux/cpufreq.h> | 19 | #include <linux/cpufreq.h> |
19 | #include <linux/ioport.h> | 20 | #include <linux/ioport.h> |
20 | #include <linux/platform_device.h> | 21 | #include <linux/platform_device.h> |
21 | 22 | ||
23 | #include <video/sa1100fb.h> | ||
24 | |||
22 | #include <asm/div64.h> | 25 | #include <asm/div64.h> |
23 | #include <mach/hardware.h> | ||
24 | #include <asm/system.h> | 26 | #include <asm/system.h> |
25 | #include <asm/mach/map.h> | 27 | #include <asm/mach/map.h> |
26 | #include <asm/mach/flash.h> | 28 | #include <asm/mach/flash.h> |
27 | #include <asm/irq.h> | 29 | #include <asm/irq.h> |
28 | 30 | ||
31 | #include <mach/hardware.h> | ||
32 | #include <mach/irqs.h> | ||
33 | |||
29 | #include "generic.h" | 34 | #include "generic.h" |
30 | 35 | ||
31 | unsigned int reset_status; | 36 | unsigned int reset_status; |
@@ -149,16 +154,8 @@ static void sa11x0_register_device(struct platform_device *dev, void *data) | |||
149 | 154 | ||
150 | 155 | ||
151 | static struct resource sa11x0udc_resources[] = { | 156 | static struct resource sa11x0udc_resources[] = { |
152 | [0] = { | 157 | [0] = DEFINE_RES_MEM(__PREG(Ser0UDCCR), SZ_64K), |
153 | .start = __PREG(Ser0UDCCR), | 158 | [1] = DEFINE_RES_IRQ(IRQ_Ser0UDC), |
154 | .end = __PREG(Ser0UDCCR) + 0xffff, | ||
155 | .flags = IORESOURCE_MEM, | ||
156 | }, | ||
157 | [1] = { | ||
158 | .start = IRQ_Ser0UDC, | ||
159 | .end = IRQ_Ser0UDC, | ||
160 | .flags = IORESOURCE_IRQ, | ||
161 | }, | ||
162 | }; | 159 | }; |
163 | 160 | ||
164 | static u64 sa11x0udc_dma_mask = 0xffffffffUL; | 161 | static u64 sa11x0udc_dma_mask = 0xffffffffUL; |
@@ -175,16 +172,8 @@ static struct platform_device sa11x0udc_device = { | |||
175 | }; | 172 | }; |
176 | 173 | ||
177 | static struct resource sa11x0uart1_resources[] = { | 174 | static struct resource sa11x0uart1_resources[] = { |
178 | [0] = { | 175 | [0] = DEFINE_RES_MEM(__PREG(Ser1UTCR0), SZ_64K), |
179 | .start = __PREG(Ser1UTCR0), | 176 | [1] = DEFINE_RES_IRQ(IRQ_Ser1UART), |
180 | .end = __PREG(Ser1UTCR0) + 0xffff, | ||
181 | .flags = IORESOURCE_MEM, | ||
182 | }, | ||
183 | [1] = { | ||
184 | .start = IRQ_Ser1UART, | ||
185 | .end = IRQ_Ser1UART, | ||
186 | .flags = IORESOURCE_IRQ, | ||
187 | }, | ||
188 | }; | 177 | }; |
189 | 178 | ||
190 | static struct platform_device sa11x0uart1_device = { | 179 | static struct platform_device sa11x0uart1_device = { |
@@ -195,16 +184,8 @@ static struct platform_device sa11x0uart1_device = { | |||
195 | }; | 184 | }; |
196 | 185 | ||
197 | static struct resource sa11x0uart3_resources[] = { | 186 | static struct resource sa11x0uart3_resources[] = { |
198 | [0] = { | 187 | [0] = DEFINE_RES_MEM(__PREG(Ser3UTCR0), SZ_64K), |
199 | .start = __PREG(Ser3UTCR0), | 188 | [1] = DEFINE_RES_IRQ(IRQ_Ser3UART), |
200 | .end = __PREG(Ser3UTCR0) + 0xffff, | ||
201 | .flags = IORESOURCE_MEM, | ||
202 | }, | ||
203 | [1] = { | ||
204 | .start = IRQ_Ser3UART, | ||
205 | .end = IRQ_Ser3UART, | ||
206 | .flags = IORESOURCE_IRQ, | ||
207 | }, | ||
208 | }; | 189 | }; |
209 | 190 | ||
210 | static struct platform_device sa11x0uart3_device = { | 191 | static struct platform_device sa11x0uart3_device = { |
@@ -215,16 +196,9 @@ static struct platform_device sa11x0uart3_device = { | |||
215 | }; | 196 | }; |
216 | 197 | ||
217 | static struct resource sa11x0mcp_resources[] = { | 198 | static struct resource sa11x0mcp_resources[] = { |
218 | [0] = { | 199 | [0] = DEFINE_RES_MEM(__PREG(Ser4MCCR0), SZ_64K), |
219 | .start = __PREG(Ser4MCCR0), | 200 | [1] = DEFINE_RES_MEM(__PREG(Ser4MCCR1), 4), |
220 | .end = __PREG(Ser4MCCR0) + 0xffff, | 201 | [2] = DEFINE_RES_IRQ(IRQ_Ser4MCP), |
221 | .flags = IORESOURCE_MEM, | ||
222 | }, | ||
223 | [1] = { | ||
224 | .start = IRQ_Ser4MCP, | ||
225 | .end = IRQ_Ser4MCP, | ||
226 | .flags = IORESOURCE_IRQ, | ||
227 | }, | ||
228 | }; | 202 | }; |
229 | 203 | ||
230 | static u64 sa11x0mcp_dma_mask = 0xffffffffUL; | 204 | static u64 sa11x0mcp_dma_mask = 0xffffffffUL; |
@@ -240,22 +214,24 @@ static struct platform_device sa11x0mcp_device = { | |||
240 | .resource = sa11x0mcp_resources, | 214 | .resource = sa11x0mcp_resources, |
241 | }; | 215 | }; |
242 | 216 | ||
217 | void __init sa11x0_ppc_configure_mcp(void) | ||
218 | { | ||
219 | /* Setup the PPC unit for the MCP */ | ||
220 | PPDR &= ~PPC_RXD4; | ||
221 | PPDR |= PPC_TXD4 | PPC_SCLK | PPC_SFRM; | ||
222 | PSDR |= PPC_RXD4; | ||
223 | PSDR &= ~(PPC_TXD4 | PPC_SCLK | PPC_SFRM); | ||
224 | PPSR &= ~(PPC_TXD4 | PPC_SCLK | PPC_SFRM); | ||
225 | } | ||
226 | |||
243 | void sa11x0_register_mcp(struct mcp_plat_data *data) | 227 | void sa11x0_register_mcp(struct mcp_plat_data *data) |
244 | { | 228 | { |
245 | sa11x0_register_device(&sa11x0mcp_device, data); | 229 | sa11x0_register_device(&sa11x0mcp_device, data); |
246 | } | 230 | } |
247 | 231 | ||
248 | static struct resource sa11x0ssp_resources[] = { | 232 | static struct resource sa11x0ssp_resources[] = { |
249 | [0] = { | 233 | [0] = DEFINE_RES_MEM(0x80070000, SZ_64K), |
250 | .start = 0x80070000, | 234 | [1] = DEFINE_RES_IRQ(IRQ_Ser4SSP), |
251 | .end = 0x8007ffff, | ||
252 | .flags = IORESOURCE_MEM, | ||
253 | }, | ||
254 | [1] = { | ||
255 | .start = IRQ_Ser4SSP, | ||
256 | .end = IRQ_Ser4SSP, | ||
257 | .flags = IORESOURCE_IRQ, | ||
258 | }, | ||
259 | }; | 235 | }; |
260 | 236 | ||
261 | static u64 sa11x0ssp_dma_mask = 0xffffffffUL; | 237 | static u64 sa11x0ssp_dma_mask = 0xffffffffUL; |
@@ -272,16 +248,8 @@ static struct platform_device sa11x0ssp_device = { | |||
272 | }; | 248 | }; |
273 | 249 | ||
274 | static struct resource sa11x0fb_resources[] = { | 250 | static struct resource sa11x0fb_resources[] = { |
275 | [0] = { | 251 | [0] = DEFINE_RES_MEM(0xb0100000, SZ_64K), |
276 | .start = 0xb0100000, | 252 | [1] = DEFINE_RES_IRQ(IRQ_LCD), |
277 | .end = 0xb010ffff, | ||
278 | .flags = IORESOURCE_MEM, | ||
279 | }, | ||
280 | [1] = { | ||
281 | .start = IRQ_LCD, | ||
282 | .end = IRQ_LCD, | ||
283 | .flags = IORESOURCE_IRQ, | ||
284 | }, | ||
285 | }; | 253 | }; |
286 | 254 | ||
287 | static struct platform_device sa11x0fb_device = { | 255 | static struct platform_device sa11x0fb_device = { |
@@ -294,6 +262,11 @@ static struct platform_device sa11x0fb_device = { | |||
294 | .resource = sa11x0fb_resources, | 262 | .resource = sa11x0fb_resources, |
295 | }; | 263 | }; |
296 | 264 | ||
265 | void sa11x0_register_lcd(struct sa1100fb_mach_info *inf) | ||
266 | { | ||
267 | sa11x0_register_device(&sa11x0fb_device, inf); | ||
268 | } | ||
269 | |||
297 | static struct platform_device sa11x0pcmcia_device = { | 270 | static struct platform_device sa11x0pcmcia_device = { |
298 | .name = "sa11x0-pcmcia", | 271 | .name = "sa11x0-pcmcia", |
299 | .id = -1, | 272 | .id = -1, |
@@ -314,23 +287,10 @@ void sa11x0_register_mtd(struct flash_platform_data *flash, | |||
314 | } | 287 | } |
315 | 288 | ||
316 | static struct resource sa11x0ir_resources[] = { | 289 | static struct resource sa11x0ir_resources[] = { |
317 | { | 290 | DEFINE_RES_MEM(__PREG(Ser2UTCR0), 0x24), |
318 | .start = __PREG(Ser2UTCR0), | 291 | DEFINE_RES_MEM(__PREG(Ser2HSCR0), 0x1c), |
319 | .end = __PREG(Ser2UTCR0) + 0x24 - 1, | 292 | DEFINE_RES_MEM(__PREG(Ser2HSCR2), 0x04), |
320 | .flags = IORESOURCE_MEM, | 293 | DEFINE_RES_IRQ(IRQ_Ser2ICP), |
321 | }, { | ||
322 | .start = __PREG(Ser2HSCR0), | ||
323 | .end = __PREG(Ser2HSCR0) + 0x1c - 1, | ||
324 | .flags = IORESOURCE_MEM, | ||
325 | }, { | ||
326 | .start = __PREG(Ser2HSCR2), | ||
327 | .end = __PREG(Ser2HSCR2) + 0x04 - 1, | ||
328 | .flags = IORESOURCE_MEM, | ||
329 | }, { | ||
330 | .start = IRQ_Ser2ICP, | ||
331 | .end = IRQ_Ser2ICP, | ||
332 | .flags = IORESOURCE_IRQ, | ||
333 | } | ||
334 | }; | 294 | }; |
335 | 295 | ||
336 | static struct platform_device sa11x0ir_device = { | 296 | static struct platform_device sa11x0ir_device = { |
@@ -358,14 +318,37 @@ static struct platform_device sa11x0rtc_device = { | |||
358 | .resource = sa1100_rtc_resources, | 318 | .resource = sa1100_rtc_resources, |
359 | }; | 319 | }; |
360 | 320 | ||
321 | static struct resource sa11x0dma_resources[] = { | ||
322 | DEFINE_RES_MEM(DMA_PHYS, DMA_SIZE), | ||
323 | DEFINE_RES_IRQ(IRQ_DMA0), | ||
324 | DEFINE_RES_IRQ(IRQ_DMA1), | ||
325 | DEFINE_RES_IRQ(IRQ_DMA2), | ||
326 | DEFINE_RES_IRQ(IRQ_DMA3), | ||
327 | DEFINE_RES_IRQ(IRQ_DMA4), | ||
328 | DEFINE_RES_IRQ(IRQ_DMA5), | ||
329 | }; | ||
330 | |||
331 | static u64 sa11x0dma_dma_mask = DMA_BIT_MASK(32); | ||
332 | |||
333 | static struct platform_device sa11x0dma_device = { | ||
334 | .name = "sa11x0-dma", | ||
335 | .id = -1, | ||
336 | .dev = { | ||
337 | .dma_mask = &sa11x0dma_dma_mask, | ||
338 | .coherent_dma_mask = 0xffffffff, | ||
339 | }, | ||
340 | .num_resources = ARRAY_SIZE(sa11x0dma_resources), | ||
341 | .resource = sa11x0dma_resources, | ||
342 | }; | ||
343 | |||
361 | static struct platform_device *sa11x0_devices[] __initdata = { | 344 | static struct platform_device *sa11x0_devices[] __initdata = { |
362 | &sa11x0udc_device, | 345 | &sa11x0udc_device, |
363 | &sa11x0uart1_device, | 346 | &sa11x0uart1_device, |
364 | &sa11x0uart3_device, | 347 | &sa11x0uart3_device, |
365 | &sa11x0ssp_device, | 348 | &sa11x0ssp_device, |
366 | &sa11x0pcmcia_device, | 349 | &sa11x0pcmcia_device, |
367 | &sa11x0fb_device, | ||
368 | &sa11x0rtc_device, | 350 | &sa11x0rtc_device, |
351 | &sa11x0dma_device, | ||
369 | }; | 352 | }; |
370 | 353 | ||
371 | static int __init sa1100_init(void) | 354 | static int __init sa1100_init(void) |
@@ -376,12 +359,6 @@ static int __init sa1100_init(void) | |||
376 | 359 | ||
377 | arch_initcall(sa1100_init); | 360 | arch_initcall(sa1100_init); |
378 | 361 | ||
379 | void (*sa1100fb_backlight_power)(int on); | ||
380 | void (*sa1100fb_lcd_power)(int on); | ||
381 | |||
382 | EXPORT_SYMBOL(sa1100fb_backlight_power); | ||
383 | EXPORT_SYMBOL(sa1100fb_lcd_power); | ||
384 | |||
385 | 362 | ||
386 | /* | 363 | /* |
387 | * Common I/O mapping: | 364 | * Common I/O mapping: |
@@ -436,7 +413,7 @@ void __init sa1100_map_io(void) | |||
436 | * the MBGNT signal false to ensure the SA1111 doesn't own the | 413 | * the MBGNT signal false to ensure the SA1111 doesn't own the |
437 | * SDRAM bus. | 414 | * SDRAM bus. |
438 | */ | 415 | */ |
439 | void __init sa1110_mb_disable(void) | 416 | void sa1110_mb_disable(void) |
440 | { | 417 | { |
441 | unsigned long flags; | 418 | unsigned long flags; |
442 | 419 | ||
@@ -455,7 +432,7 @@ void __init sa1110_mb_disable(void) | |||
455 | * If the system is going to use the SA-1111 DMA engines, set up | 432 | * If the system is going to use the SA-1111 DMA engines, set up |
456 | * the memory bus request/grant pins. | 433 | * the memory bus request/grant pins. |
457 | */ | 434 | */ |
458 | void __devinit sa1110_mb_enable(void) | 435 | void sa1110_mb_enable(void) |
459 | { | 436 | { |
460 | unsigned long flags; | 437 | unsigned long flags; |
461 | 438 | ||
diff --git a/arch/arm/mach-sa1100/generic.h b/arch/arm/mach-sa1100/generic.h index 33268cf6be36..9eb3b3cd5a63 100644 --- a/arch/arm/mach-sa1100/generic.h +++ b/arch/arm/mach-sa1100/generic.h | |||
@@ -16,9 +16,6 @@ extern void sa11x0_restart(char, const char *); | |||
16 | mi->bank[__nr].start = (__start), \ | 16 | mi->bank[__nr].start = (__start), \ |
17 | mi->bank[__nr].size = (__size) | 17 | mi->bank[__nr].size = (__size) |
18 | 18 | ||
19 | extern void (*sa1100fb_backlight_power)(int on); | ||
20 | extern void (*sa1100fb_lcd_power)(int on); | ||
21 | |||
22 | extern void sa1110_mb_enable(void); | 19 | extern void sa1110_mb_enable(void); |
23 | extern void sa1110_mb_disable(void); | 20 | extern void sa1110_mb_disable(void); |
24 | 21 | ||
@@ -39,4 +36,8 @@ struct irda_platform_data; | |||
39 | void sa11x0_register_irda(struct irda_platform_data *irda); | 36 | void sa11x0_register_irda(struct irda_platform_data *irda); |
40 | 37 | ||
41 | struct mcp_plat_data; | 38 | struct mcp_plat_data; |
39 | void sa11x0_ppc_configure_mcp(void); | ||
42 | void sa11x0_register_mcp(struct mcp_plat_data *data); | 40 | void sa11x0_register_mcp(struct mcp_plat_data *data); |
41 | |||
42 | struct sa1100fb_mach_info; | ||
43 | void sa11x0_register_lcd(struct sa1100fb_mach_info *inf); | ||
diff --git a/arch/arm/mach-sa1100/h3100.c b/arch/arm/mach-sa1100/h3100.c index 1e6b3c105ba6..b2e8d0f418e0 100644 --- a/arch/arm/mach-sa1100/h3100.c +++ b/arch/arm/mach-sa1100/h3100.c | |||
@@ -14,11 +14,14 @@ | |||
14 | #include <linux/kernel.h> | 14 | #include <linux/kernel.h> |
15 | #include <linux/gpio.h> | 15 | #include <linux/gpio.h> |
16 | 16 | ||
17 | #include <video/sa1100fb.h> | ||
18 | |||
17 | #include <asm/mach-types.h> | 19 | #include <asm/mach-types.h> |
18 | #include <asm/mach/arch.h> | 20 | #include <asm/mach/arch.h> |
19 | #include <asm/mach/irda.h> | 21 | #include <asm/mach/irda.h> |
20 | 22 | ||
21 | #include <mach/h3xxx.h> | 23 | #include <mach/h3xxx.h> |
24 | #include <mach/irqs.h> | ||
22 | 25 | ||
23 | #include "generic.h" | 26 | #include "generic.h" |
24 | 27 | ||
@@ -36,13 +39,28 @@ static void h3100_lcd_power(int enable) | |||
36 | } | 39 | } |
37 | } | 40 | } |
38 | 41 | ||
42 | static struct sa1100fb_mach_info h3100_lcd_info = { | ||
43 | .pixclock = 406977, .bpp = 4, | ||
44 | .xres = 320, .yres = 240, | ||
45 | |||
46 | .hsync_len = 26, .vsync_len = 41, | ||
47 | .left_margin = 4, .upper_margin = 0, | ||
48 | .right_margin = 4, .lower_margin = 0, | ||
49 | |||
50 | .sync = FB_SYNC_HOR_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT, | ||
51 | .cmap_greyscale = 1, | ||
52 | .cmap_inverse = 1, | ||
53 | |||
54 | .lccr0 = LCCR0_Mono | LCCR0_4PixMono | LCCR0_Sngl | LCCR0_Pas, | ||
55 | .lccr3 = LCCR3_OutEnH | LCCR3_PixRsEdg | LCCR3_ACBsDiv(2), | ||
56 | |||
57 | .lcd_power = h3100_lcd_power, | ||
58 | }; | ||
39 | 59 | ||
40 | static void __init h3100_map_io(void) | 60 | static void __init h3100_map_io(void) |
41 | { | 61 | { |
42 | h3xxx_map_io(); | 62 | h3xxx_map_io(); |
43 | 63 | ||
44 | sa1100fb_lcd_power = h3100_lcd_power; | ||
45 | |||
46 | /* Older bootldrs put GPIO2-9 in alternate mode on the | 64 | /* Older bootldrs put GPIO2-9 in alternate mode on the |
47 | assumption that they are used for video */ | 65 | assumption that they are used for video */ |
48 | GAFR &= ~0x000001fb; | 66 | GAFR &= ~0x000001fb; |
@@ -80,12 +98,15 @@ static void __init h3100_mach_init(void) | |||
80 | { | 98 | { |
81 | h3xxx_init_gpio(h3100_default_gpio, ARRAY_SIZE(h3100_default_gpio)); | 99 | h3xxx_init_gpio(h3100_default_gpio, ARRAY_SIZE(h3100_default_gpio)); |
82 | h3xxx_mach_init(); | 100 | h3xxx_mach_init(); |
101 | |||
102 | sa11x0_register_lcd(&h3100_lcd_info); | ||
83 | sa11x0_register_irda(&h3100_irda_data); | 103 | sa11x0_register_irda(&h3100_irda_data); |
84 | } | 104 | } |
85 | 105 | ||
86 | MACHINE_START(H3100, "Compaq iPAQ H3100") | 106 | MACHINE_START(H3100, "Compaq iPAQ H3100") |
87 | .atag_offset = 0x100, | 107 | .atag_offset = 0x100, |
88 | .map_io = h3100_map_io, | 108 | .map_io = h3100_map_io, |
109 | .nr_irqs = SA1100_NR_IRQS, | ||
89 | .init_irq = sa1100_init_irq, | 110 | .init_irq = sa1100_init_irq, |
90 | .timer = &sa1100_timer, | 111 | .timer = &sa1100_timer, |
91 | .init_machine = h3100_mach_init, | 112 | .init_machine = h3100_mach_init, |
diff --git a/arch/arm/mach-sa1100/h3600.c b/arch/arm/mach-sa1100/h3600.c index 6b58e7460ecf..cb6659f294fe 100644 --- a/arch/arm/mach-sa1100/h3600.c +++ b/arch/arm/mach-sa1100/h3600.c | |||
@@ -14,11 +14,14 @@ | |||
14 | #include <linux/kernel.h> | 14 | #include <linux/kernel.h> |
15 | #include <linux/gpio.h> | 15 | #include <linux/gpio.h> |
16 | 16 | ||
17 | #include <video/sa1100fb.h> | ||
18 | |||
17 | #include <asm/mach-types.h> | 19 | #include <asm/mach-types.h> |
18 | #include <asm/mach/arch.h> | 20 | #include <asm/mach/arch.h> |
19 | #include <asm/mach/irda.h> | 21 | #include <asm/mach/irda.h> |
20 | 22 | ||
21 | #include <mach/h3xxx.h> | 23 | #include <mach/h3xxx.h> |
24 | #include <mach/irqs.h> | ||
22 | 25 | ||
23 | #include "generic.h" | 26 | #include "generic.h" |
24 | 27 | ||
@@ -56,11 +59,35 @@ err2: gpio_free(H3XXX_EGPIO_LCD_ON); | |||
56 | err1: return; | 59 | err1: return; |
57 | } | 60 | } |
58 | 61 | ||
62 | static const struct sa1100fb_rgb h3600_rgb_16 = { | ||
63 | .red = { .offset = 12, .length = 4, }, | ||
64 | .green = { .offset = 7, .length = 4, }, | ||
65 | .blue = { .offset = 1, .length = 4, }, | ||
66 | .transp = { .offset = 0, .length = 0, }, | ||
67 | }; | ||
68 | |||
69 | static struct sa1100fb_mach_info h3600_lcd_info = { | ||
70 | .pixclock = 174757, .bpp = 16, | ||
71 | .xres = 320, .yres = 240, | ||
72 | |||
73 | .hsync_len = 3, .vsync_len = 3, | ||
74 | .left_margin = 12, .upper_margin = 10, | ||
75 | .right_margin = 17, .lower_margin = 1, | ||
76 | |||
77 | .cmap_static = 1, | ||
78 | |||
79 | .lccr0 = LCCR0_Color | LCCR0_Sngl | LCCR0_Act, | ||
80 | .lccr3 = LCCR3_OutEnH | LCCR3_PixRsEdg | LCCR3_ACBsDiv(2), | ||
81 | |||
82 | .rgb[RGB_16] = &h3600_rgb_16, | ||
83 | |||
84 | .lcd_power = h3600_lcd_power, | ||
85 | }; | ||
86 | |||
87 | |||
59 | static void __init h3600_map_io(void) | 88 | static void __init h3600_map_io(void) |
60 | { | 89 | { |
61 | h3xxx_map_io(); | 90 | h3xxx_map_io(); |
62 | |||
63 | sa1100fb_lcd_power = h3600_lcd_power; | ||
64 | } | 91 | } |
65 | 92 | ||
66 | /* | 93 | /* |
@@ -121,12 +148,15 @@ static void __init h3600_mach_init(void) | |||
121 | { | 148 | { |
122 | h3xxx_init_gpio(h3600_default_gpio, ARRAY_SIZE(h3600_default_gpio)); | 149 | h3xxx_init_gpio(h3600_default_gpio, ARRAY_SIZE(h3600_default_gpio)); |
123 | h3xxx_mach_init(); | 150 | h3xxx_mach_init(); |
151 | |||
152 | sa11x0_register_lcd(&h3600_lcd_info); | ||
124 | sa11x0_register_irda(&h3600_irda_data); | 153 | sa11x0_register_irda(&h3600_irda_data); |
125 | } | 154 | } |
126 | 155 | ||
127 | MACHINE_START(H3600, "Compaq iPAQ H3600") | 156 | MACHINE_START(H3600, "Compaq iPAQ H3600") |
128 | .atag_offset = 0x100, | 157 | .atag_offset = 0x100, |
129 | .map_io = h3600_map_io, | 158 | .map_io = h3600_map_io, |
159 | .nr_irqs = SA1100_NR_IRQS, | ||
130 | .init_irq = sa1100_init_irq, | 160 | .init_irq = sa1100_init_irq, |
131 | .timer = &sa1100_timer, | 161 | .timer = &sa1100_timer, |
132 | .init_machine = h3600_mach_init, | 162 | .init_machine = h3600_mach_init, |
diff --git a/arch/arm/mach-sa1100/h3xxx.c b/arch/arm/mach-sa1100/h3xxx.c index b0784c974c2d..63150e1ffe9e 100644 --- a/arch/arm/mach-sa1100/h3xxx.c +++ b/arch/arm/mach-sa1100/h3xxx.c | |||
@@ -109,11 +109,8 @@ static struct flash_platform_data h3xxx_flash_data = { | |||
109 | .nr_parts = ARRAY_SIZE(h3xxx_partitions), | 109 | .nr_parts = ARRAY_SIZE(h3xxx_partitions), |
110 | }; | 110 | }; |
111 | 111 | ||
112 | static struct resource h3xxx_flash_resource = { | 112 | static struct resource h3xxx_flash_resource = |
113 | .start = SA1100_CS0_PHYS, | 113 | DEFINE_RES_MEM(SA1100_CS0_PHYS, SZ_32M); |
114 | .end = SA1100_CS0_PHYS + SZ_32M - 1, | ||
115 | .flags = IORESOURCE_MEM, | ||
116 | }; | ||
117 | 114 | ||
118 | 115 | ||
119 | /* | 116 | /* |
@@ -186,11 +183,7 @@ static struct sa1100_port_fns h3xxx_port_fns __initdata = { | |||
186 | */ | 183 | */ |
187 | 184 | ||
188 | static struct resource egpio_resources[] = { | 185 | static struct resource egpio_resources[] = { |
189 | [0] = { | 186 | [0] = DEFINE_RES_MEM(H3600_EGPIO_PHYS, 0x4), |
190 | .start = H3600_EGPIO_PHYS, | ||
191 | .end = H3600_EGPIO_PHYS + 0x4 - 1, | ||
192 | .flags = IORESOURCE_MEM, | ||
193 | }, | ||
194 | }; | 187 | }; |
195 | 188 | ||
196 | static struct htc_egpio_chip egpio_chips[] = { | 189 | static struct htc_egpio_chip egpio_chips[] = { |
diff --git a/arch/arm/mach-sa1100/hackkit.c b/arch/arm/mach-sa1100/hackkit.c index c01bb36db940..5535475bf583 100644 --- a/arch/arm/mach-sa1100/hackkit.c +++ b/arch/arm/mach-sa1100/hackkit.c | |||
@@ -22,12 +22,10 @@ | |||
22 | #include <linux/mtd/mtd.h> | 22 | #include <linux/mtd/mtd.h> |
23 | #include <linux/mtd/partitions.h> | 23 | #include <linux/mtd/partitions.h> |
24 | 24 | ||
25 | #include <mach/hardware.h> | ||
26 | #include <asm/mach-types.h> | 25 | #include <asm/mach-types.h> |
27 | #include <asm/setup.h> | 26 | #include <asm/setup.h> |
28 | #include <asm/page.h> | 27 | #include <asm/page.h> |
29 | #include <asm/pgtable.h> | 28 | #include <asm/pgtable.h> |
30 | #include <asm/irq.h> | ||
31 | 29 | ||
32 | #include <asm/mach/arch.h> | 30 | #include <asm/mach/arch.h> |
33 | #include <asm/mach/flash.h> | 31 | #include <asm/mach/flash.h> |
@@ -35,6 +33,9 @@ | |||
35 | #include <asm/mach/irq.h> | 33 | #include <asm/mach/irq.h> |
36 | #include <asm/mach/serial_sa1100.h> | 34 | #include <asm/mach/serial_sa1100.h> |
37 | 35 | ||
36 | #include <mach/hardware.h> | ||
37 | #include <mach/irqs.h> | ||
38 | |||
38 | #include "generic.h" | 39 | #include "generic.h" |
39 | 40 | ||
40 | /********************************************************************** | 41 | /********************************************************************** |
@@ -179,11 +180,8 @@ static struct flash_platform_data hackkit_flash_data = { | |||
179 | .nr_parts = ARRAY_SIZE(hackkit_partitions), | 180 | .nr_parts = ARRAY_SIZE(hackkit_partitions), |
180 | }; | 181 | }; |
181 | 182 | ||
182 | static struct resource hackkit_flash_resource = { | 183 | static struct resource hackkit_flash_resource = |
183 | .start = SA1100_CS0_PHYS, | 184 | DEFINE_RES_MEM(SA1100_CS0_PHYS, SZ_32M); |
184 | .end = SA1100_CS0_PHYS + SZ_32M, | ||
185 | .flags = IORESOURCE_MEM, | ||
186 | }; | ||
187 | 185 | ||
188 | static void __init hackkit_init(void) | 186 | static void __init hackkit_init(void) |
189 | { | 187 | { |
@@ -197,6 +195,7 @@ static void __init hackkit_init(void) | |||
197 | MACHINE_START(HACKKIT, "HackKit Cpu Board") | 195 | MACHINE_START(HACKKIT, "HackKit Cpu Board") |
198 | .atag_offset = 0x100, | 196 | .atag_offset = 0x100, |
199 | .map_io = hackkit_map_io, | 197 | .map_io = hackkit_map_io, |
198 | .nr_irqs = SA1100_NR_IRQS, | ||
200 | .init_irq = sa1100_init_irq, | 199 | .init_irq = sa1100_init_irq, |
201 | .timer = &sa1100_timer, | 200 | .timer = &sa1100_timer, |
202 | .init_machine = hackkit_init, | 201 | .init_machine = hackkit_init, |
diff --git a/arch/arm/mach-sa1100/include/mach/SA-1100.h b/arch/arm/mach-sa1100/include/mach/SA-1100.h index bae8296f5dbf..3f2d1b60188c 100644 --- a/arch/arm/mach-sa1100/include/mach/SA-1100.h +++ b/arch/arm/mach-sa1100/include/mach/SA-1100.h | |||
@@ -1590,224 +1590,9 @@ | |||
1590 | 1590 | ||
1591 | /* | 1591 | /* |
1592 | * Direct Memory Access (DMA) control registers | 1592 | * Direct Memory Access (DMA) control registers |
1593 | * | ||
1594 | * Registers | ||
1595 | * DDAR0 Direct Memory Access (DMA) Device Address Register | ||
1596 | * channel 0 (read/write). | ||
1597 | * DCSR0 Direct Memory Access (DMA) Control and Status | ||
1598 | * Register channel 0 (read/write). | ||
1599 | * DBSA0 Direct Memory Access (DMA) Buffer Start address | ||
1600 | * register A channel 0 (read/write). | ||
1601 | * DBTA0 Direct Memory Access (DMA) Buffer Transfer count | ||
1602 | * register A channel 0 (read/write). | ||
1603 | * DBSB0 Direct Memory Access (DMA) Buffer Start address | ||
1604 | * register B channel 0 (read/write). | ||
1605 | * DBTB0 Direct Memory Access (DMA) Buffer Transfer count | ||
1606 | * register B channel 0 (read/write). | ||
1607 | * | ||
1608 | * DDAR1 Direct Memory Access (DMA) Device Address Register | ||
1609 | * channel 1 (read/write). | ||
1610 | * DCSR1 Direct Memory Access (DMA) Control and Status | ||
1611 | * Register channel 1 (read/write). | ||
1612 | * DBSA1 Direct Memory Access (DMA) Buffer Start address | ||
1613 | * register A channel 1 (read/write). | ||
1614 | * DBTA1 Direct Memory Access (DMA) Buffer Transfer count | ||
1615 | * register A channel 1 (read/write). | ||
1616 | * DBSB1 Direct Memory Access (DMA) Buffer Start address | ||
1617 | * register B channel 1 (read/write). | ||
1618 | * DBTB1 Direct Memory Access (DMA) Buffer Transfer count | ||
1619 | * register B channel 1 (read/write). | ||
1620 | * | ||
1621 | * DDAR2 Direct Memory Access (DMA) Device Address Register | ||
1622 | * channel 2 (read/write). | ||
1623 | * DCSR2 Direct Memory Access (DMA) Control and Status | ||
1624 | * Register channel 2 (read/write). | ||
1625 | * DBSA2 Direct Memory Access (DMA) Buffer Start address | ||
1626 | * register A channel 2 (read/write). | ||
1627 | * DBTA2 Direct Memory Access (DMA) Buffer Transfer count | ||
1628 | * register A channel 2 (read/write). | ||
1629 | * DBSB2 Direct Memory Access (DMA) Buffer Start address | ||
1630 | * register B channel 2 (read/write). | ||
1631 | * DBTB2 Direct Memory Access (DMA) Buffer Transfer count | ||
1632 | * register B channel 2 (read/write). | ||
1633 | * | ||
1634 | * DDAR3 Direct Memory Access (DMA) Device Address Register | ||
1635 | * channel 3 (read/write). | ||
1636 | * DCSR3 Direct Memory Access (DMA) Control and Status | ||
1637 | * Register channel 3 (read/write). | ||
1638 | * DBSA3 Direct Memory Access (DMA) Buffer Start address | ||
1639 | * register A channel 3 (read/write). | ||
1640 | * DBTA3 Direct Memory Access (DMA) Buffer Transfer count | ||
1641 | * register A channel 3 (read/write). | ||
1642 | * DBSB3 Direct Memory Access (DMA) Buffer Start address | ||
1643 | * register B channel 3 (read/write). | ||
1644 | * DBTB3 Direct Memory Access (DMA) Buffer Transfer count | ||
1645 | * register B channel 3 (read/write). | ||
1646 | * | ||
1647 | * DDAR4 Direct Memory Access (DMA) Device Address Register | ||
1648 | * channel 4 (read/write). | ||
1649 | * DCSR4 Direct Memory Access (DMA) Control and Status | ||
1650 | * Register channel 4 (read/write). | ||
1651 | * DBSA4 Direct Memory Access (DMA) Buffer Start address | ||
1652 | * register A channel 4 (read/write). | ||
1653 | * DBTA4 Direct Memory Access (DMA) Buffer Transfer count | ||
1654 | * register A channel 4 (read/write). | ||
1655 | * DBSB4 Direct Memory Access (DMA) Buffer Start address | ||
1656 | * register B channel 4 (read/write). | ||
1657 | * DBTB4 Direct Memory Access (DMA) Buffer Transfer count | ||
1658 | * register B channel 4 (read/write). | ||
1659 | * | ||
1660 | * DDAR5 Direct Memory Access (DMA) Device Address Register | ||
1661 | * channel 5 (read/write). | ||
1662 | * DCSR5 Direct Memory Access (DMA) Control and Status | ||
1663 | * Register channel 5 (read/write). | ||
1664 | * DBSA5 Direct Memory Access (DMA) Buffer Start address | ||
1665 | * register A channel 5 (read/write). | ||
1666 | * DBTA5 Direct Memory Access (DMA) Buffer Transfer count | ||
1667 | * register A channel 5 (read/write). | ||
1668 | * DBSB5 Direct Memory Access (DMA) Buffer Start address | ||
1669 | * register B channel 5 (read/write). | ||
1670 | * DBTB5 Direct Memory Access (DMA) Buffer Transfer count | ||
1671 | * register B channel 5 (read/write). | ||
1672 | */ | 1593 | */ |
1673 | 1594 | #define DMA_SIZE (6 * 0x20) | |
1674 | #define DMASp 0x00000020 /* DMA control reg. Space [byte] */ | 1595 | #define DMA_PHYS 0xb0000000 |
1675 | |||
1676 | #define DDAR(Nb) __REG(0xB0000000 + (Nb)*DMASp) /* DMA Device Address Reg. channel [0..5] */ | ||
1677 | #define SetDCSR(Nb) __REG(0xB0000004 + (Nb)*DMASp) /* Set DMA Control & Status Reg. channel [0..5] (write) */ | ||
1678 | #define ClrDCSR(Nb) __REG(0xB0000008 + (Nb)*DMASp) /* Clear DMA Control & Status Reg. channel [0..5] (write) */ | ||
1679 | #define RdDCSR(Nb) __REG(0xB000000C + (Nb)*DMASp) /* Read DMA Control & Status Reg. channel [0..5] (read) */ | ||
1680 | #define DBSA(Nb) __REG(0xB0000010 + (Nb)*DMASp) /* DMA Buffer Start address reg. A channel [0..5] */ | ||
1681 | #define DBTA(Nb) __REG(0xB0000014 + (Nb)*DMASp) /* DMA Buffer Transfer count reg. A channel [0..5] */ | ||
1682 | #define DBSB(Nb) __REG(0xB0000018 + (Nb)*DMASp) /* DMA Buffer Start address reg. B channel [0..5] */ | ||
1683 | #define DBTB(Nb) __REG(0xB000001C + (Nb)*DMASp) /* DMA Buffer Transfer count reg. B channel [0..5] */ | ||
1684 | |||
1685 | #define DDAR_RW 0x00000001 /* device data Read/Write */ | ||
1686 | #define DDAR_DevWr (DDAR_RW*0) /* Device data Write */ | ||
1687 | /* (memory -> device) */ | ||
1688 | #define DDAR_DevRd (DDAR_RW*1) /* Device data Read */ | ||
1689 | /* (device -> memory) */ | ||
1690 | #define DDAR_E 0x00000002 /* big/little Endian device */ | ||
1691 | #define DDAR_LtlEnd (DDAR_E*0) /* Little Endian device */ | ||
1692 | #define DDAR_BigEnd (DDAR_E*1) /* Big Endian device */ | ||
1693 | #define DDAR_BS 0x00000004 /* device Burst Size */ | ||
1694 | #define DDAR_Brst4 (DDAR_BS*0) /* Burst-of-4 device */ | ||
1695 | #define DDAR_Brst8 (DDAR_BS*1) /* Burst-of-8 device */ | ||
1696 | #define DDAR_DW 0x00000008 /* device Data Width */ | ||
1697 | #define DDAR_8BitDev (DDAR_DW*0) /* 8-Bit Device */ | ||
1698 | #define DDAR_16BitDev (DDAR_DW*1) /* 16-Bit Device */ | ||
1699 | #define DDAR_DS Fld (4, 4) /* Device Select */ | ||
1700 | #define DDAR_Ser0UDCTr /* Ser. port 0 UDC Transmit */ \ | ||
1701 | (0x0 << FShft (DDAR_DS)) | ||
1702 | #define DDAR_Ser0UDCRc /* Ser. port 0 UDC Receive */ \ | ||
1703 | (0x1 << FShft (DDAR_DS)) | ||
1704 | #define DDAR_Ser1SDLCTr /* Ser. port 1 SDLC Transmit */ \ | ||
1705 | (0x2 << FShft (DDAR_DS)) | ||
1706 | #define DDAR_Ser1SDLCRc /* Ser. port 1 SDLC Receive */ \ | ||
1707 | (0x3 << FShft (DDAR_DS)) | ||
1708 | #define DDAR_Ser1UARTTr /* Ser. port 1 UART Transmit */ \ | ||
1709 | (0x4 << FShft (DDAR_DS)) | ||
1710 | #define DDAR_Ser1UARTRc /* Ser. port 1 UART Receive */ \ | ||
1711 | (0x5 << FShft (DDAR_DS)) | ||
1712 | #define DDAR_Ser2ICPTr /* Ser. port 2 ICP Transmit */ \ | ||
1713 | (0x6 << FShft (DDAR_DS)) | ||
1714 | #define DDAR_Ser2ICPRc /* Ser. port 2 ICP Receive */ \ | ||
1715 | (0x7 << FShft (DDAR_DS)) | ||
1716 | #define DDAR_Ser3UARTTr /* Ser. port 3 UART Transmit */ \ | ||
1717 | (0x8 << FShft (DDAR_DS)) | ||
1718 | #define DDAR_Ser3UARTRc /* Ser. port 3 UART Receive */ \ | ||
1719 | (0x9 << FShft (DDAR_DS)) | ||
1720 | #define DDAR_Ser4MCP0Tr /* Ser. port 4 MCP 0 Transmit */ \ | ||
1721 | /* (audio) */ \ | ||
1722 | (0xA << FShft (DDAR_DS)) | ||
1723 | #define DDAR_Ser4MCP0Rc /* Ser. port 4 MCP 0 Receive */ \ | ||
1724 | /* (audio) */ \ | ||
1725 | (0xB << FShft (DDAR_DS)) | ||
1726 | #define DDAR_Ser4MCP1Tr /* Ser. port 4 MCP 1 Transmit */ \ | ||
1727 | /* (telecom) */ \ | ||
1728 | (0xC << FShft (DDAR_DS)) | ||
1729 | #define DDAR_Ser4MCP1Rc /* Ser. port 4 MCP 1 Receive */ \ | ||
1730 | /* (telecom) */ \ | ||
1731 | (0xD << FShft (DDAR_DS)) | ||
1732 | #define DDAR_Ser4SSPTr /* Ser. port 4 SSP Transmit */ \ | ||
1733 | (0xE << FShft (DDAR_DS)) | ||
1734 | #define DDAR_Ser4SSPRc /* Ser. port 4 SSP Receive */ \ | ||
1735 | (0xF << FShft (DDAR_DS)) | ||
1736 | #define DDAR_DA Fld (24, 8) /* Device Address */ | ||
1737 | #define DDAR_DevAdd(Add) /* Device Address */ \ | ||
1738 | (((Add) & 0xF0000000) | \ | ||
1739 | (((Add) & 0X003FFFFC) << (FShft (DDAR_DA) - 2))) | ||
1740 | #define DDAR_Ser0UDCWr /* Ser. port 0 UDC Write */ \ | ||
1741 | (DDAR_DevWr + DDAR_Brst8 + DDAR_8BitDev + \ | ||
1742 | DDAR_Ser0UDCTr + DDAR_DevAdd (__PREG(Ser0UDCDR))) | ||
1743 | #define DDAR_Ser0UDCRd /* Ser. port 0 UDC Read */ \ | ||
1744 | (DDAR_DevRd + DDAR_Brst8 + DDAR_8BitDev + \ | ||
1745 | DDAR_Ser0UDCRc + DDAR_DevAdd (__PREG(Ser0UDCDR))) | ||
1746 | #define DDAR_Ser1UARTWr /* Ser. port 1 UART Write */ \ | ||
1747 | (DDAR_DevWr + DDAR_Brst4 + DDAR_8BitDev + \ | ||
1748 | DDAR_Ser1UARTTr + DDAR_DevAdd (__PREG(Ser1UTDR))) | ||
1749 | #define DDAR_Ser1UARTRd /* Ser. port 1 UART Read */ \ | ||
1750 | (DDAR_DevRd + DDAR_Brst4 + DDAR_8BitDev + \ | ||
1751 | DDAR_Ser1UARTRc + DDAR_DevAdd (__PREG(Ser1UTDR))) | ||
1752 | #define DDAR_Ser1SDLCWr /* Ser. port 1 SDLC Write */ \ | ||
1753 | (DDAR_DevWr + DDAR_Brst4 + DDAR_8BitDev + \ | ||
1754 | DDAR_Ser1SDLCTr + DDAR_DevAdd (__PREG(Ser1SDDR))) | ||
1755 | #define DDAR_Ser1SDLCRd /* Ser. port 1 SDLC Read */ \ | ||
1756 | (DDAR_DevRd + DDAR_Brst4 + DDAR_8BitDev + \ | ||
1757 | DDAR_Ser1SDLCRc + DDAR_DevAdd (__PREG(Ser1SDDR))) | ||
1758 | #define DDAR_Ser2UARTWr /* Ser. port 2 UART Write */ \ | ||
1759 | (DDAR_DevWr + DDAR_Brst4 + DDAR_8BitDev + \ | ||
1760 | DDAR_Ser2ICPTr + DDAR_DevAdd (__PREG(Ser2UTDR))) | ||
1761 | #define DDAR_Ser2UARTRd /* Ser. port 2 UART Read */ \ | ||
1762 | (DDAR_DevRd + DDAR_Brst4 + DDAR_8BitDev + \ | ||
1763 | DDAR_Ser2ICPRc + DDAR_DevAdd (__PREG(Ser2UTDR))) | ||
1764 | #define DDAR_Ser2HSSPWr /* Ser. port 2 HSSP Write */ \ | ||
1765 | (DDAR_DevWr + DDAR_Brst8 + DDAR_8BitDev + \ | ||
1766 | DDAR_Ser2ICPTr + DDAR_DevAdd (__PREG(Ser2HSDR))) | ||
1767 | #define DDAR_Ser2HSSPRd /* Ser. port 2 HSSP Read */ \ | ||
1768 | (DDAR_DevRd + DDAR_Brst8 + DDAR_8BitDev + \ | ||
1769 | DDAR_Ser2ICPRc + DDAR_DevAdd (__PREG(Ser2HSDR))) | ||
1770 | #define DDAR_Ser3UARTWr /* Ser. port 3 UART Write */ \ | ||
1771 | (DDAR_DevWr + DDAR_Brst4 + DDAR_8BitDev + \ | ||
1772 | DDAR_Ser3UARTTr + DDAR_DevAdd (__PREG(Ser3UTDR))) | ||
1773 | #define DDAR_Ser3UARTRd /* Ser. port 3 UART Read */ \ | ||
1774 | (DDAR_DevRd + DDAR_Brst4 + DDAR_8BitDev + \ | ||
1775 | DDAR_Ser3UARTRc + DDAR_DevAdd (__PREG(Ser3UTDR))) | ||
1776 | #define DDAR_Ser4MCP0Wr /* Ser. port 4 MCP 0 Write (audio) */ \ | ||
1777 | (DDAR_DevWr + DDAR_Brst4 + DDAR_16BitDev + \ | ||
1778 | DDAR_Ser4MCP0Tr + DDAR_DevAdd (__PREG(Ser4MCDR0))) | ||
1779 | #define DDAR_Ser4MCP0Rd /* Ser. port 4 MCP 0 Read (audio) */ \ | ||
1780 | (DDAR_DevRd + DDAR_Brst4 + DDAR_16BitDev + \ | ||
1781 | DDAR_Ser4MCP0Rc + DDAR_DevAdd (__PREG(Ser4MCDR0))) | ||
1782 | #define DDAR_Ser4MCP1Wr /* Ser. port 4 MCP 1 Write */ \ | ||
1783 | /* (telecom) */ \ | ||
1784 | (DDAR_DevWr + DDAR_Brst4 + DDAR_16BitDev + \ | ||
1785 | DDAR_Ser4MCP1Tr + DDAR_DevAdd (__PREG(Ser4MCDR1))) | ||
1786 | #define DDAR_Ser4MCP1Rd /* Ser. port 4 MCP 1 Read */ \ | ||
1787 | /* (telecom) */ \ | ||
1788 | (DDAR_DevRd + DDAR_Brst4 + DDAR_16BitDev + \ | ||
1789 | DDAR_Ser4MCP1Rc + DDAR_DevAdd (__PREG(Ser4MCDR1))) | ||
1790 | #define DDAR_Ser4SSPWr /* Ser. port 4 SSP Write (16 bits) */ \ | ||
1791 | (DDAR_DevWr + DDAR_Brst4 + DDAR_16BitDev + \ | ||
1792 | DDAR_Ser4SSPTr + DDAR_DevAdd (__PREG(Ser4SSDR))) | ||
1793 | #define DDAR_Ser4SSPRd /* Ser. port 4 SSP Read (16 bits) */ \ | ||
1794 | (DDAR_DevRd + DDAR_Brst4 + DDAR_16BitDev + \ | ||
1795 | DDAR_Ser4SSPRc + DDAR_DevAdd (__PREG(Ser4SSDR))) | ||
1796 | |||
1797 | #define DCSR_RUN 0x00000001 /* DMA running */ | ||
1798 | #define DCSR_IE 0x00000002 /* DMA Interrupt Enable */ | ||
1799 | #define DCSR_ERROR 0x00000004 /* DMA ERROR */ | ||
1800 | #define DCSR_DONEA 0x00000008 /* DONE DMA transfer buffer A */ | ||
1801 | #define DCSR_STRTA 0x00000010 /* STaRTed DMA transfer buffer A */ | ||
1802 | #define DCSR_DONEB 0x00000020 /* DONE DMA transfer buffer B */ | ||
1803 | #define DCSR_STRTB 0x00000040 /* STaRTed DMA transfer buffer B */ | ||
1804 | #define DCSR_BIU 0x00000080 /* DMA Buffer In Use */ | ||
1805 | #define DCSR_BufA (DCSR_BIU*0) /* DMA Buffer A in use */ | ||
1806 | #define DCSR_BufB (DCSR_BIU*1) /* DMA Buffer B in use */ | ||
1807 | |||
1808 | #define DBT_TC Fld (13, 0) /* Transfer Count */ | ||
1809 | #define DBTA_TCA DBT_TC /* Transfer Count buffer A */ | ||
1810 | #define DBTB_TCB DBT_TC /* Transfer Count buffer B */ | ||
1811 | 1596 | ||
1812 | 1597 | ||
1813 | /* | 1598 | /* |
@@ -1903,16 +1688,6 @@ | |||
1903 | #define LCD_Int100_0A 0xF /* LCD Intensity = 100.0% = 1 */ | 1688 | #define LCD_Int100_0A 0xF /* LCD Intensity = 100.0% = 1 */ |
1904 | /* (Alternative) */ | 1689 | /* (Alternative) */ |
1905 | 1690 | ||
1906 | #define LCCR0 __REG(0xB0100000) /* LCD Control Reg. 0 */ | ||
1907 | #define LCSR __REG(0xB0100004) /* LCD Status Reg. */ | ||
1908 | #define DBAR1 __REG(0xB0100010) /* LCD DMA Base Address Reg. channel 1 */ | ||
1909 | #define DCAR1 __REG(0xB0100014) /* LCD DMA Current Address Reg. channel 1 */ | ||
1910 | #define DBAR2 __REG(0xB0100018) /* LCD DMA Base Address Reg. channel 2 */ | ||
1911 | #define DCAR2 __REG(0xB010001C) /* LCD DMA Current Address Reg. channel 2 */ | ||
1912 | #define LCCR1 __REG(0xB0100020) /* LCD Control Reg. 1 */ | ||
1913 | #define LCCR2 __REG(0xB0100024) /* LCD Control Reg. 2 */ | ||
1914 | #define LCCR3 __REG(0xB0100028) /* LCD Control Reg. 3 */ | ||
1915 | |||
1916 | #define LCCR0_LEN 0x00000001 /* LCD ENable */ | 1691 | #define LCCR0_LEN 0x00000001 /* LCD ENable */ |
1917 | #define LCCR0_CMS 0x00000002 /* Color/Monochrome display Select */ | 1692 | #define LCCR0_CMS 0x00000002 /* Color/Monochrome display Select */ |
1918 | #define LCCR0_Color (LCCR0_CMS*0) /* Color display */ | 1693 | #define LCCR0_Color (LCCR0_CMS*0) /* Color display */ |
diff --git a/arch/arm/mach-sa1100/include/mach/dma.h b/arch/arm/mach-sa1100/include/mach/dma.h deleted file mode 100644 index dda1b351310d..000000000000 --- a/arch/arm/mach-sa1100/include/mach/dma.h +++ /dev/null | |||
@@ -1,117 +0,0 @@ | |||
1 | /* | ||
2 | * arch/arm/mach-sa1100/include/mach/dma.h | ||
3 | * | ||
4 | * Generic SA1100 DMA support | ||
5 | * | ||
6 | * Copyright (C) 2000 Nicolas Pitre | ||
7 | * | ||
8 | */ | ||
9 | |||
10 | #ifndef __ASM_ARCH_DMA_H | ||
11 | #define __ASM_ARCH_DMA_H | ||
12 | |||
13 | #include "hardware.h" | ||
14 | |||
15 | |||
16 | /* | ||
17 | * The SA1100 has six internal DMA channels. | ||
18 | */ | ||
19 | #define SA1100_DMA_CHANNELS 6 | ||
20 | |||
21 | /* | ||
22 | * Maximum physical DMA buffer size | ||
23 | */ | ||
24 | #define MAX_DMA_SIZE 0x1fff | ||
25 | #define CUT_DMA_SIZE 0x1000 | ||
26 | |||
27 | /* | ||
28 | * All possible SA1100 devices a DMA channel can be attached to. | ||
29 | */ | ||
30 | typedef enum { | ||
31 | DMA_Ser0UDCWr = DDAR_Ser0UDCWr, /* Ser. port 0 UDC Write */ | ||
32 | DMA_Ser0UDCRd = DDAR_Ser0UDCRd, /* Ser. port 0 UDC Read */ | ||
33 | DMA_Ser1UARTWr = DDAR_Ser1UARTWr, /* Ser. port 1 UART Write */ | ||
34 | DMA_Ser1UARTRd = DDAR_Ser1UARTRd, /* Ser. port 1 UART Read */ | ||
35 | DMA_Ser1SDLCWr = DDAR_Ser1SDLCWr, /* Ser. port 1 SDLC Write */ | ||
36 | DMA_Ser1SDLCRd = DDAR_Ser1SDLCRd, /* Ser. port 1 SDLC Read */ | ||
37 | DMA_Ser2UARTWr = DDAR_Ser2UARTWr, /* Ser. port 2 UART Write */ | ||
38 | DMA_Ser2UARTRd = DDAR_Ser2UARTRd, /* Ser. port 2 UART Read */ | ||
39 | DMA_Ser2HSSPWr = DDAR_Ser2HSSPWr, /* Ser. port 2 HSSP Write */ | ||
40 | DMA_Ser2HSSPRd = DDAR_Ser2HSSPRd, /* Ser. port 2 HSSP Read */ | ||
41 | DMA_Ser3UARTWr = DDAR_Ser3UARTWr, /* Ser. port 3 UART Write */ | ||
42 | DMA_Ser3UARTRd = DDAR_Ser3UARTRd, /* Ser. port 3 UART Read */ | ||
43 | DMA_Ser4MCP0Wr = DDAR_Ser4MCP0Wr, /* Ser. port 4 MCP 0 Write (audio) */ | ||
44 | DMA_Ser4MCP0Rd = DDAR_Ser4MCP0Rd, /* Ser. port 4 MCP 0 Read (audio) */ | ||
45 | DMA_Ser4MCP1Wr = DDAR_Ser4MCP1Wr, /* Ser. port 4 MCP 1 Write */ | ||
46 | DMA_Ser4MCP1Rd = DDAR_Ser4MCP1Rd, /* Ser. port 4 MCP 1 Read */ | ||
47 | DMA_Ser4SSPWr = DDAR_Ser4SSPWr, /* Ser. port 4 SSP Write (16 bits) */ | ||
48 | DMA_Ser4SSPRd = DDAR_Ser4SSPRd /* Ser. port 4 SSP Read (16 bits) */ | ||
49 | } dma_device_t; | ||
50 | |||
51 | typedef struct { | ||
52 | volatile u_long DDAR; | ||
53 | volatile u_long SetDCSR; | ||
54 | volatile u_long ClrDCSR; | ||
55 | volatile u_long RdDCSR; | ||
56 | volatile dma_addr_t DBSA; | ||
57 | volatile u_long DBTA; | ||
58 | volatile dma_addr_t DBSB; | ||
59 | volatile u_long DBTB; | ||
60 | } dma_regs_t; | ||
61 | |||
62 | typedef void (*dma_callback_t)(void *data); | ||
63 | |||
64 | /* | ||
65 | * DMA function prototypes | ||
66 | */ | ||
67 | |||
68 | extern int sa1100_request_dma( dma_device_t device, const char *device_id, | ||
69 | dma_callback_t callback, void *data, | ||
70 | dma_regs_t **regs ); | ||
71 | extern void sa1100_free_dma( dma_regs_t *regs ); | ||
72 | extern int sa1100_start_dma( dma_regs_t *regs, dma_addr_t dma_ptr, u_int size ); | ||
73 | extern dma_addr_t sa1100_get_dma_pos(dma_regs_t *regs); | ||
74 | extern void sa1100_reset_dma(dma_regs_t *regs); | ||
75 | |||
76 | /** | ||
77 | * sa1100_stop_dma - stop DMA in progress | ||
78 | * @regs: identifier for the channel to use | ||
79 | * | ||
80 | * This stops DMA without clearing buffer pointers. Unlike | ||
81 | * sa1100_clear_dma() this allows subsequent use of sa1100_resume_dma() | ||
82 | * or sa1100_get_dma_pos(). | ||
83 | * | ||
84 | * The @regs identifier is provided by a successful call to | ||
85 | * sa1100_request_dma(). | ||
86 | **/ | ||
87 | |||
88 | #define sa1100_stop_dma(regs) ((regs)->ClrDCSR = DCSR_IE|DCSR_RUN) | ||
89 | |||
90 | /** | ||
91 | * sa1100_resume_dma - resume DMA on a stopped channel | ||
92 | * @regs: identifier for the channel to use | ||
93 | * | ||
94 | * This resumes DMA on a channel previously stopped with | ||
95 | * sa1100_stop_dma(). | ||
96 | * | ||
97 | * The @regs identifier is provided by a successful call to | ||
98 | * sa1100_request_dma(). | ||
99 | **/ | ||
100 | |||
101 | #define sa1100_resume_dma(regs) ((regs)->SetDCSR = DCSR_IE|DCSR_RUN) | ||
102 | |||
103 | /** | ||
104 | * sa1100_clear_dma - clear DMA pointers | ||
105 | * @regs: identifier for the channel to use | ||
106 | * | ||
107 | * This clear any DMA state so the DMA engine is ready to restart | ||
108 | * with new buffers through sa1100_start_dma(). Any buffers in flight | ||
109 | * are discarded. | ||
110 | * | ||
111 | * The @regs identifier is provided by a successful call to | ||
112 | * sa1100_request_dma(). | ||
113 | **/ | ||
114 | |||
115 | #define sa1100_clear_dma(regs) ((regs)->ClrDCSR = DCSR_IE|DCSR_RUN|DCSR_STRTA|DCSR_STRTB) | ||
116 | |||
117 | #endif /* _ASM_ARCH_DMA_H */ | ||
diff --git a/arch/arm/mach-sa1100/include/mach/irqs.h b/arch/arm/mach-sa1100/include/mach/irqs.h index d18f21abef80..3790298b7142 100644 --- a/arch/arm/mach-sa1100/include/mach/irqs.h +++ b/arch/arm/mach-sa1100/include/mach/irqs.h | |||
@@ -71,22 +71,19 @@ | |||
71 | /* | 71 | /* |
72 | * Figure out the MAX IRQ number. | 72 | * Figure out the MAX IRQ number. |
73 | * | 73 | * |
74 | * If we have an SA1111, the max IRQ is S1_BVD1_STSCHG+1. | 74 | * Neponset, SA1111 and UCB1x00 are sparse IRQ aware, so can dynamically |
75 | * If we have an LoCoMo, the max IRQ is IRQ_BOARD_START + 4 | 75 | * allocate their IRQs above NR_IRQS. |
76 | * Otherwise, we have the standard IRQs only. | 76 | * |
77 | * LoCoMo has 4 additional IRQs, but is not sparse IRQ aware, and so has | ||
78 | * to be included in the NR_IRQS calculation. | ||
77 | */ | 79 | */ |
78 | #ifdef CONFIG_SA1111 | 80 | #ifdef CONFIG_SHARP_LOCOMO |
79 | #define NR_IRQS (IRQ_BOARD_END + 55) | 81 | #define NR_IRQS_LOCOMO 4 |
80 | #elif defined(CONFIG_SHARP_LOCOMO) | ||
81 | #define NR_IRQS (IRQ_BOARD_START + 4) | ||
82 | #else | 82 | #else |
83 | #define NR_IRQS (IRQ_BOARD_START) | 83 | #define NR_IRQS_LOCOMO 0 |
84 | #endif | 84 | #endif |
85 | 85 | ||
86 | /* | 86 | #ifndef NR_IRQS |
87 | * Board specific IRQs. Define them here. | 87 | #define NR_IRQS (IRQ_BOARD_START + NR_IRQS_LOCOMO) |
88 | * Do not surround them with ifdefs. | 88 | #endif |
89 | */ | 89 | #define SA1100_NR_IRQS (IRQ_BOARD_START + NR_IRQS_LOCOMO) |
90 | #define IRQ_NEPONSET_SMC9196 (IRQ_BOARD_START + 0) | ||
91 | #define IRQ_NEPONSET_USAR (IRQ_BOARD_START + 1) | ||
92 | #define IRQ_NEPONSET_SA1111 (IRQ_BOARD_START + 2) | ||
diff --git a/arch/arm/mach-sa1100/include/mach/mcp.h b/arch/arm/mach-sa1100/include/mach/mcp.h index ed1a331508a7..4b2860ae3828 100644 --- a/arch/arm/mach-sa1100/include/mach/mcp.h +++ b/arch/arm/mach-sa1100/include/mach/mcp.h | |||
@@ -16,7 +16,7 @@ struct mcp_plat_data { | |||
16 | u32 mccr0; | 16 | u32 mccr0; |
17 | u32 mccr1; | 17 | u32 mccr1; |
18 | unsigned int sclk_rate; | 18 | unsigned int sclk_rate; |
19 | int gpio_base; | 19 | void *codec_pdata; |
20 | }; | 20 | }; |
21 | 21 | ||
22 | #endif | 22 | #endif |
diff --git a/arch/arm/mach-sa1100/include/mach/neponset.h b/arch/arm/mach-sa1100/include/mach/neponset.h index ffe2bc45eed0..5516a52a329d 100644 --- a/arch/arm/mach-sa1100/include/mach/neponset.h +++ b/arch/arm/mach-sa1100/include/mach/neponset.h | |||
@@ -15,54 +15,6 @@ | |||
15 | /* | 15 | /* |
16 | * Neponset definitions: | 16 | * Neponset definitions: |
17 | */ | 17 | */ |
18 | |||
19 | #define NEPONSET_CPLD_BASE (0x10000000) | ||
20 | #define Nep_p2v( x ) ((x) - NEPONSET_CPLD_BASE + 0xf3000000) | ||
21 | #define Nep_v2p( x ) ((x) - 0xf3000000 + NEPONSET_CPLD_BASE) | ||
22 | |||
23 | #define _IRR 0x10000024 /* Interrupt Reason Register */ | ||
24 | #define _AUD_CTL 0x100000c0 /* Audio controls (RW) */ | ||
25 | #define _MDM_CTL_0 0x100000b0 /* Modem control 0 (RW) */ | ||
26 | #define _MDM_CTL_1 0x100000b4 /* Modem control 1 (RW) */ | ||
27 | #define _NCR_0 0x100000a0 /* Control Register (RW) */ | ||
28 | #define _KP_X_OUT 0x10000090 /* Keypad row write (RW) */ | ||
29 | #define _KP_Y_IN 0x10000080 /* Keypad column read (RO) */ | ||
30 | #define _SWPK 0x10000020 /* Switch pack (RO) */ | ||
31 | #define _WHOAMI 0x10000000 /* System ID Register (RO) */ | ||
32 | |||
33 | #define _LEDS 0x10000010 /* LEDs [31:0] (WO) */ | ||
34 | |||
35 | #define IRR (*((volatile u_char *) Nep_p2v(_IRR))) | ||
36 | #define AUD_CTL (*((volatile u_char *) Nep_p2v(_AUD_CTL))) | ||
37 | #define MDM_CTL_0 (*((volatile u_char *) Nep_p2v(_MDM_CTL_0))) | ||
38 | #define MDM_CTL_1 (*((volatile u_char *) Nep_p2v(_MDM_CTL_1))) | ||
39 | #define NCR_0 (*((volatile u_char *) Nep_p2v(_NCR_0))) | ||
40 | #define KP_X_OUT (*((volatile u_char *) Nep_p2v(_KP_X_OUT))) | ||
41 | #define KP_Y_IN (*((volatile u_char *) Nep_p2v(_KP_Y_IN))) | ||
42 | #define SWPK (*((volatile u_char *) Nep_p2v(_SWPK))) | ||
43 | #define WHOAMI (*((volatile u_char *) Nep_p2v(_WHOAMI))) | ||
44 | |||
45 | #define LEDS (*((volatile Word *) Nep_p2v(_LEDS))) | ||
46 | |||
47 | #define IRR_ETHERNET (1<<0) | ||
48 | #define IRR_USAR (1<<1) | ||
49 | #define IRR_SA1111 (1<<2) | ||
50 | |||
51 | #define AUD_SEL_1341 (1<<0) | ||
52 | #define AUD_MUTE_1341 (1<<1) | ||
53 | |||
54 | #define MDM_CTL0_RTS1 (1 << 0) | ||
55 | #define MDM_CTL0_DTR1 (1 << 1) | ||
56 | #define MDM_CTL0_RTS2 (1 << 2) | ||
57 | #define MDM_CTL0_DTR2 (1 << 3) | ||
58 | |||
59 | #define MDM_CTL1_CTS1 (1 << 0) | ||
60 | #define MDM_CTL1_DSR1 (1 << 1) | ||
61 | #define MDM_CTL1_DCD1 (1 << 2) | ||
62 | #define MDM_CTL1_CTS2 (1 << 3) | ||
63 | #define MDM_CTL1_DSR2 (1 << 4) | ||
64 | #define MDM_CTL1_DCD2 (1 << 5) | ||
65 | |||
66 | #define NCR_GP01_OFF (1<<0) | 18 | #define NCR_GP01_OFF (1<<0) |
67 | #define NCR_TP_PWR_EN (1<<1) | 19 | #define NCR_TP_PWR_EN (1<<1) |
68 | #define NCR_MS_PWR_EN (1<<2) | 20 | #define NCR_MS_PWR_EN (1<<2) |
@@ -71,4 +23,8 @@ | |||
71 | #define NCR_A0VPP (1<<5) | 23 | #define NCR_A0VPP (1<<5) |
72 | #define NCR_A1VPP (1<<6) | 24 | #define NCR_A1VPP (1<<6) |
73 | 25 | ||
26 | void neponset_ncr_frob(unsigned int, unsigned int); | ||
27 | #define neponset_ncr_set(v) neponset_ncr_frob(0, v) | ||
28 | #define neponset_ncr_clear(v) neponset_ncr_frob(v, 0) | ||
29 | |||
74 | #endif | 30 | #endif |
diff --git a/arch/arm/mach-sa1100/include/mach/shannon.h b/arch/arm/mach-sa1100/include/mach/shannon.h index 019f857a7938..fff39e02b496 100644 --- a/arch/arm/mach-sa1100/include/mach/shannon.h +++ b/arch/arm/mach-sa1100/include/mach/shannon.h | |||
@@ -21,7 +21,7 @@ | |||
21 | #define SHANNON_GPIO_U3_RTS GPIO_GPIO (19) /* ?? */ | 21 | #define SHANNON_GPIO_U3_RTS GPIO_GPIO (19) /* ?? */ |
22 | #define SHANNON_GPIO_U3_CTS GPIO_GPIO (20) /* ?? */ | 22 | #define SHANNON_GPIO_U3_CTS GPIO_GPIO (20) /* ?? */ |
23 | #define SHANNON_GPIO_SENSE_12V GPIO_GPIO (21) /* Input, 12v flash unprotect detected */ | 23 | #define SHANNON_GPIO_SENSE_12V GPIO_GPIO (21) /* Input, 12v flash unprotect detected */ |
24 | #define SHANNON_GPIO_DISP_EN GPIO_GPIO (22) /* out */ | 24 | #define SHANNON_GPIO_DISP_EN 22 /* out */ |
25 | /* XXX GPIO 23 unaccounted for */ | 25 | /* XXX GPIO 23 unaccounted for */ |
26 | #define SHANNON_GPIO_EJECT_0 24 /* in */ | 26 | #define SHANNON_GPIO_EJECT_0 24 /* in */ |
27 | #define SHANNON_GPIO_EJECT_1 25 /* in */ | 27 | #define SHANNON_GPIO_EJECT_1 25 /* in */ |
diff --git a/arch/arm/mach-sa1100/irq.c b/arch/arm/mach-sa1100/irq.c index dfbf824a69fa..516ccc25d7fd 100644 --- a/arch/arm/mach-sa1100/irq.c +++ b/arch/arm/mach-sa1100/irq.c | |||
@@ -17,6 +17,7 @@ | |||
17 | #include <linux/syscore_ops.h> | 17 | #include <linux/syscore_ops.h> |
18 | 18 | ||
19 | #include <mach/hardware.h> | 19 | #include <mach/hardware.h> |
20 | #include <mach/irqs.h> | ||
20 | #include <asm/mach/irq.h> | 21 | #include <asm/mach/irq.h> |
21 | 22 | ||
22 | #include "generic.h" | 23 | #include "generic.h" |
@@ -221,11 +222,8 @@ static struct irq_chip sa1100_normal_chip = { | |||
221 | .irq_set_wake = sa1100_set_wake, | 222 | .irq_set_wake = sa1100_set_wake, |
222 | }; | 223 | }; |
223 | 224 | ||
224 | static struct resource irq_resource = { | 225 | static struct resource irq_resource = |
225 | .name = "irqs", | 226 | DEFINE_RES_MEM_NAMED(0x90050000, SZ_64K, "irqs"); |
226 | .start = 0x90050000, | ||
227 | .end = 0x9005ffff, | ||
228 | }; | ||
229 | 227 | ||
230 | static struct sa1100irq_state { | 228 | static struct sa1100irq_state { |
231 | unsigned int saved; | 229 | unsigned int saved; |
diff --git a/arch/arm/mach-sa1100/jornada720.c b/arch/arm/mach-sa1100/jornada720.c index ee121d6f0480..ca7a7e834720 100644 --- a/arch/arm/mach-sa1100/jornada720.c +++ b/arch/arm/mach-sa1100/jornada720.c | |||
@@ -23,9 +23,7 @@ | |||
23 | #include <linux/mtd/partitions.h> | 23 | #include <linux/mtd/partitions.h> |
24 | #include <video/s1d13xxxfb.h> | 24 | #include <video/s1d13xxxfb.h> |
25 | 25 | ||
26 | #include <mach/hardware.h> | ||
27 | #include <asm/hardware/sa1111.h> | 26 | #include <asm/hardware/sa1111.h> |
28 | #include <asm/irq.h> | ||
29 | #include <asm/page.h> | 27 | #include <asm/page.h> |
30 | #include <asm/mach-types.h> | 28 | #include <asm/mach-types.h> |
31 | #include <asm/setup.h> | 29 | #include <asm/setup.h> |
@@ -34,6 +32,9 @@ | |||
34 | #include <asm/mach/map.h> | 32 | #include <asm/mach/map.h> |
35 | #include <asm/mach/serial_sa1100.h> | 33 | #include <asm/mach/serial_sa1100.h> |
36 | 34 | ||
35 | #include <mach/hardware.h> | ||
36 | #include <mach/irqs.h> | ||
37 | |||
37 | #include "generic.h" | 38 | #include "generic.h" |
38 | 39 | ||
39 | /* | 40 | /* |
@@ -46,7 +47,7 @@ | |||
46 | 47 | ||
47 | /* memory space (line 52 of HP's doc) */ | 48 | /* memory space (line 52 of HP's doc) */ |
48 | #define SA1111REGSTART 0x40000000 | 49 | #define SA1111REGSTART 0x40000000 |
49 | #define SA1111REGLEN 0x00001fff | 50 | #define SA1111REGLEN 0x00002000 |
50 | #define EPSONREGSTART 0x48000000 | 51 | #define EPSONREGSTART 0x48000000 |
51 | #define EPSONREGLEN 0x00100000 | 52 | #define EPSONREGLEN 0x00100000 |
52 | #define EPSONFBSTART 0x48200000 | 53 | #define EPSONFBSTART 0x48200000 |
@@ -174,16 +175,8 @@ static struct s1d13xxxfb_pdata s1d13xxxfb_data = { | |||
174 | }; | 175 | }; |
175 | 176 | ||
176 | static struct resource s1d13xxxfb_resources[] = { | 177 | static struct resource s1d13xxxfb_resources[] = { |
177 | [0] = { | 178 | [0] = DEFINE_RES_MEM(EPSONFBSTART, EPSONFBLEN), |
178 | .start = EPSONFBSTART, | 179 | [1] = DEFINE_RES_MEM(EPSONREGSTART, EPSONREGLEN), |
179 | .end = EPSONFBSTART + EPSONFBLEN, | ||
180 | .flags = IORESOURCE_MEM, | ||
181 | }, | ||
182 | [1] = { | ||
183 | .start = EPSONREGSTART, | ||
184 | .end = EPSONREGSTART + EPSONREGLEN, | ||
185 | .flags = IORESOURCE_MEM, | ||
186 | } | ||
187 | }; | 180 | }; |
188 | 181 | ||
189 | static struct platform_device s1d13xxxfb_device = { | 182 | static struct platform_device s1d13xxxfb_device = { |
@@ -197,20 +190,12 @@ static struct platform_device s1d13xxxfb_device = { | |||
197 | }; | 190 | }; |
198 | 191 | ||
199 | static struct resource sa1111_resources[] = { | 192 | static struct resource sa1111_resources[] = { |
200 | [0] = { | 193 | [0] = DEFINE_RES_MEM(SA1111REGSTART, SA1111REGLEN), |
201 | .start = SA1111REGSTART, | 194 | [1] = DEFINE_RES_IRQ(IRQ_GPIO1), |
202 | .end = SA1111REGSTART + SA1111REGLEN, | ||
203 | .flags = IORESOURCE_MEM, | ||
204 | }, | ||
205 | [1] = { | ||
206 | .start = IRQ_GPIO1, | ||
207 | .end = IRQ_GPIO1, | ||
208 | .flags = IORESOURCE_IRQ, | ||
209 | }, | ||
210 | }; | 195 | }; |
211 | 196 | ||
212 | static struct sa1111_platform_data sa1111_info = { | 197 | static struct sa1111_platform_data sa1111_info = { |
213 | .irq_base = IRQ_BOARD_END, | 198 | .disable_devs = SA1111_DEVID_PS2_MSE, |
214 | }; | 199 | }; |
215 | 200 | ||
216 | static u64 sa1111_dmamask = 0xffffffffUL; | 201 | static u64 sa1111_dmamask = 0xffffffffUL; |
@@ -284,11 +269,6 @@ static struct map_desc jornada720_io_desc[] __initdata = { | |||
284 | .pfn = __phys_to_pfn(EPSONFBSTART), | 269 | .pfn = __phys_to_pfn(EPSONFBSTART), |
285 | .length = EPSONFBLEN, | 270 | .length = EPSONFBLEN, |
286 | .type = MT_DEVICE | 271 | .type = MT_DEVICE |
287 | }, { /* SA-1111 */ | ||
288 | .virtual = 0xf4000000, | ||
289 | .pfn = __phys_to_pfn(SA1111REGSTART), | ||
290 | .length = SA1111REGLEN, | ||
291 | .type = MT_DEVICE | ||
292 | } | 272 | } |
293 | }; | 273 | }; |
294 | 274 | ||
@@ -352,11 +332,8 @@ static struct flash_platform_data jornada720_flash_data = { | |||
352 | .nr_parts = ARRAY_SIZE(jornada720_partitions), | 332 | .nr_parts = ARRAY_SIZE(jornada720_partitions), |
353 | }; | 333 | }; |
354 | 334 | ||
355 | static struct resource jornada720_flash_resource = { | 335 | static struct resource jornada720_flash_resource = |
356 | .start = SA1100_CS0_PHYS, | 336 | DEFINE_RES_MEM(SA1100_CS0_PHYS, SZ_32M); |
357 | .end = SA1100_CS0_PHYS + SZ_32M - 1, | ||
358 | .flags = IORESOURCE_MEM, | ||
359 | }; | ||
360 | 337 | ||
361 | static void __init jornada720_mach_init(void) | 338 | static void __init jornada720_mach_init(void) |
362 | { | 339 | { |
@@ -367,6 +344,7 @@ MACHINE_START(JORNADA720, "HP Jornada 720") | |||
367 | /* Maintainer: Kristoffer Ericson <Kristoffer.Ericson@gmail.com> */ | 344 | /* Maintainer: Kristoffer Ericson <Kristoffer.Ericson@gmail.com> */ |
368 | .atag_offset = 0x100, | 345 | .atag_offset = 0x100, |
369 | .map_io = jornada720_map_io, | 346 | .map_io = jornada720_map_io, |
347 | .nr_irqs = SA1100_NR_IRQS, | ||
370 | .init_irq = sa1100_init_irq, | 348 | .init_irq = sa1100_init_irq, |
371 | .timer = &sa1100_timer, | 349 | .timer = &sa1100_timer, |
372 | .init_machine = jornada720_mach_init, | 350 | .init_machine = jornada720_mach_init, |
diff --git a/arch/arm/mach-sa1100/lart.c b/arch/arm/mach-sa1100/lart.c index af4e2761f3db..eb6534e0b0d0 100644 --- a/arch/arm/mach-sa1100/lart.c +++ b/arch/arm/mach-sa1100/lart.c | |||
@@ -6,6 +6,8 @@ | |||
6 | #include <linux/kernel.h> | 6 | #include <linux/kernel.h> |
7 | #include <linux/tty.h> | 7 | #include <linux/tty.h> |
8 | 8 | ||
9 | #include <video/sa1100fb.h> | ||
10 | |||
9 | #include <mach/hardware.h> | 11 | #include <mach/hardware.h> |
10 | #include <asm/setup.h> | 12 | #include <asm/setup.h> |
11 | #include <asm/mach-types.h> | 13 | #include <asm/mach-types.h> |
@@ -15,6 +17,7 @@ | |||
15 | #include <asm/mach/map.h> | 17 | #include <asm/mach/map.h> |
16 | #include <asm/mach/serial_sa1100.h> | 18 | #include <asm/mach/serial_sa1100.h> |
17 | #include <mach/mcp.h> | 19 | #include <mach/mcp.h> |
20 | #include <mach/irqs.h> | ||
18 | 21 | ||
19 | #include "generic.h" | 22 | #include "generic.h" |
20 | 23 | ||
@@ -26,8 +29,86 @@ static struct mcp_plat_data lart_mcp_data = { | |||
26 | .sclk_rate = 11981000, | 29 | .sclk_rate = 11981000, |
27 | }; | 30 | }; |
28 | 31 | ||
32 | #ifdef LART_GREY_LCD | ||
33 | static struct sa1100fb_mach_info lart_grey_info = { | ||
34 | .pixclock = 150000, .bpp = 4, | ||
35 | .xres = 320, .yres = 240, | ||
36 | |||
37 | .hsync_len = 1, .vsync_len = 1, | ||
38 | .left_margin = 4, .upper_margin = 0, | ||
39 | .right_margin = 2, .lower_margin = 0, | ||
40 | |||
41 | .cmap_greyscale = 1, | ||
42 | .sync = FB_SYNC_HOR_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT, | ||
43 | |||
44 | .lccr0 = LCCR0_Mono | LCCR0_Sngl | LCCR0_Pas | LCCR0_4PixMono, | ||
45 | .lccr3 = LCCR3_OutEnH | LCCR3_PixRsEdg | LCCR3_ACBsDiv(512), | ||
46 | }; | ||
47 | #endif | ||
48 | #ifdef LART_COLOR_LCD | ||
49 | static struct sa1100fb_mach_info lart_color_info = { | ||
50 | .pixclock = 150000, .bpp = 16, | ||
51 | .xres = 320, .yres = 240, | ||
52 | |||
53 | .hsync_len = 2, .vsync_len = 3, | ||
54 | .left_margin = 69, .upper_margin = 14, | ||
55 | .right_margin = 8, .lower_margin = 4, | ||
56 | |||
57 | .lccr0 = LCCR0_Color | LCCR0_Sngl | LCCR0_Act, | ||
58 | .lccr3 = LCCR3_OutEnH | LCCR3_PixFlEdg | LCCR3_ACBsDiv(512), | ||
59 | }; | ||
60 | #endif | ||
61 | #ifdef LART_VIDEO_OUT | ||
62 | static struct sa1100fb_mach_info lart_video_info = { | ||
63 | .pixclock = 39721, .bpp = 16, | ||
64 | .xres = 640, .yres = 480, | ||
65 | |||
66 | .hsync_len = 95, .vsync_len = 2, | ||
67 | .left_margin = 40, .upper_margin = 32, | ||
68 | .right_margin = 24, .lower_margin = 11, | ||
69 | |||
70 | .sync = FB_SYNC_HOR_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT, | ||
71 | |||
72 | .lccr0 = LCCR0_Color | LCCR0_Sngl | LCCR0_Act, | ||
73 | .lccr3 = LCCR3_OutEnL | LCCR3_PixFlEdg | LCCR3_ACBsDiv(512), | ||
74 | }; | ||
75 | #endif | ||
76 | |||
77 | #ifdef LART_KIT01_LCD | ||
78 | static struct sa1100fb_mach_info lart_kit01_info = { | ||
79 | .pixclock = 63291, .bpp = 16, | ||
80 | .xres = 640, .yres = 480, | ||
81 | |||
82 | .hsync_len = 64, .vsync_len = 3, | ||
83 | .left_margin = 122, .upper_margin = 45, | ||
84 | .right_margin = 10, .lower_margin = 10, | ||
85 | |||
86 | .lccr0 = LCCR0_Color | LCCR0_Sngl | LCCR0_Act, | ||
87 | .lccr3 = LCCR3_OutEnH | LCCR3_PixFlEdg | ||
88 | }; | ||
89 | #endif | ||
90 | |||
29 | static void __init lart_init(void) | 91 | static void __init lart_init(void) |
30 | { | 92 | { |
93 | struct sa1100fb_mach_info *inf = NULL; | ||
94 | |||
95 | #ifdef LART_GREY_LCD | ||
96 | inf = &lart_grey_info; | ||
97 | #endif | ||
98 | #ifdef LART_COLOR_LCD | ||
99 | inf = &lart_color_info; | ||
100 | #endif | ||
101 | #ifdef LART_VIDEO_OUT | ||
102 | inf = &lart_video_info; | ||
103 | #endif | ||
104 | #ifdef LART_KIT01_LCD | ||
105 | inf = &lart_kit01_info; | ||
106 | #endif | ||
107 | |||
108 | if (inf) | ||
109 | sa11x0_register_lcd(inf); | ||
110 | |||
111 | sa11x0_ppc_configure_mcp(); | ||
31 | sa11x0_register_mcp(&lart_mcp_data); | 112 | sa11x0_register_mcp(&lart_mcp_data); |
32 | } | 113 | } |
33 | 114 | ||
@@ -63,6 +144,7 @@ static void __init lart_map_io(void) | |||
63 | MACHINE_START(LART, "LART") | 144 | MACHINE_START(LART, "LART") |
64 | .atag_offset = 0x100, | 145 | .atag_offset = 0x100, |
65 | .map_io = lart_map_io, | 146 | .map_io = lart_map_io, |
147 | .nr_irqs = SA1100_NR_IRQS, | ||
66 | .init_irq = sa1100_init_irq, | 148 | .init_irq = sa1100_init_irq, |
67 | .init_machine = lart_init, | 149 | .init_machine = lart_init, |
68 | .timer = &sa1100_timer, | 150 | .timer = &sa1100_timer, |
diff --git a/arch/arm/mach-sa1100/nanoengine.c b/arch/arm/mach-sa1100/nanoengine.c index 85f6ee672225..8f6446b9f025 100644 --- a/arch/arm/mach-sa1100/nanoengine.c +++ b/arch/arm/mach-sa1100/nanoengine.c | |||
@@ -28,6 +28,7 @@ | |||
28 | 28 | ||
29 | #include <mach/hardware.h> | 29 | #include <mach/hardware.h> |
30 | #include <mach/nanoengine.h> | 30 | #include <mach/nanoengine.h> |
31 | #include <mach/irqs.h> | ||
31 | 32 | ||
32 | #include "generic.h" | 33 | #include "generic.h" |
33 | 34 | ||
@@ -58,15 +59,8 @@ static struct flash_platform_data nanoengine_flash_data = { | |||
58 | }; | 59 | }; |
59 | 60 | ||
60 | static struct resource nanoengine_flash_resources[] = { | 61 | static struct resource nanoengine_flash_resources[] = { |
61 | { | 62 | DEFINE_RES_MEM(SA1100_CS0_PHYS, SZ_32M), |
62 | .start = SA1100_CS0_PHYS, | 63 | DEFINE_RES_MEM(SA1100_CS1_PHYS, SZ_32M), |
63 | .end = SA1100_CS0_PHYS + SZ_32M - 1, | ||
64 | .flags = IORESOURCE_MEM, | ||
65 | }, { | ||
66 | .start = SA1100_CS1_PHYS, | ||
67 | .end = SA1100_CS1_PHYS + SZ_32M - 1, | ||
68 | .flags = IORESOURCE_MEM, | ||
69 | } | ||
70 | }; | 64 | }; |
71 | 65 | ||
72 | static struct map_desc nanoengine_io_desc[] __initdata = { | 66 | static struct map_desc nanoengine_io_desc[] __initdata = { |
@@ -114,6 +108,7 @@ static void __init nanoengine_init(void) | |||
114 | MACHINE_START(NANOENGINE, "BSE nanoEngine") | 108 | MACHINE_START(NANOENGINE, "BSE nanoEngine") |
115 | .atag_offset = 0x100, | 109 | .atag_offset = 0x100, |
116 | .map_io = nanoengine_map_io, | 110 | .map_io = nanoengine_map_io, |
111 | .nr_irqs = SA1100_NR_IRQS, | ||
117 | .init_irq = sa1100_init_irq, | 112 | .init_irq = sa1100_init_irq, |
118 | .timer = &sa1100_timer, | 113 | .timer = &sa1100_timer, |
119 | .init_machine = nanoengine_init, | 114 | .init_machine = nanoengine_init, |
diff --git a/arch/arm/mach-sa1100/neponset.c b/arch/arm/mach-sa1100/neponset.c index b4fa53a1427e..6c58f01b358a 100644 --- a/arch/arm/mach-sa1100/neponset.c +++ b/arch/arm/mach-sa1100/neponset.c | |||
@@ -1,89 +1,104 @@ | |||
1 | /* | 1 | /* |
2 | * linux/arch/arm/mach-sa1100/neponset.c | 2 | * linux/arch/arm/mach-sa1100/neponset.c |
3 | * | ||
4 | */ | 3 | */ |
5 | #include <linux/kernel.h> | 4 | #include <linux/err.h> |
6 | #include <linux/init.h> | 5 | #include <linux/init.h> |
7 | #include <linux/tty.h> | ||
8 | #include <linux/ioport.h> | 6 | #include <linux/ioport.h> |
9 | #include <linux/serial_core.h> | 7 | #include <linux/irq.h> |
8 | #include <linux/kernel.h> | ||
9 | #include <linux/module.h> | ||
10 | #include <linux/platform_device.h> | 10 | #include <linux/platform_device.h> |
11 | #include <linux/pm.h> | ||
12 | #include <linux/serial_core.h> | ||
13 | #include <linux/slab.h> | ||
11 | 14 | ||
12 | #include <mach/hardware.h> | ||
13 | #include <asm/mach-types.h> | 15 | #include <asm/mach-types.h> |
14 | #include <asm/irq.h> | ||
15 | #include <asm/mach/map.h> | 16 | #include <asm/mach/map.h> |
16 | #include <asm/mach/irq.h> | ||
17 | #include <asm/mach/serial_sa1100.h> | 17 | #include <asm/mach/serial_sa1100.h> |
18 | #include <mach/assabet.h> | ||
19 | #include <mach/neponset.h> | ||
20 | #include <asm/hardware/sa1111.h> | 18 | #include <asm/hardware/sa1111.h> |
21 | #include <asm/sizes.h> | 19 | #include <asm/sizes.h> |
22 | 20 | ||
23 | /* | 21 | #include <mach/hardware.h> |
24 | * Install handler for Neponset IRQ. Note that we have to loop here | 22 | #include <mach/assabet.h> |
25 | * since the ETHERNET and USAR IRQs are level based, and we need to | 23 | #include <mach/neponset.h> |
26 | * ensure that the IRQ signal is deasserted before returning. This | 24 | #include <mach/irqs.h> |
27 | * is rather unfortunate. | 25 | |
28 | */ | 26 | #define NEP_IRQ_SMC91X 0 |
29 | static void | 27 | #define NEP_IRQ_USAR 1 |
30 | neponset_irq_handler(unsigned int irq, struct irq_desc *desc) | 28 | #define NEP_IRQ_SA1111 2 |
31 | { | 29 | #define NEP_IRQ_NR 3 |
32 | unsigned int irr; | 30 | |
33 | 31 | #define WHOAMI 0x00 | |
34 | while (1) { | 32 | #define LEDS 0x10 |
35 | /* | 33 | #define SWPK 0x20 |
36 | * Acknowledge the parent IRQ. | 34 | #define IRR 0x24 |
37 | */ | 35 | #define KP_Y_IN 0x80 |
38 | desc->irq_data.chip->irq_ack(&desc->irq_data); | 36 | #define KP_X_OUT 0x90 |
39 | 37 | #define NCR_0 0xa0 | |
40 | /* | 38 | #define MDM_CTL_0 0xb0 |
41 | * Read the interrupt reason register. Let's have all | 39 | #define MDM_CTL_1 0xb4 |
42 | * active IRQ bits high. Note: there is a typo in the | 40 | #define AUD_CTL 0xc0 |
43 | * Neponset user's guide for the SA1111 IRR level. | 41 | |
44 | */ | 42 | #define IRR_ETHERNET (1 << 0) |
45 | irr = IRR ^ (IRR_ETHERNET | IRR_USAR); | 43 | #define IRR_USAR (1 << 1) |
46 | 44 | #define IRR_SA1111 (1 << 2) | |
47 | if ((irr & (IRR_ETHERNET | IRR_USAR | IRR_SA1111)) == 0) | 45 | |
48 | break; | 46 | #define MDM_CTL0_RTS1 (1 << 0) |
49 | 47 | #define MDM_CTL0_DTR1 (1 << 1) | |
50 | /* | 48 | #define MDM_CTL0_RTS2 (1 << 2) |
51 | * Since there is no individual mask, we have to | 49 | #define MDM_CTL0_DTR2 (1 << 3) |
52 | * mask the parent IRQ. This is safe, since we'll | 50 | |
53 | * recheck the register for any pending IRQs. | 51 | #define MDM_CTL1_CTS1 (1 << 0) |
54 | */ | 52 | #define MDM_CTL1_DSR1 (1 << 1) |
55 | if (irr & (IRR_ETHERNET | IRR_USAR)) { | 53 | #define MDM_CTL1_DCD1 (1 << 2) |
56 | desc->irq_data.chip->irq_mask(&desc->irq_data); | 54 | #define MDM_CTL1_CTS2 (1 << 3) |
57 | 55 | #define MDM_CTL1_DSR2 (1 << 4) | |
58 | /* | 56 | #define MDM_CTL1_DCD2 (1 << 5) |
59 | * Ack the interrupt now to prevent re-entering | 57 | |
60 | * this neponset handler. Again, this is safe | 58 | #define AUD_SEL_1341 (1 << 0) |
61 | * since we'll check the IRR register prior to | 59 | #define AUD_MUTE_1341 (1 << 1) |
62 | * leaving. | ||
63 | */ | ||
64 | desc->irq_data.chip->irq_ack(&desc->irq_data); | ||
65 | 60 | ||
66 | if (irr & IRR_ETHERNET) { | 61 | extern void sa1110_mb_disable(void); |
67 | generic_handle_irq(IRQ_NEPONSET_SMC9196); | ||
68 | } | ||
69 | 62 | ||
70 | if (irr & IRR_USAR) { | 63 | struct neponset_drvdata { |
71 | generic_handle_irq(IRQ_NEPONSET_USAR); | 64 | void __iomem *base; |
72 | } | 65 | struct platform_device *sa1111; |
66 | struct platform_device *smc91x; | ||
67 | unsigned irq_base; | ||
68 | #ifdef CONFIG_PM_SLEEP | ||
69 | u32 ncr0; | ||
70 | u32 mdm_ctl_0; | ||
71 | #endif | ||
72 | }; | ||
73 | 73 | ||
74 | desc->irq_data.chip->irq_unmask(&desc->irq_data); | 74 | static void __iomem *nep_base; |
75 | } | ||
76 | 75 | ||
77 | if (irr & IRR_SA1111) { | 76 | void neponset_ncr_frob(unsigned int mask, unsigned int val) |
78 | generic_handle_irq(IRQ_NEPONSET_SA1111); | 77 | { |
79 | } | 78 | void __iomem *base = nep_base; |
79 | |||
80 | if (base) { | ||
81 | unsigned long flags; | ||
82 | unsigned v; | ||
83 | |||
84 | local_irq_save(flags); | ||
85 | v = readb_relaxed(base + NCR_0); | ||
86 | writeb_relaxed((v & ~mask) | val, base + NCR_0); | ||
87 | local_irq_restore(flags); | ||
88 | } else { | ||
89 | WARN(1, "nep_base unset\n"); | ||
80 | } | 90 | } |
81 | } | 91 | } |
82 | 92 | ||
83 | static void neponset_set_mctrl(struct uart_port *port, u_int mctrl) | 93 | static void neponset_set_mctrl(struct uart_port *port, u_int mctrl) |
84 | { | 94 | { |
85 | u_int mdm_ctl0 = MDM_CTL_0; | 95 | void __iomem *base = nep_base; |
96 | u_int mdm_ctl0; | ||
86 | 97 | ||
98 | if (!base) | ||
99 | return; | ||
100 | |||
101 | mdm_ctl0 = readb_relaxed(base + MDM_CTL_0); | ||
87 | if (port->mapbase == _Ser1UTCR0) { | 102 | if (port->mapbase == _Ser1UTCR0) { |
88 | if (mctrl & TIOCM_RTS) | 103 | if (mctrl & TIOCM_RTS) |
89 | mdm_ctl0 &= ~MDM_CTL0_RTS2; | 104 | mdm_ctl0 &= ~MDM_CTL0_RTS2; |
@@ -106,14 +121,19 @@ static void neponset_set_mctrl(struct uart_port *port, u_int mctrl) | |||
106 | mdm_ctl0 |= MDM_CTL0_DTR1; | 121 | mdm_ctl0 |= MDM_CTL0_DTR1; |
107 | } | 122 | } |
108 | 123 | ||
109 | MDM_CTL_0 = mdm_ctl0; | 124 | writeb_relaxed(mdm_ctl0, base + MDM_CTL_0); |
110 | } | 125 | } |
111 | 126 | ||
112 | static u_int neponset_get_mctrl(struct uart_port *port) | 127 | static u_int neponset_get_mctrl(struct uart_port *port) |
113 | { | 128 | { |
129 | void __iomem *base = nep_base; | ||
114 | u_int ret = TIOCM_CD | TIOCM_CTS | TIOCM_DSR; | 130 | u_int ret = TIOCM_CD | TIOCM_CTS | TIOCM_DSR; |
115 | u_int mdm_ctl1 = MDM_CTL_1; | 131 | u_int mdm_ctl1; |
132 | |||
133 | if (!base) | ||
134 | return ret; | ||
116 | 135 | ||
136 | mdm_ctl1 = readb_relaxed(base + MDM_CTL_1); | ||
117 | if (port->mapbase == _Ser1UTCR0) { | 137 | if (port->mapbase == _Ser1UTCR0) { |
118 | if (mdm_ctl1 & MDM_CTL1_DCD2) | 138 | if (mdm_ctl1 & MDM_CTL1_DCD2) |
119 | ret &= ~TIOCM_CD; | 139 | ret &= ~TIOCM_CD; |
@@ -138,209 +158,278 @@ static struct sa1100_port_fns neponset_port_fns __devinitdata = { | |||
138 | .get_mctrl = neponset_get_mctrl, | 158 | .get_mctrl = neponset_get_mctrl, |
139 | }; | 159 | }; |
140 | 160 | ||
141 | static int __devinit neponset_probe(struct platform_device *dev) | 161 | /* |
162 | * Install handler for Neponset IRQ. Note that we have to loop here | ||
163 | * since the ETHERNET and USAR IRQs are level based, and we need to | ||
164 | * ensure that the IRQ signal is deasserted before returning. This | ||
165 | * is rather unfortunate. | ||
166 | */ | ||
167 | static void neponset_irq_handler(unsigned int irq, struct irq_desc *desc) | ||
142 | { | 168 | { |
143 | sa1100_register_uart_fns(&neponset_port_fns); | 169 | struct neponset_drvdata *d = irq_desc_get_handler_data(desc); |
170 | unsigned int irr; | ||
144 | 171 | ||
145 | /* | 172 | while (1) { |
146 | * Install handler for GPIO25. | 173 | /* |
147 | */ | 174 | * Acknowledge the parent IRQ. |
148 | irq_set_irq_type(IRQ_GPIO25, IRQ_TYPE_EDGE_RISING); | 175 | */ |
149 | irq_set_chained_handler(IRQ_GPIO25, neponset_irq_handler); | 176 | desc->irq_data.chip->irq_ack(&desc->irq_data); |
150 | 177 | ||
151 | /* | 178 | /* |
152 | * We would set IRQ_GPIO25 to be a wake-up IRQ, but | 179 | * Read the interrupt reason register. Let's have all |
153 | * unfortunately something on the Neponset activates | 180 | * active IRQ bits high. Note: there is a typo in the |
154 | * this IRQ on sleep (ethernet?) | 181 | * Neponset user's guide for the SA1111 IRR level. |
155 | */ | 182 | */ |
156 | #if 0 | 183 | irr = readb_relaxed(d->base + IRR); |
157 | enable_irq_wake(IRQ_GPIO25); | 184 | irr ^= IRR_ETHERNET | IRR_USAR; |
158 | #endif | ||
159 | 185 | ||
160 | /* | 186 | if ((irr & (IRR_ETHERNET | IRR_USAR | IRR_SA1111)) == 0) |
161 | * Setup other Neponset IRQs. SA1111 will be done by the | 187 | break; |
162 | * generic SA1111 code. | ||
163 | */ | ||
164 | irq_set_handler(IRQ_NEPONSET_SMC9196, handle_simple_irq); | ||
165 | set_irq_flags(IRQ_NEPONSET_SMC9196, IRQF_VALID | IRQF_PROBE); | ||
166 | irq_set_handler(IRQ_NEPONSET_USAR, handle_simple_irq); | ||
167 | set_irq_flags(IRQ_NEPONSET_USAR, IRQF_VALID | IRQF_PROBE); | ||
168 | 188 | ||
169 | /* | 189 | /* |
170 | * Disable GPIO 0/1 drivers so the buttons work on the module. | 190 | * Since there is no individual mask, we have to |
171 | */ | 191 | * mask the parent IRQ. This is safe, since we'll |
172 | NCR_0 = NCR_GP01_OFF; | 192 | * recheck the register for any pending IRQs. |
193 | */ | ||
194 | if (irr & (IRR_ETHERNET | IRR_USAR)) { | ||
195 | desc->irq_data.chip->irq_mask(&desc->irq_data); | ||
173 | 196 | ||
174 | return 0; | 197 | /* |
175 | } | 198 | * Ack the interrupt now to prevent re-entering |
199 | * this neponset handler. Again, this is safe | ||
200 | * since we'll check the IRR register prior to | ||
201 | * leaving. | ||
202 | */ | ||
203 | desc->irq_data.chip->irq_ack(&desc->irq_data); | ||
176 | 204 | ||
177 | #ifdef CONFIG_PM | 205 | if (irr & IRR_ETHERNET) |
206 | generic_handle_irq(d->irq_base + NEP_IRQ_SMC91X); | ||
178 | 207 | ||
179 | /* | 208 | if (irr & IRR_USAR) |
180 | * LDM power management. | 209 | generic_handle_irq(d->irq_base + NEP_IRQ_USAR); |
181 | */ | ||
182 | static unsigned int neponset_saved_state; | ||
183 | 210 | ||
184 | static int neponset_suspend(struct platform_device *dev, pm_message_t state) | 211 | desc->irq_data.chip->irq_unmask(&desc->irq_data); |
185 | { | 212 | } |
186 | /* | ||
187 | * Save state. | ||
188 | */ | ||
189 | neponset_saved_state = NCR_0; | ||
190 | 213 | ||
191 | return 0; | 214 | if (irr & IRR_SA1111) |
215 | generic_handle_irq(d->irq_base + NEP_IRQ_SA1111); | ||
216 | } | ||
192 | } | 217 | } |
193 | 218 | ||
194 | static int neponset_resume(struct platform_device *dev) | 219 | /* Yes, we really do not have any kind of masking or unmasking */ |
220 | static void nochip_noop(struct irq_data *irq) | ||
195 | { | 221 | { |
196 | NCR_0 = neponset_saved_state; | ||
197 | |||
198 | return 0; | ||
199 | } | 222 | } |
200 | 223 | ||
201 | #else | 224 | static struct irq_chip nochip = { |
202 | #define neponset_suspend NULL | 225 | .name = "neponset", |
203 | #define neponset_resume NULL | 226 | .irq_ack = nochip_noop, |
204 | #endif | 227 | .irq_mask = nochip_noop, |
205 | 228 | .irq_unmask = nochip_noop, | |
206 | static struct platform_driver neponset_device_driver = { | ||
207 | .probe = neponset_probe, | ||
208 | .suspend = neponset_suspend, | ||
209 | .resume = neponset_resume, | ||
210 | .driver = { | ||
211 | .name = "neponset", | ||
212 | }, | ||
213 | }; | ||
214 | |||
215 | static struct resource neponset_resources[] = { | ||
216 | [0] = { | ||
217 | .start = 0x10000000, | ||
218 | .end = 0x17ffffff, | ||
219 | .flags = IORESOURCE_MEM, | ||
220 | }, | ||
221 | }; | ||
222 | |||
223 | static struct platform_device neponset_device = { | ||
224 | .name = "neponset", | ||
225 | .id = 0, | ||
226 | .num_resources = ARRAY_SIZE(neponset_resources), | ||
227 | .resource = neponset_resources, | ||
228 | }; | ||
229 | |||
230 | static struct resource sa1111_resources[] = { | ||
231 | [0] = { | ||
232 | .start = 0x40000000, | ||
233 | .end = 0x40001fff, | ||
234 | .flags = IORESOURCE_MEM, | ||
235 | }, | ||
236 | [1] = { | ||
237 | .start = IRQ_NEPONSET_SA1111, | ||
238 | .end = IRQ_NEPONSET_SA1111, | ||
239 | .flags = IORESOURCE_IRQ, | ||
240 | }, | ||
241 | }; | 229 | }; |
242 | 230 | ||
243 | static struct sa1111_platform_data sa1111_info = { | 231 | static struct sa1111_platform_data sa1111_info = { |
244 | .irq_base = IRQ_BOARD_END, | 232 | .disable_devs = SA1111_DEVID_PS2_MSE, |
245 | }; | 233 | }; |
246 | 234 | ||
247 | static u64 sa1111_dmamask = 0xffffffffUL; | 235 | static int __devinit neponset_probe(struct platform_device *dev) |
236 | { | ||
237 | struct neponset_drvdata *d; | ||
238 | struct resource *nep_res, *sa1111_res, *smc91x_res; | ||
239 | struct resource sa1111_resources[] = { | ||
240 | DEFINE_RES_MEM(0x40000000, SZ_8K), | ||
241 | { .flags = IORESOURCE_IRQ }, | ||
242 | }; | ||
243 | struct platform_device_info sa1111_devinfo = { | ||
244 | .parent = &dev->dev, | ||
245 | .name = "sa1111", | ||
246 | .id = 0, | ||
247 | .res = sa1111_resources, | ||
248 | .num_res = ARRAY_SIZE(sa1111_resources), | ||
249 | .data = &sa1111_info, | ||
250 | .size_data = sizeof(sa1111_info), | ||
251 | .dma_mask = 0xffffffffUL, | ||
252 | }; | ||
253 | struct resource smc91x_resources[] = { | ||
254 | DEFINE_RES_MEM_NAMED(SA1100_CS3_PHYS, | ||
255 | 0x02000000, "smc91x-regs"), | ||
256 | DEFINE_RES_MEM_NAMED(SA1100_CS3_PHYS + 0x02000000, | ||
257 | 0x02000000, "smc91x-attrib"), | ||
258 | { .flags = IORESOURCE_IRQ }, | ||
259 | }; | ||
260 | struct platform_device_info smc91x_devinfo = { | ||
261 | .parent = &dev->dev, | ||
262 | .name = "smc91x", | ||
263 | .id = 0, | ||
264 | .res = smc91x_resources, | ||
265 | .num_res = ARRAY_SIZE(smc91x_resources), | ||
266 | }; | ||
267 | int ret, irq; | ||
268 | |||
269 | if (nep_base) | ||
270 | return -EBUSY; | ||
271 | |||
272 | irq = ret = platform_get_irq(dev, 0); | ||
273 | if (ret < 0) | ||
274 | goto err_alloc; | ||
275 | |||
276 | nep_res = platform_get_resource(dev, IORESOURCE_MEM, 0); | ||
277 | smc91x_res = platform_get_resource(dev, IORESOURCE_MEM, 1); | ||
278 | sa1111_res = platform_get_resource(dev, IORESOURCE_MEM, 2); | ||
279 | if (!nep_res || !smc91x_res || !sa1111_res) { | ||
280 | ret = -ENXIO; | ||
281 | goto err_alloc; | ||
282 | } | ||
248 | 283 | ||
249 | static struct platform_device sa1111_device = { | 284 | d = kzalloc(sizeof(*d), GFP_KERNEL); |
250 | .name = "sa1111", | 285 | if (!d) { |
251 | .id = 0, | 286 | ret = -ENOMEM; |
252 | .dev = { | 287 | goto err_alloc; |
253 | .dma_mask = &sa1111_dmamask, | 288 | } |
254 | .coherent_dma_mask = 0xffffffff, | ||
255 | .platform_data = &sa1111_info, | ||
256 | }, | ||
257 | .num_resources = ARRAY_SIZE(sa1111_resources), | ||
258 | .resource = sa1111_resources, | ||
259 | }; | ||
260 | 289 | ||
261 | static struct resource smc91x_resources[] = { | 290 | d->base = ioremap(nep_res->start, SZ_4K); |
262 | [0] = { | 291 | if (!d->base) { |
263 | .name = "smc91x-regs", | 292 | ret = -ENOMEM; |
264 | .start = SA1100_CS3_PHYS, | 293 | goto err_ioremap; |
265 | .end = SA1100_CS3_PHYS + 0x01ffffff, | 294 | } |
266 | .flags = IORESOURCE_MEM, | ||
267 | }, | ||
268 | [1] = { | ||
269 | .start = IRQ_NEPONSET_SMC9196, | ||
270 | .end = IRQ_NEPONSET_SMC9196, | ||
271 | .flags = IORESOURCE_IRQ, | ||
272 | }, | ||
273 | [2] = { | ||
274 | .name = "smc91x-attrib", | ||
275 | .start = SA1100_CS3_PHYS + 0x02000000, | ||
276 | .end = SA1100_CS3_PHYS + 0x03ffffff, | ||
277 | .flags = IORESOURCE_MEM, | ||
278 | }, | ||
279 | }; | ||
280 | 295 | ||
281 | static struct platform_device smc91x_device = { | 296 | if (readb_relaxed(d->base + WHOAMI) != 0x11) { |
282 | .name = "smc91x", | 297 | dev_warn(&dev->dev, "Neponset board detected, but wrong ID: %02x\n", |
283 | .id = 0, | 298 | readb_relaxed(d->base + WHOAMI)); |
284 | .num_resources = ARRAY_SIZE(smc91x_resources), | 299 | ret = -ENODEV; |
285 | .resource = smc91x_resources, | 300 | goto err_id; |
286 | }; | 301 | } |
287 | 302 | ||
288 | static struct platform_device *devices[] __initdata = { | 303 | ret = irq_alloc_descs(-1, IRQ_BOARD_START, NEP_IRQ_NR, -1); |
289 | &neponset_device, | 304 | if (ret <= 0) { |
290 | &sa1111_device, | 305 | dev_err(&dev->dev, "unable to allocate %u irqs: %d\n", |
291 | &smc91x_device, | 306 | NEP_IRQ_NR, ret); |
292 | }; | 307 | if (ret == 0) |
308 | ret = -ENOMEM; | ||
309 | goto err_irq_alloc; | ||
310 | } | ||
293 | 311 | ||
294 | extern void sa1110_mb_disable(void); | 312 | d->irq_base = ret; |
295 | 313 | ||
296 | static int __init neponset_init(void) | 314 | irq_set_chip_and_handler(d->irq_base + NEP_IRQ_SMC91X, &nochip, |
297 | { | 315 | handle_simple_irq); |
298 | platform_driver_register(&neponset_device_driver); | 316 | set_irq_flags(d->irq_base + NEP_IRQ_SMC91X, IRQF_VALID | IRQF_PROBE); |
317 | irq_set_chip_and_handler(d->irq_base + NEP_IRQ_USAR, &nochip, | ||
318 | handle_simple_irq); | ||
319 | set_irq_flags(d->irq_base + NEP_IRQ_USAR, IRQF_VALID | IRQF_PROBE); | ||
320 | irq_set_chip(d->irq_base + NEP_IRQ_SA1111, &nochip); | ||
299 | 321 | ||
300 | /* | 322 | irq_set_irq_type(irq, IRQ_TYPE_EDGE_RISING); |
301 | * The Neponset is only present on the Assabet machine type. | 323 | irq_set_handler_data(irq, d); |
302 | */ | 324 | irq_set_chained_handler(irq, neponset_irq_handler); |
303 | if (!machine_is_assabet()) | ||
304 | return -ENODEV; | ||
305 | 325 | ||
306 | /* | 326 | /* |
307 | * Ensure that the memory bus request/grant signals are setup, | 327 | * We would set IRQ_GPIO25 to be a wake-up IRQ, but unfortunately |
308 | * and the grant is held in its inactive state, whether or not | 328 | * something on the Neponset activates this IRQ on sleep (eth?) |
309 | * we actually have a Neponset attached. | ||
310 | */ | 329 | */ |
330 | #if 0 | ||
331 | enable_irq_wake(irq); | ||
332 | #endif | ||
333 | |||
334 | dev_info(&dev->dev, "Neponset daughter board, providing IRQ%u-%u\n", | ||
335 | d->irq_base, d->irq_base + NEP_IRQ_NR - 1); | ||
336 | nep_base = d->base; | ||
337 | |||
338 | sa1100_register_uart_fns(&neponset_port_fns); | ||
339 | |||
340 | /* Ensure that the memory bus request/grant signals are setup */ | ||
311 | sa1110_mb_disable(); | 341 | sa1110_mb_disable(); |
312 | 342 | ||
313 | if (!machine_has_neponset()) { | 343 | /* Disable GPIO 0/1 drivers so the buttons work on the Assabet */ |
314 | printk(KERN_DEBUG "Neponset expansion board not present\n"); | 344 | writeb_relaxed(NCR_GP01_OFF, d->base + NCR_0); |
315 | return -ENODEV; | ||
316 | } | ||
317 | 345 | ||
318 | if (WHOAMI != 0x11) { | 346 | sa1111_resources[0].parent = sa1111_res; |
319 | printk(KERN_WARNING "Neponset board detected, but " | 347 | sa1111_resources[1].start = d->irq_base + NEP_IRQ_SA1111; |
320 | "wrong ID: %02x\n", WHOAMI); | 348 | sa1111_resources[1].end = d->irq_base + NEP_IRQ_SA1111; |
321 | return -ENODEV; | 349 | d->sa1111 = platform_device_register_full(&sa1111_devinfo); |
322 | } | 350 | |
351 | smc91x_resources[0].parent = smc91x_res; | ||
352 | smc91x_resources[1].parent = smc91x_res; | ||
353 | smc91x_resources[2].start = d->irq_base + NEP_IRQ_SMC91X; | ||
354 | smc91x_resources[2].end = d->irq_base + NEP_IRQ_SMC91X; | ||
355 | d->smc91x = platform_device_register_full(&smc91x_devinfo); | ||
356 | |||
357 | platform_set_drvdata(dev, d); | ||
323 | 358 | ||
324 | return platform_add_devices(devices, ARRAY_SIZE(devices)); | 359 | return 0; |
360 | |||
361 | err_irq_alloc: | ||
362 | err_id: | ||
363 | iounmap(d->base); | ||
364 | err_ioremap: | ||
365 | kfree(d); | ||
366 | err_alloc: | ||
367 | return ret; | ||
325 | } | 368 | } |
326 | 369 | ||
327 | subsys_initcall(neponset_init); | 370 | static int __devexit neponset_remove(struct platform_device *dev) |
371 | { | ||
372 | struct neponset_drvdata *d = platform_get_drvdata(dev); | ||
373 | int irq = platform_get_irq(dev, 0); | ||
374 | |||
375 | if (!IS_ERR(d->sa1111)) | ||
376 | platform_device_unregister(d->sa1111); | ||
377 | if (!IS_ERR(d->smc91x)) | ||
378 | platform_device_unregister(d->smc91x); | ||
379 | irq_set_chained_handler(irq, NULL); | ||
380 | irq_free_descs(d->irq_base, NEP_IRQ_NR); | ||
381 | nep_base = NULL; | ||
382 | iounmap(d->base); | ||
383 | kfree(d); | ||
328 | 384 | ||
329 | static struct map_desc neponset_io_desc[] __initdata = { | 385 | return 0; |
330 | { /* System Registers */ | 386 | } |
331 | .virtual = 0xf3000000, | 387 | |
332 | .pfn = __phys_to_pfn(0x10000000), | 388 | #ifdef CONFIG_PM_SLEEP |
333 | .length = SZ_1M, | 389 | static int neponset_suspend(struct device *dev) |
334 | .type = MT_DEVICE | 390 | { |
335 | }, { /* SA-1111 */ | 391 | struct neponset_drvdata *d = dev_get_drvdata(dev); |
336 | .virtual = 0xf4000000, | 392 | |
337 | .pfn = __phys_to_pfn(0x40000000), | 393 | d->ncr0 = readb_relaxed(d->base + NCR_0); |
338 | .length = SZ_1M, | 394 | d->mdm_ctl_0 = readb_relaxed(d->base + MDM_CTL_0); |
339 | .type = MT_DEVICE | 395 | |
340 | } | 396 | return 0; |
397 | } | ||
398 | |||
399 | static int neponset_resume(struct device *dev) | ||
400 | { | ||
401 | struct neponset_drvdata *d = dev_get_drvdata(dev); | ||
402 | |||
403 | writeb_relaxed(d->ncr0, d->base + NCR_0); | ||
404 | writeb_relaxed(d->mdm_ctl_0, d->base + MDM_CTL_0); | ||
405 | |||
406 | return 0; | ||
407 | } | ||
408 | |||
409 | static const struct dev_pm_ops neponset_pm_ops = { | ||
410 | .suspend_noirq = neponset_suspend, | ||
411 | .resume_noirq = neponset_resume, | ||
412 | .freeze_noirq = neponset_suspend, | ||
413 | .restore_noirq = neponset_resume, | ||
414 | }; | ||
415 | #define PM_OPS &neponset_pm_ops | ||
416 | #else | ||
417 | #define PM_OPS NULL | ||
418 | #endif | ||
419 | |||
420 | static struct platform_driver neponset_device_driver = { | ||
421 | .probe = neponset_probe, | ||
422 | .remove = __devexit_p(neponset_remove), | ||
423 | .driver = { | ||
424 | .name = "neponset", | ||
425 | .owner = THIS_MODULE, | ||
426 | .pm = PM_OPS, | ||
427 | }, | ||
341 | }; | 428 | }; |
342 | 429 | ||
343 | void __init neponset_map_io(void) | 430 | static int __init neponset_init(void) |
344 | { | 431 | { |
345 | iotable_init(neponset_io_desc, ARRAY_SIZE(neponset_io_desc)); | 432 | return platform_driver_register(&neponset_device_driver); |
346 | } | 433 | } |
434 | |||
435 | subsys_initcall(neponset_init); | ||
diff --git a/arch/arm/mach-sa1100/pci-nanoengine.c b/arch/arm/mach-sa1100/pci-nanoengine.c index b466bca9c651..b49108b890a8 100644 --- a/arch/arm/mach-sa1100/pci-nanoengine.c +++ b/arch/arm/mach-sa1100/pci-nanoengine.c | |||
@@ -135,12 +135,8 @@ struct pci_bus * __init pci_nanoengine_scan_bus(int nr, struct pci_sys_data *sys | |||
135 | &sys->resources); | 135 | &sys->resources); |
136 | } | 136 | } |
137 | 137 | ||
138 | static struct resource pci_io_ports = { | 138 | static struct resource pci_io_ports = |
139 | .name = "PCI IO", | 139 | DEFINE_RES_IO_NAMED(0x400, 0x400, "PCI IO"); |
140 | .start = 0x400, | ||
141 | .end = 0x7FF, | ||
142 | .flags = IORESOURCE_IO, | ||
143 | }; | ||
144 | 140 | ||
145 | static struct resource pci_non_prefetchable_memory = { | 141 | static struct resource pci_non_prefetchable_memory = { |
146 | .name = "PCI non-prefetchable", | 142 | .name = "PCI non-prefetchable", |
diff --git a/arch/arm/mach-sa1100/pleb.c b/arch/arm/mach-sa1100/pleb.c index 9307df053533..1602575a0d5c 100644 --- a/arch/arm/mach-sa1100/pleb.c +++ b/arch/arm/mach-sa1100/pleb.c | |||
@@ -37,17 +37,9 @@ | |||
37 | #define IRQ_GPIO_ETH0_IRQ IRQ_GPIO21 | 37 | #define IRQ_GPIO_ETH0_IRQ IRQ_GPIO21 |
38 | 38 | ||
39 | static struct resource smc91x_resources[] = { | 39 | static struct resource smc91x_resources[] = { |
40 | [0] = { | 40 | [0] = DEFINE_RES_MEM(PLEB_ETH0_P, 0x04000000), |
41 | .start = PLEB_ETH0_P, | ||
42 | .end = PLEB_ETH0_P | 0x03ffffff, | ||
43 | .flags = IORESOURCE_MEM, | ||
44 | }, | ||
45 | #if 0 /* Autoprobe instead, to get rising/falling edge characteristic right */ | 41 | #if 0 /* Autoprobe instead, to get rising/falling edge characteristic right */ |
46 | [1] = { | 42 | [1] = DEFINE_RES_IRQ(IRQ_GPIO_ETH0_IRQ), |
47 | .start = IRQ_GPIO_ETH0_IRQ, | ||
48 | .end = IRQ_GPIO_ETH0_IRQ, | ||
49 | .flags = IORESOURCE_IRQ, | ||
50 | }, | ||
51 | #endif | 43 | #endif |
52 | }; | 44 | }; |
53 | 45 | ||
@@ -70,16 +62,8 @@ static struct platform_device *devices[] __initdata = { | |||
70 | * the two SA1100 lowest chip select outputs. | 62 | * the two SA1100 lowest chip select outputs. |
71 | */ | 63 | */ |
72 | static struct resource pleb_flash_resources[] = { | 64 | static struct resource pleb_flash_resources[] = { |
73 | [0] = { | 65 | [0] = DEFINE_RES_MEM(SA1100_CS0_PHYS, SZ_8M), |
74 | .start = SA1100_CS0_PHYS, | 66 | [1] = DEFINE_RES_MEM(SA1100_CS1_PHYS, SZ_8M), |
75 | .end = SA1100_CS0_PHYS + SZ_8M - 1, | ||
76 | .flags = IORESOURCE_MEM, | ||
77 | }, | ||
78 | [1] = { | ||
79 | .start = SA1100_CS1_PHYS, | ||
80 | .end = SA1100_CS1_PHYS + SZ_8M - 1, | ||
81 | .flags = IORESOURCE_MEM, | ||
82 | } | ||
83 | }; | 67 | }; |
84 | 68 | ||
85 | 69 | ||
@@ -147,6 +131,7 @@ static void __init pleb_map_io(void) | |||
147 | 131 | ||
148 | MACHINE_START(PLEB, "PLEB") | 132 | MACHINE_START(PLEB, "PLEB") |
149 | .map_io = pleb_map_io, | 133 | .map_io = pleb_map_io, |
134 | .nr_irqs = SA1100_NR_IRQS, | ||
150 | .init_irq = sa1100_init_irq, | 135 | .init_irq = sa1100_init_irq, |
151 | .timer = &sa1100_timer, | 136 | .timer = &sa1100_timer, |
152 | .init_machine = pleb_init, | 137 | .init_machine = pleb_init, |
diff --git a/arch/arm/mach-sa1100/shannon.c b/arch/arm/mach-sa1100/shannon.c index 318b2b766a0b..ca8bf59b9047 100644 --- a/arch/arm/mach-sa1100/shannon.c +++ b/arch/arm/mach-sa1100/shannon.c | |||
@@ -9,6 +9,8 @@ | |||
9 | #include <linux/mtd/mtd.h> | 9 | #include <linux/mtd/mtd.h> |
10 | #include <linux/mtd/partitions.h> | 10 | #include <linux/mtd/partitions.h> |
11 | 11 | ||
12 | #include <video/sa1100fb.h> | ||
13 | |||
12 | #include <mach/hardware.h> | 14 | #include <mach/hardware.h> |
13 | #include <asm/mach-types.h> | 15 | #include <asm/mach-types.h> |
14 | #include <asm/setup.h> | 16 | #include <asm/setup.h> |
@@ -19,6 +21,7 @@ | |||
19 | #include <asm/mach/serial_sa1100.h> | 21 | #include <asm/mach/serial_sa1100.h> |
20 | #include <mach/mcp.h> | 22 | #include <mach/mcp.h> |
21 | #include <mach/shannon.h> | 23 | #include <mach/shannon.h> |
24 | #include <mach/irqs.h> | ||
22 | 25 | ||
23 | #include "generic.h" | 26 | #include "generic.h" |
24 | 27 | ||
@@ -46,19 +49,32 @@ static struct flash_platform_data shannon_flash_data = { | |||
46 | .nr_parts = ARRAY_SIZE(shannon_partitions), | 49 | .nr_parts = ARRAY_SIZE(shannon_partitions), |
47 | }; | 50 | }; |
48 | 51 | ||
49 | static struct resource shannon_flash_resource = { | 52 | static struct resource shannon_flash_resource = |
50 | .start = SA1100_CS0_PHYS, | 53 | DEFINE_RES_MEM(SA1100_CS0_PHYS, SZ_4M); |
51 | .end = SA1100_CS0_PHYS + SZ_4M - 1, | ||
52 | .flags = IORESOURCE_MEM, | ||
53 | }; | ||
54 | 54 | ||
55 | static struct mcp_plat_data shannon_mcp_data = { | 55 | static struct mcp_plat_data shannon_mcp_data = { |
56 | .mccr0 = MCCR0_ADM, | 56 | .mccr0 = MCCR0_ADM, |
57 | .sclk_rate = 11981000, | 57 | .sclk_rate = 11981000, |
58 | }; | 58 | }; |
59 | 59 | ||
60 | static struct sa1100fb_mach_info shannon_lcd_info = { | ||
61 | .pixclock = 152500, .bpp = 8, | ||
62 | .xres = 640, .yres = 480, | ||
63 | |||
64 | .hsync_len = 4, .vsync_len = 3, | ||
65 | .left_margin = 2, .upper_margin = 0, | ||
66 | .right_margin = 1, .lower_margin = 0, | ||
67 | |||
68 | .sync = FB_SYNC_HOR_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT, | ||
69 | |||
70 | .lccr0 = LCCR0_Color | LCCR0_Dual | LCCR0_Pas, | ||
71 | .lccr3 = LCCR3_ACBsDiv(512), | ||
72 | }; | ||
73 | |||
60 | static void __init shannon_init(void) | 74 | static void __init shannon_init(void) |
61 | { | 75 | { |
76 | sa11x0_ppc_configure_mcp(); | ||
77 | sa11x0_register_lcd(&shannon_lcd_info); | ||
62 | sa11x0_register_mtd(&shannon_flash_data, &shannon_flash_resource, 1); | 78 | sa11x0_register_mtd(&shannon_flash_data, &shannon_flash_resource, 1); |
63 | sa11x0_register_mcp(&shannon_mcp_data); | 79 | sa11x0_register_mcp(&shannon_mcp_data); |
64 | } | 80 | } |
@@ -84,6 +100,7 @@ static void __init shannon_map_io(void) | |||
84 | MACHINE_START(SHANNON, "Shannon (AKA: Tuxscreen)") | 100 | MACHINE_START(SHANNON, "Shannon (AKA: Tuxscreen)") |
85 | .atag_offset = 0x100, | 101 | .atag_offset = 0x100, |
86 | .map_io = shannon_map_io, | 102 | .map_io = shannon_map_io, |
103 | .nr_irqs = SA1100_NR_IRQS, | ||
87 | .init_irq = sa1100_init_irq, | 104 | .init_irq = sa1100_init_irq, |
88 | .timer = &sa1100_timer, | 105 | .timer = &sa1100_timer, |
89 | .init_machine = shannon_init, | 106 | .init_machine = shannon_init, |
diff --git a/arch/arm/mach-sa1100/simpad.c b/arch/arm/mach-sa1100/simpad.c index e17c04d6e324..3efae03cb3d7 100644 --- a/arch/arm/mach-sa1100/simpad.c +++ b/arch/arm/mach-sa1100/simpad.c | |||
@@ -7,15 +7,15 @@ | |||
7 | #include <linux/kernel.h> | 7 | #include <linux/kernel.h> |
8 | #include <linux/tty.h> | 8 | #include <linux/tty.h> |
9 | #include <linux/proc_fs.h> | 9 | #include <linux/proc_fs.h> |
10 | #include <linux/string.h> | 10 | #include <linux/string.h> |
11 | #include <linux/pm.h> | 11 | #include <linux/pm.h> |
12 | #include <linux/platform_device.h> | 12 | #include <linux/platform_device.h> |
13 | #include <linux/mfd/ucb1x00.h> | ||
13 | #include <linux/mtd/mtd.h> | 14 | #include <linux/mtd/mtd.h> |
14 | #include <linux/mtd/partitions.h> | 15 | #include <linux/mtd/partitions.h> |
15 | #include <linux/io.h> | 16 | #include <linux/io.h> |
16 | #include <linux/gpio.h> | 17 | #include <linux/gpio.h> |
17 | 18 | ||
18 | #include <asm/irq.h> | ||
19 | #include <mach/hardware.h> | 19 | #include <mach/hardware.h> |
20 | #include <asm/setup.h> | 20 | #include <asm/setup.h> |
21 | 21 | ||
@@ -26,6 +26,7 @@ | |||
26 | #include <asm/mach/serial_sa1100.h> | 26 | #include <asm/mach/serial_sa1100.h> |
27 | #include <mach/mcp.h> | 27 | #include <mach/mcp.h> |
28 | #include <mach/simpad.h> | 28 | #include <mach/simpad.h> |
29 | #include <mach/irqs.h> | ||
29 | 30 | ||
30 | #include <linux/serial_core.h> | 31 | #include <linux/serial_core.h> |
31 | #include <linux/ioport.h> | 32 | #include <linux/ioport.h> |
@@ -176,21 +177,18 @@ static struct flash_platform_data simpad_flash_data = { | |||
176 | 177 | ||
177 | 178 | ||
178 | static struct resource simpad_flash_resources [] = { | 179 | static struct resource simpad_flash_resources [] = { |
179 | { | 180 | DEFINE_RES_MEM(SA1100_CS0_PHYS, SZ_16M), |
180 | .start = SA1100_CS0_PHYS, | 181 | DEFINE_RES_MEM(SA1100_CS1_PHYS, SZ_16M), |
181 | .end = SA1100_CS0_PHYS + SZ_16M -1, | 182 | }; |
182 | .flags = IORESOURCE_MEM, | 183 | |
183 | }, { | 184 | static struct ucb1x00_plat_data simpad_ucb1x00_data = { |
184 | .start = SA1100_CS1_PHYS, | 185 | .gpio_base = SIMPAD_UCB1X00_GPIO_BASE, |
185 | .end = SA1100_CS1_PHYS + SZ_16M -1, | ||
186 | .flags = IORESOURCE_MEM, | ||
187 | } | ||
188 | }; | 186 | }; |
189 | 187 | ||
190 | static struct mcp_plat_data simpad_mcp_data = { | 188 | static struct mcp_plat_data simpad_mcp_data = { |
191 | .mccr0 = MCCR0_ADM, | 189 | .mccr0 = MCCR0_ADM, |
192 | .sclk_rate = 11981000, | 190 | .sclk_rate = 11981000, |
193 | .gpio_base = SIMPAD_UCB1X00_GPIO_BASE, | 191 | .codec_pdata = &simpad_ucb1x00_data, |
194 | }; | 192 | }; |
195 | 193 | ||
196 | 194 | ||
@@ -376,6 +374,7 @@ static int __init simpad_init(void) | |||
376 | 374 | ||
377 | pm_power_off = simpad_power_off; | 375 | pm_power_off = simpad_power_off; |
378 | 376 | ||
377 | sa11x0_ppc_configure_mcp(); | ||
379 | sa11x0_register_mtd(&simpad_flash_data, simpad_flash_resources, | 378 | sa11x0_register_mtd(&simpad_flash_data, simpad_flash_resources, |
380 | ARRAY_SIZE(simpad_flash_resources)); | 379 | ARRAY_SIZE(simpad_flash_resources)); |
381 | sa11x0_register_mcp(&simpad_mcp_data); | 380 | sa11x0_register_mcp(&simpad_mcp_data); |
@@ -394,6 +393,7 @@ MACHINE_START(SIMPAD, "Simpad") | |||
394 | /* Maintainer: Holger Freyther */ | 393 | /* Maintainer: Holger Freyther */ |
395 | .atag_offset = 0x100, | 394 | .atag_offset = 0x100, |
396 | .map_io = simpad_map_io, | 395 | .map_io = simpad_map_io, |
396 | .nr_irqs = SA1100_NR_IRQS, | ||
397 | .init_irq = sa1100_init_irq, | 397 | .init_irq = sa1100_init_irq, |
398 | .timer = &sa1100_timer, | 398 | .timer = &sa1100_timer, |
399 | .restart = sa11x0_restart, | 399 | .restart = sa11x0_restart, |
diff --git a/arch/arm/mach-sa1100/sleep.S b/arch/arm/mach-sa1100/sleep.S index e8223315b442..30cc6721665b 100644 --- a/arch/arm/mach-sa1100/sleep.S +++ b/arch/arm/mach-sa1100/sleep.S | |||
@@ -26,27 +26,36 @@ | |||
26 | * | 26 | * |
27 | * Causes sa11x0 to enter sleep state | 27 | * Causes sa11x0 to enter sleep state |
28 | * | 28 | * |
29 | * Must be aligned to a cacheline. | ||
29 | */ | 30 | */ |
30 | 31 | .balign 32 | |
31 | ENTRY(sa1100_finish_suspend) | 32 | ENTRY(sa1100_finish_suspend) |
32 | @ disable clock switching | 33 | @ disable clock switching |
33 | mcr p15, 0, r1, c15, c2, 2 | 34 | mcr p15, 0, r1, c15, c2, 2 |
34 | 35 | ||
35 | @ Adjust memory timing before lowering CPU clock | 36 | ldr r6, =MDREFR |
36 | @ Clock speed adjustment without changing memory timing makes | 37 | ldr r4, [r6] |
37 | @ CPU hang in some cases | 38 | orr r4, r4, #MDREFR_K1DB2 |
38 | ldr r0, =MDREFR | 39 | ldr r5, =PPCR |
39 | ldr r1, [r0] | 40 | |
40 | orr r1, r1, #MDREFR_K1DB2 | 41 | @ Pre-load __udelay into the I-cache |
41 | str r1, [r0] | 42 | mov r0, #1 |
43 | bl __udelay | ||
44 | mov r0, r0 | ||
45 | |||
46 | @ The following must all exist in a single cache line to | ||
47 | @ avoid accessing memory until this sequence is complete, | ||
48 | @ otherwise we occasionally hang. | ||
49 | |||
50 | @ Adjust memory timing before lowering CPU clock | ||
51 | str r4, [r6] | ||
42 | 52 | ||
43 | @ delay 90us and set CPU PLL to lowest speed | 53 | @ delay 90us and set CPU PLL to lowest speed |
44 | @ fixes resume problem on high speed SA1110 | 54 | @ fixes resume problem on high speed SA1110 |
45 | mov r0, #90 | 55 | mov r0, #90 |
46 | bl __udelay | 56 | bl __udelay |
47 | ldr r0, =PPCR | ||
48 | mov r1, #0 | 57 | mov r1, #0 |
49 | str r1, [r0] | 58 | str r1, [r5] |
50 | mov r0, #90 | 59 | mov r0, #90 |
51 | bl __udelay | 60 | bl __udelay |
52 | 61 | ||
@@ -85,12 +94,10 @@ ENTRY(sa1100_finish_suspend) | |||
85 | bic r5, r5, #FMsk(MSC_RT) | 94 | bic r5, r5, #FMsk(MSC_RT) |
86 | bic r5, r5, #FMsk(MSC_RT)<<16 | 95 | bic r5, r5, #FMsk(MSC_RT)<<16 |
87 | 96 | ||
88 | ldr r6, =MDREFR | ||
89 | |||
90 | ldr r7, [r6] | 97 | ldr r7, [r6] |
91 | bic r7, r7, #0x0000FF00 | 98 | bic r7, r7, #0x0000FF00 |
92 | bic r7, r7, #0x000000F0 | 99 | bic r7, r7, #0x000000F0 |
93 | orr r8, r7, #MDREFR_SLFRSH | 100 | orr r8, r7, #MDREFR_SLFRSH |
94 | 101 | ||
95 | ldr r9, =MDCNFG | 102 | ldr r9, =MDCNFG |
96 | ldr r10, [r9] | 103 | ldr r10, [r9] |
diff --git a/arch/arm/mach-sa1100/ssp.c b/arch/arm/mach-sa1100/ssp.c index b20ff93b84a5..e22fca9ad5ec 100644 --- a/arch/arm/mach-sa1100/ssp.c +++ b/arch/arm/mach-sa1100/ssp.c | |||
@@ -19,8 +19,8 @@ | |||
19 | #include <linux/init.h> | 19 | #include <linux/init.h> |
20 | #include <linux/io.h> | 20 | #include <linux/io.h> |
21 | 21 | ||
22 | #include <asm/irq.h> | ||
23 | #include <mach/hardware.h> | 22 | #include <mach/hardware.h> |
23 | #include <mach/irqs.h> | ||
24 | #include <asm/hardware/ssp.h> | 24 | #include <asm/hardware/ssp.h> |
25 | 25 | ||
26 | #define TIMEOUT 100000 | 26 | #define TIMEOUT 100000 |
diff --git a/arch/arm/mach-sa1100/time.c b/arch/arm/mach-sa1100/time.c index 69e33535dee6..6af26e8d55e6 100644 --- a/arch/arm/mach-sa1100/time.c +++ b/arch/arm/mach-sa1100/time.c | |||
@@ -18,6 +18,7 @@ | |||
18 | #include <asm/mach/time.h> | 18 | #include <asm/mach/time.h> |
19 | #include <asm/sched_clock.h> | 19 | #include <asm/sched_clock.h> |
20 | #include <mach/hardware.h> | 20 | #include <mach/hardware.h> |
21 | #include <mach/irqs.h> | ||
21 | 22 | ||
22 | static u32 notrace sa1100_read_sched_clock(void) | 23 | static u32 notrace sa1100_read_sched_clock(void) |
23 | { | 24 | { |