Merge branch 'irq-fix' of git://www.modarm9.com/gitsrc/pub/people/ukleinek/linux...
[linux-2.6] / arch / arm / mach-pxa / cm-x270-pci.c
1 /*
2  * linux/arch/arm/mach-pxa/cm-x270-pci.c
3  *
4  * PCI bios-type initialisation for PCI machines
5  *
6  * Bits taken from various places.
7  *
8  * Copyright (C) 2007 Compulab, Ltd.
9  * Mike Rapoport <mike@compulab.co.il>
10  *
11  * This program is free software; you can redistribute it and/or modify
12  * it under the terms of the GNU General Public License version 2 as
13  * published by the Free Software Foundation.
14  */
15
16 #include <linux/kernel.h>
17 #include <linux/pci.h>
18 #include <linux/init.h>
19 #include <linux/device.h>
20 #include <linux/platform_device.h>
21 #include <linux/irq.h>
22
23 #include <asm/mach/pci.h>
24 #include <asm/arch/cm-x270.h>
25 #include <asm/arch/pxa-regs.h>
26 #include <asm/arch/pxa2xx-gpio.h>
27 #include <asm/mach-types.h>
28
29 #include <asm/hardware/it8152.h>
30
31 unsigned long it8152_base_address = CMX270_IT8152_VIRT;
32
33 /*
34  * Only first 64MB of memory can be accessed via PCI.
35  * We use GFP_DMA to allocate safe buffers to do map/unmap.
36  * This is really ugly and we need a better way of specifying
37  * DMA-capable regions of memory.
38  */
39 void __init cmx270_pci_adjust_zones(int node, unsigned long *zone_size,
40         unsigned long *zhole_size)
41 {
42         unsigned int sz = SZ_64M >> PAGE_SHIFT;
43
44         pr_info("Adjusting zones for CM-x270\n");
45
46         /*
47          * Only adjust if > 64M on current system
48          */
49         if (node || (zone_size[0] <= sz))
50                 return;
51
52         zone_size[1] = zone_size[0] - sz;
53         zone_size[0] = sz;
54         zhole_size[1] = zhole_size[0];
55         zhole_size[0] = 0;
56 }
57
58 static void cmx270_it8152_irq_demux(unsigned int irq, struct irq_desc *desc)
59 {
60         /* clear our parent irq */
61         GEDR(GPIO_IT8152_IRQ) = GPIO_bit(GPIO_IT8152_IRQ);
62
63         it8152_irq_demux(irq, desc);
64 }
65
66 void __cmx270_pci_init_irq(void)
67 {
68         it8152_init_irq();
69         pxa_gpio_mode(IRQ_TO_GPIO(GPIO_IT8152_IRQ));
70         set_irq_type(IRQ_GPIO(GPIO_IT8152_IRQ), IRQT_RISING);
71
72         set_irq_chained_handler(IRQ_GPIO(GPIO_IT8152_IRQ),
73                                 cmx270_it8152_irq_demux);
74 }
75
76 #ifdef CONFIG_PM
77 static unsigned long sleep_save_ite[10];
78
79 void __cmx270_pci_suspend(void)
80 {
81         /* save ITE state */
82         sleep_save_ite[0] = __raw_readl(IT8152_INTC_PDCNIMR);
83         sleep_save_ite[1] = __raw_readl(IT8152_INTC_LPCNIMR);
84         sleep_save_ite[2] = __raw_readl(IT8152_INTC_LPNIAR);
85
86         /* Clear ITE IRQ's */
87         __raw_writel((0), IT8152_INTC_PDCNIRR);
88         __raw_writel((0), IT8152_INTC_LPCNIRR);
89 }
90
91 void __cmx270_pci_resume(void)
92 {
93         /* restore IT8152 state */
94         __raw_writel((sleep_save_ite[0]), IT8152_INTC_PDCNIMR);
95         __raw_writel((sleep_save_ite[1]), IT8152_INTC_LPCNIMR);
96         __raw_writel((sleep_save_ite[2]), IT8152_INTC_LPNIAR);
97 }
98 #else
99 void cmx270_pci_suspend(void) {}
100 void cmx270_pci_resume(void) {}
101 #endif
102
103 /* PCI IRQ mapping*/
104 static int __init cmx270_pci_map_irq(struct pci_dev *dev, u8 slot, u8 pin)
105 {
106         int irq;
107
108         dev_dbg(&dev->dev, "%s: slot=%x, pin=%x\n", __func__, slot, pin);
109
110         irq = it8152_pci_map_irq(dev, slot, pin);
111         if (irq)
112                 return irq;
113
114         /*
115           Here comes the ugly part. The routing is baseboard specific,
116           but defining a platform for each possible base of CM-x270 is
117           unrealistic. Here we keep mapping for ATXBase and SB-x270.
118         */
119         /* ATXBASE PCI slot */
120         if (slot == 7)
121                 return IT8152_PCI_INTA;
122
123         /* ATXBase/SB-x270 CardBus */
124         if (slot == 8 || slot == 0)
125                 return IT8152_PCI_INTB;
126
127         /* ATXBase Ethernet */
128         if (slot == 9)
129                 return IT8152_PCI_INTA;
130
131         /* SB-x270 Ethernet */
132         if (slot == 16)
133                 return IT8152_PCI_INTA;
134
135         /* PC104+ interrupt routing */
136         if ((slot == 17) || (slot == 19))
137                 return IT8152_PCI_INTA;
138         if ((slot == 18) || (slot == 20))
139                 return IT8152_PCI_INTB;
140
141         return(0);
142 }
143
144 static void cmx270_pci_preinit(void)
145 {
146         pr_info("Initializing CM-X270 PCI subsystem\n");
147
148         __raw_writel(0x800, IT8152_PCI_CFG_ADDR);
149         if (__raw_readl(IT8152_PCI_CFG_DATA) == 0x81521283) {
150                 pr_info("PCI Bridge found.\n");
151
152                 /* set PCI I/O base at 0 */
153                 writel(0x848, IT8152_PCI_CFG_ADDR);
154                 writel(0, IT8152_PCI_CFG_DATA);
155
156                 /* set PCI memory base at 0 */
157                 writel(0x840, IT8152_PCI_CFG_ADDR);
158                 writel(0, IT8152_PCI_CFG_DATA);
159
160                 writel(0x20, IT8152_GPIO_GPDR);
161
162                 /* CardBus Controller on ATXbase baseboard */
163                 writel(0x4000, IT8152_PCI_CFG_ADDR);
164                 if (readl(IT8152_PCI_CFG_DATA) == 0xAC51104C) {
165                         pr_info("CardBus Bridge found.\n");
166
167                         /* Configure socket 0 */
168                         writel(0x408C, IT8152_PCI_CFG_ADDR);
169                         writel(0x1022, IT8152_PCI_CFG_DATA);
170
171                         writel(0x4080, IT8152_PCI_CFG_ADDR);
172                         writel(0x3844d060, IT8152_PCI_CFG_DATA);
173
174                         writel(0x4090, IT8152_PCI_CFG_ADDR);
175                         writel(((readl(IT8152_PCI_CFG_DATA) & 0xffff) |
176                                 0x60440000),
177                                IT8152_PCI_CFG_DATA);
178
179                         writel(0x4018, IT8152_PCI_CFG_ADDR);
180                         writel(0xb0000000, IT8152_PCI_CFG_DATA);
181
182                         /* Configure socket 1 */
183                         writel(0x418C, IT8152_PCI_CFG_ADDR);
184                         writel(0x1022, IT8152_PCI_CFG_DATA);
185
186                         writel(0x4180, IT8152_PCI_CFG_ADDR);
187                         writel(0x3844d060, IT8152_PCI_CFG_DATA);
188
189                         writel(0x4190, IT8152_PCI_CFG_ADDR);
190                         writel(((readl(IT8152_PCI_CFG_DATA) & 0xffff) |
191                                 0x60440000),
192                                IT8152_PCI_CFG_DATA);
193
194                         writel(0x4118, IT8152_PCI_CFG_ADDR);
195                         writel(0xb0000000, IT8152_PCI_CFG_DATA);
196                 }
197         }
198 }
199
200 static struct hw_pci cmx270_pci __initdata = {
201         .swizzle        = pci_std_swizzle,
202         .map_irq        = cmx270_pci_map_irq,
203         .nr_controllers = 1,
204         .setup          = it8152_pci_setup,
205         .scan           = it8152_pci_scan_bus,
206         .preinit        = cmx270_pci_preinit,
207 };
208
209 static int __init cmx270_init_pci(void)
210 {
211         if (machine_is_armcore())
212                 pci_common_init(&cmx270_pci);
213
214         return 0;
215 }
216
217 subsys_initcall(cmx270_init_pci);