[lantiq] cleanup patches
[openwrt.git] / target / linux / lantiq / patches-3.3 / 0005-pci-support.patch
1 From b80a5236053be899421417871d1be8016912e94b Mon Sep 17 00:00:00 2001
2 From: John Crispin <blogic@openwrt.org>
3 Date: Fri, 3 Aug 2012 09:52:10 +0200
4 Subject: [PATCH 05/25] pci support
5
6 ---
7  arch/mips/include/asm/mach-lantiq/lantiq.h         |   37 ++++-----
8  .../mips/include/asm/mach-lantiq/lantiq_platform.h |    9 ++
9  arch/mips/pci/Makefile                             |    5 +-
10  arch/mips/pci/ops-lantiq.c                         |    6 +-
11  arch/mips/pci/pci-lantiq.c                         |   82 ++++++++------------
12  arch/mips/pci/pci-lantiq.h                         |    2 +-
13  arch/mips/pci/pci.c                                |   25 ++++++
14  7 files changed, 89 insertions(+), 77 deletions(-)
15
16 diff --git a/arch/mips/include/asm/mach-lantiq/lantiq.h b/arch/mips/include/asm/mach-lantiq/lantiq.h
17 index ce2f029..622847f 100644
18 --- a/arch/mips/include/asm/mach-lantiq/lantiq.h
19 +++ b/arch/mips/include/asm/mach-lantiq/lantiq.h
20 @@ -9,6 +9,8 @@
21  #define _LANTIQ_H__
22  
23  #include <linux/irq.h>
24 +#include <linux/clk.h>
25 +#include <linux/ioport.h>
26  
27  /* generic reg access functions */
28  #define ltq_r32(reg)           __raw_readl(reg)
29 @@ -18,40 +20,33 @@
30  #define ltq_r8(reg)            __raw_readb(reg)
31  #define ltq_w8(val, reg)       __raw_writeb(val, reg)
32  
33 -/* register access macros for EBU and CGU */
34 -#define ltq_ebu_w32(x, y)      ltq_w32((x), ltq_ebu_membase + (y))
35 -#define ltq_ebu_r32(x)         ltq_r32(ltq_ebu_membase + (x))
36 -#define ltq_cgu_w32(x, y)      ltq_w32((x), ltq_cgu_membase + (y))
37 -#define ltq_cgu_r32(x)         ltq_r32(ltq_cgu_membase + (x))
38 -
39 -extern __iomem void *ltq_ebu_membase;
40 -extern __iomem void *ltq_cgu_membase;
41 -
42  extern unsigned int ltq_get_cpu_ver(void);
43  extern unsigned int ltq_get_soc_type(void);
44  
45 -/* clock speeds */
46 -#define CLOCK_60M      60000000
47 -#define CLOCK_83M      83333333
48 -#define CLOCK_111M     111111111
49 -#define CLOCK_133M     133333333
50 -#define CLOCK_167M     166666667
51 -#define CLOCK_200M     200000000
52 -#define CLOCK_266M     266666666
53 -#define CLOCK_333M     333333333
54 -#define CLOCK_400M     400000000
55 -
56  /* spinlock all ebu i/o */
57  extern spinlock_t ebu_lock;
58  
59 +/* request a non-gpio and set the PIO config */
60 +extern int ltq_gpio_request(struct device *dev, unsigned int pin,
61 +               unsigned int mux, unsigned int dir, const char *name);
62 +
63  /* some irq helpers */
64  extern void ltq_disable_irq(struct irq_data *data);
65  extern void ltq_mask_and_ack_irq(struct irq_data *data);
66  extern void ltq_enable_irq(struct irq_data *data);
67  
68 +/* clock handling */
69 +extern int clk_activate(struct clk *clk);
70 +extern void clk_deactivate(struct clk *clk);
71 +extern struct clk *clk_get_cpu(void);
72 +extern struct clk *clk_get_fpi(void);
73 +extern struct clk *clk_get_io(void);
74 +
75  /* find out what caused the last cpu reset */
76  extern int ltq_reset_cause(void);
77 -#define LTQ_RST_CAUSE_WDTRST   0x20
78 +
79 +/* helper for requesting and remapping resources */
80 +extern void __iomem *ltq_remap_resource(struct resource *res);
81  
82  #define IOPORT_RESOURCE_START  0x10000000
83  #define IOPORT_RESOURCE_END    0xffffffff
84 diff --git a/arch/mips/include/asm/mach-lantiq/lantiq_platform.h b/arch/mips/include/asm/mach-lantiq/lantiq_platform.h
85 index a305f1d..38ed938 100644
86 --- a/arch/mips/include/asm/mach-lantiq/lantiq_platform.h
87 +++ b/arch/mips/include/asm/mach-lantiq/lantiq_platform.h
88 @@ -50,4 +50,13 @@ struct ltq_eth_data {
89         int mii_mode;
90  };
91  
92 +
93 +struct ltq_spi_platform_data {
94 +       u16 num_chipselect;
95 +};
96 +
97 +struct ltq_spi_controller_data {
98 +       unsigned gpio;
99 +};
100 +
101  #endif
102 diff --git a/arch/mips/pci/Makefile b/arch/mips/pci/Makefile
103 index c3ac4b0..31e70c5 100644
104 --- a/arch/mips/pci/Makefile
105 +++ b/arch/mips/pci/Makefile
106 @@ -41,7 +41,10 @@ obj-$(CONFIG_SIBYTE_SB1250)  += fixup-sb1250.o pci-sb1250.o
107  obj-$(CONFIG_SIBYTE_BCM112X)   += fixup-sb1250.o pci-sb1250.o
108  obj-$(CONFIG_SIBYTE_BCM1x80)   += pci-bcm1480.o pci-bcm1480ht.o
109  obj-$(CONFIG_SNI_RM)           += fixup-sni.o ops-sni.o
110 -obj-$(CONFIG_SOC_XWAY)         += pci-lantiq.o ops-lantiq.o
111 +obj-$(CONFIG_LANTIQ)           += fixup-lantiq.o
112 +obj-$(CONFIG_PCI_LANTIQ)       += pci-lantiq.o ops-lantiq.o
113 +obj-$(CONFIG_PCIE_LANTIQ)      += pcie-lantiq-phy.o pcie-lantiq.o fixup-lantiq-pcie.o
114 +obj-$(CONFIG_PCIE_LANTIQ_MSI)  += pcie-lantiq-msi.o
115  obj-$(CONFIG_TANBAC_TB0219)    += fixup-tb0219.o
116  obj-$(CONFIG_TANBAC_TB0226)    += fixup-tb0226.o
117  obj-$(CONFIG_TANBAC_TB0287)    += fixup-tb0287.o
118 diff --git a/arch/mips/pci/ops-lantiq.c b/arch/mips/pci/ops-lantiq.c
119 index 1f2afb5..5cbb0cf 100644
120 --- a/arch/mips/pci/ops-lantiq.c
121 +++ b/arch/mips/pci/ops-lantiq.c
122 @@ -41,7 +41,7 @@ static int ltq_pci_config_access(unsigned char access_type, struct pci_bus *bus,
123  
124         spin_lock_irqsave(&ebu_lock, flags);
125  
126 -       cfg_base = (unsigned long) ltq_pci_mapped_cfg;
127 +       cfg_base = (unsigned long) ltq_pci_cfgbase;
128         cfg_base |= (bus->number << LTQ_PCI_CFG_BUSNUM_SHF) | (devfn <<
129                         LTQ_PCI_CFG_FUNNUM_SHF) | (where & ~0x3);
130  
131 @@ -55,11 +55,11 @@ static int ltq_pci_config_access(unsigned char access_type, struct pci_bus *bus,
132         wmb();
133  
134         /* clean possible Master abort */
135 -       cfg_base = (unsigned long) ltq_pci_mapped_cfg;
136 +       cfg_base = (unsigned long) ltq_pci_cfgbase;
137         cfg_base |= (0x0 << LTQ_PCI_CFG_FUNNUM_SHF) + 4;
138         temp = ltq_r32(((u32 *)(cfg_base)));
139         temp = swab32(temp);
140 -       cfg_base = (unsigned long) ltq_pci_mapped_cfg;
141 +       cfg_base = (unsigned long) ltq_pci_cfgbase;
142         cfg_base |= (0x68 << LTQ_PCI_CFG_FUNNUM_SHF) + 4;
143         ltq_w32(temp, ((u32 *)cfg_base));
144  
145 diff --git a/arch/mips/pci/pci-lantiq.c b/arch/mips/pci/pci-lantiq.c
146 index be1e1af..7a29738 100644
147 --- a/arch/mips/pci/pci-lantiq.c
148 +++ b/arch/mips/pci/pci-lantiq.c
149 @@ -65,45 +65,42 @@
150  #define ltq_pci_w32(x, y)      ltq_w32((x), ltq_pci_membase + (y))
151  #define ltq_pci_r32(x)         ltq_r32(ltq_pci_membase + (x))
152  
153 -#define ltq_pci_cfg_w32(x, y)  ltq_w32((x), ltq_pci_mapped_cfg + (y))
154 -#define ltq_pci_cfg_r32(x)     ltq_r32(ltq_pci_mapped_cfg + (x))
155 +#define ltq_pci_cfg_w32(x, y)  ltq_w32((x), ltq_pci_cfgbase + (y))
156 +#define ltq_pci_cfg_r32(x)     ltq_r32(ltq_pci_cfgbase + (x))
157  
158  struct ltq_pci_gpio_map {
159         int pin;
160 -       int alt0;
161 -       int alt1;
162 +       int mux;
163         int dir;
164         char *name;
165  };
166  
167  /* the pci core can make use of the following gpios */
168  static struct ltq_pci_gpio_map ltq_pci_gpio_map[] = {
169 -       { 0, 1, 0, 0, "pci-exin0" },
170 -       { 1, 1, 0, 0, "pci-exin1" },
171 -       { 2, 1, 0, 0, "pci-exin2" },
172 -       { 39, 1, 0, 0, "pci-exin3" },
173 -       { 10, 1, 0, 0, "pci-exin4" },
174 -       { 9, 1, 0, 0, "pci-exin5" },
175 -       { 30, 1, 0, 1, "pci-gnt1" },
176 -       { 23, 1, 0, 1, "pci-gnt2" },
177 -       { 19, 1, 0, 1, "pci-gnt3" },
178 -       { 38, 1, 0, 1, "pci-gnt4" },
179 -       { 29, 1, 0, 0, "pci-req1" },
180 -       { 31, 1, 0, 0, "pci-req2" },
181 -       { 3, 1, 0, 0, "pci-req3" },
182 -       { 37, 1, 0, 0, "pci-req4" },
183 +       { 0, 2, 0, "pci-exin0" },
184 +       { 1, 2, 0, "pci-exin1" },
185 +       { 2, 2, 0, "pci-exin2" },
186 +       { 39, 2, 0, "pci-exin3" },
187 +       { 10, 2, 0, "pci-exin4" },
188 +       { 9, 2, 0, "pci-exin5" },
189 +       { 30, 2, 1, "pci-gnt1" },
190 +       { 23, 2, 1, "pci-gnt2" },
191 +       { 19, 2, 1, "pci-gnt3" },
192 +       { 38, 2, 1, "pci-gnt4" },
193 +       { 29, 2, 0, "pci-req1" },
194 +       { 31, 2, 0, "pci-req2" },
195 +       { 3, 2, 0, "pci-req3" },
196 +       { 37, 2, 0, "pci-req4" },
197  };
198  
199 -__iomem void *ltq_pci_mapped_cfg;
200 +__iomem void *ltq_pci_cfgbase;
201  static __iomem void *ltq_pci_membase;
202  
203 -int (*ltqpci_plat_dev_init)(struct pci_dev *dev) = NULL;
204 -
205  /* Since the PCI REQ pins can be reused for other functionality, make it
206     possible to exclude those from interpretation by the PCI controller */
207  static int ltq_pci_req_mask = 0xf;
208  
209 -static int *ltq_pci_irq_map;
210 +extern int *ltq_pci_irq_map;
211  
212  struct pci_ops ltq_pci_ops = {
213         .read   = ltq_pci_read_config_dword,
214 @@ -132,14 +129,6 @@ static struct pci_controller ltq_pci_controller = {
215         .io_offset      = 0x00000000UL,
216  };
217  
218 -int pcibios_plat_dev_init(struct pci_dev *dev)
219 -{
220 -       if (ltqpci_plat_dev_init)
221 -               return ltqpci_plat_dev_init(dev);
222 -
223 -       return 0;
224 -}
225 -
226  static u32 ltq_calc_bar11mask(void)
227  {
228         u32 mem, bar11mask;
229 @@ -151,25 +140,26 @@ static u32 ltq_calc_bar11mask(void)
230         return bar11mask;
231  }
232  
233 -static void ltq_pci_setup_gpio(int gpio)
234 +static void ltq_pci_setup_gpio(struct device *dev)
235  {
236 +       struct ltq_pci_data *conf = (struct ltq_pci_data *) dev->platform_data;
237         int i;
238         for (i = 0; i < ARRAY_SIZE(ltq_pci_gpio_map); i++) {
239 -               if (gpio & (1 << i)) {
240 -                       ltq_gpio_request(ltq_pci_gpio_map[i].pin,
241 -                               ltq_pci_gpio_map[i].alt0,
242 -                               ltq_pci_gpio_map[i].alt1,
243 +               if (conf->gpio & (1 << i)) {
244 +                       ltq_gpio_request(dev, ltq_pci_gpio_map[i].pin,
245 +                               ltq_pci_gpio_map[i].mux,
246                                 ltq_pci_gpio_map[i].dir,
247                                 ltq_pci_gpio_map[i].name);
248                 }
249         }
250 -       ltq_gpio_request(21, 0, 0, 1, "pci-reset");
251 -       ltq_pci_req_mask = (gpio >> PCI_REQ_SHIFT) & PCI_REQ_MASK;
252 +       ltq_gpio_request(dev, 21, 0, 1, "pci-reset");
253 +       ltq_pci_req_mask = (conf->gpio >> PCI_REQ_SHIFT) & PCI_REQ_MASK;
254  }
255  
256 -static int __devinit ltq_pci_startup(struct ltq_pci_data *conf)
257 +static int __devinit ltq_pci_startup(struct device *dev)
258  {
259         u32 temp_buffer;
260 +       struct ltq_pci_data *conf = (struct ltq_pci_data *) dev->platform_data;
261  
262         /* set clock to 33Mhz */
263         if (ltq_is_ar9()) {
264 @@ -192,7 +182,7 @@ static int __devinit ltq_pci_startup(struct ltq_pci_data *conf)
265         }
266  
267         /* setup pci clock and gpis used by pci */
268 -       ltq_pci_setup_gpio(conf->gpio);
269 +       ltq_pci_setup_gpio(dev);
270  
271         /* enable auto-switching between PCI and EBU */
272         ltq_pci_w32(0xa, PCI_CR_CLK_CTRL);
273 @@ -256,16 +246,6 @@ static int __devinit ltq_pci_startup(struct ltq_pci_data *conf)
274         return 0;
275  }
276  
277 -int __init pcibios_map_irq(const struct pci_dev *dev, u8 slot, u8 pin)
278 -{
279 -       if (ltq_pci_irq_map[slot])
280 -               return ltq_pci_irq_map[slot];
281 -       printk(KERN_ERR "lq_pci: trying to map irq for unknown slot %d\n",
282 -               slot);
283 -
284 -       return 0;
285 -}
286 -
287  static int __devinit ltq_pci_probe(struct platform_device *pdev)
288  {
289         struct ltq_pci_data *ltq_pci_data =
290 @@ -273,11 +253,11 @@ static int __devinit ltq_pci_probe(struct platform_device *pdev)
291         pci_probe_only = 0;
292         ltq_pci_irq_map = ltq_pci_data->irq;
293         ltq_pci_membase = ioremap_nocache(PCI_CR_BASE_ADDR, PCI_CR_SIZE);
294 -       ltq_pci_mapped_cfg =
295 +       ltq_pci_cfgbase =
296                 ioremap_nocache(LTQ_PCI_CFG_BASE, LTQ_PCI_CFG_BASE);
297         ltq_pci_controller.io_map_base =
298                 (unsigned long)ioremap(LTQ_PCI_IO_BASE, LTQ_PCI_IO_SIZE - 1);
299 -       ltq_pci_startup(ltq_pci_data);
300 +       ltq_pci_startup(&pdev->dev);
301         register_pci_controller(&ltq_pci_controller);
302  
303         return 0;
304 diff --git a/arch/mips/pci/pci-lantiq.h b/arch/mips/pci/pci-lantiq.h
305 index 66bf6cd..c4721b4 100644
306 --- a/arch/mips/pci/pci-lantiq.h
307 +++ b/arch/mips/pci/pci-lantiq.h
308 @@ -9,7 +9,7 @@
309  #ifndef _LTQ_PCI_H__
310  #define _LTQ_PCI_H__
311  
312 -extern __iomem void *ltq_pci_mapped_cfg;
313 +extern __iomem void *ltq_pci_cfgbase;
314  extern int ltq_pci_read_config_dword(struct pci_bus *bus,
315         unsigned int devfn, int where, int size, u32 *val);
316  extern int ltq_pci_write_config_dword(struct pci_bus *bus,
317 diff --git a/arch/mips/pci/pci.c b/arch/mips/pci/pci.c
318 index 1552150..cd034a9 100644
319 --- a/arch/mips/pci/pci.c
320 +++ b/arch/mips/pci/pci.c
321 @@ -201,6 +201,31 @@ static int __init pcibios_init(void)
322  
323  subsys_initcall(pcibios_init);
324  
325 +int pcibios_host_nr(void)
326 +{
327 +    int count;
328 +    struct pci_controller *hose;
329 +    for (count = 0, hose = hose_head; hose; hose = hose->next, count++) {
330 +        ;
331 +    }
332 +    return count;
333 +}
334 +EXPORT_SYMBOL(pcibios_host_nr);
335 +
336 +int pcibios_1st_host_bus_nr(void)
337 +{
338 +    int bus_nr = 0;
339 +    struct pci_controller *hose = hose_head;
340 +
341 +    if (hose != NULL) {
342 +        if (hose->bus != NULL) {
343 +            bus_nr = hose->bus->subordinate + 1;
344 +        }
345 +    }
346 +    return bus_nr;
347 +}
348 +EXPORT_SYMBOL(pcibios_1st_host_bus_nr);
349 +
350  static int pcibios_enable_resources(struct pci_dev *dev, int mask)
351  {
352         u16 cmd, old_cmd;
353 -- 
354 1.7.9.1
355