Blame view

arch/arm/mach-footbridge/common.c 5.62 KB
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1
2
3
4
5
6
7
8
9
  /*
   *  linux/arch/arm/mach-footbridge/common.c
   *
   *  Copyright (C) 1998-2000 Russell King, Dave Gilbert.
   *
   * This program is free software; you can redistribute it and/or modify
   * it under the terms of the GNU General Public License version 2 as
   * published by the Free Software Foundation.
   */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
10
11
12
13
14
15
  #include <linux/module.h>
  #include <linux/types.h>
  #include <linux/mm.h>
  #include <linux/ioport.h>
  #include <linux/list.h>
  #include <linux/init.h>
fced80c73   Russell King   [ARM] Convert asm...
16
  #include <linux/io.h>
70d13e083   Russell King   [ARM] netwinder: ...
17
  #include <linux/spinlock.h>
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
18
19
20
21
   
  #include <asm/pgtable.h>
  #include <asm/page.h>
  #include <asm/irq.h>
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
22
23
24
25
26
27
28
29
  #include <asm/mach-types.h>
  #include <asm/setup.h>
  #include <asm/hardware/dec21285.h>
  
  #include <asm/mach/irq.h>
  #include <asm/mach/map.h>
  
  #include "common.h"
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
30
31
32
  unsigned int mem_fclk_21285 = 50000000;
  
  EXPORT_SYMBOL(mem_fclk_21285);
2b0d8c251   Jeremy Kerr   ARM: 5880/1: arm:...
33
  static int __init early_fclk(char *arg)
613e09b46   Russell King   [ARM] footbridge:...
34
  {
2b0d8c251   Jeremy Kerr   ARM: 5880/1: arm:...
35
36
  	mem_fclk_21285 = simple_strtoul(arg, NULL, 0);
  	return 0;
613e09b46   Russell King   [ARM] footbridge:...
37
  }
2b0d8c251   Jeremy Kerr   ARM: 5880/1: arm:...
38
  early_param("mem_fclk_21285", early_fclk);
613e09b46   Russell King   [ARM] footbridge:...
39

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
  static int __init parse_tag_memclk(const struct tag *tag)
  {
  	mem_fclk_21285 = tag->u.memclk.fmemclk;
  	return 0;
  }
  
  __tagtable(ATAG_MEMCLK, parse_tag_memclk);
  
  /*
   * Footbridge IRQ translation table
   *  Converts from our IRQ numbers into FootBridge masks
   */
  static const int fb_irq_mask[] = {
  	IRQ_MASK_UART_RX,	/*  0 */
  	IRQ_MASK_UART_TX,	/*  1 */
  	IRQ_MASK_TIMER1,	/*  2 */
  	IRQ_MASK_TIMER2,	/*  3 */
  	IRQ_MASK_TIMER3,	/*  4 */
  	IRQ_MASK_IN0,		/*  5 */
  	IRQ_MASK_IN1,		/*  6 */
  	IRQ_MASK_IN2,		/*  7 */
  	IRQ_MASK_IN3,		/*  8 */
  	IRQ_MASK_DOORBELLHOST,	/*  9 */
  	IRQ_MASK_DMA1,		/* 10 */
  	IRQ_MASK_DMA2,		/* 11 */
  	IRQ_MASK_PCI,		/* 12 */
  	IRQ_MASK_SDRAMPARITY,	/* 13 */
  	IRQ_MASK_I2OINPOST,	/* 14 */
  	IRQ_MASK_PCI_ABORT,	/* 15 */
  	IRQ_MASK_PCI_SERR,	/* 16 */
  	IRQ_MASK_DISCARD_TIMER,	/* 17 */
  	IRQ_MASK_PCI_DPERR,	/* 18 */
  	IRQ_MASK_PCI_PERR,	/* 19 */
  };
dc2caf6c6   Lennert Buytenhek   ARM: footbridge: ...
74
  static void fb_mask_irq(struct irq_data *d)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
75
  {
dc2caf6c6   Lennert Buytenhek   ARM: footbridge: ...
76
  	*CSR_IRQ_DISABLE = fb_irq_mask[_DC21285_INR(d->irq)];
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
77
  }
dc2caf6c6   Lennert Buytenhek   ARM: footbridge: ...
78
  static void fb_unmask_irq(struct irq_data *d)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
79
  {
dc2caf6c6   Lennert Buytenhek   ARM: footbridge: ...
80
  	*CSR_IRQ_ENABLE = fb_irq_mask[_DC21285_INR(d->irq)];
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
81
  }
10dd5ce28   Russell King   [ARM] Remove comp...
82
  static struct irq_chip fb_chip = {
dc2caf6c6   Lennert Buytenhek   ARM: footbridge: ...
83
84
85
  	.irq_ack	= fb_mask_irq,
  	.irq_mask	= fb_mask_irq,
  	.irq_unmask	= fb_unmask_irq,
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
86
87
88
89
90
91
92
93
94
95
96
97
98
  };
  
  static void __init __fb_init_irq(void)
  {
  	unsigned int irq;
  
  	/*
  	 * setup DC21285 IRQs
  	 */
  	*CSR_IRQ_DISABLE = -1;
  	*CSR_FIQ_DISABLE = -1;
  
  	for (irq = _DC21285_IRQ(0); irq < _DC21285_IRQ(20); irq++) {
f38c02f3b   Thomas Gleixner   arm: Fold irq_set...
99
  		irq_set_chip_and_handler(irq, &fb_chip, handle_level_irq);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
  		set_irq_flags(irq, IRQF_VALID | IRQF_PROBE);
  	}
  }
  
  void __init footbridge_init_irq(void)
  {
  	__fb_init_irq();
  
  	if (!footbridge_cfn_mode())
  		return;
  
  	if (machine_is_ebsa285())
  		/* The following is dependent on which slot
  		 * you plug the Southbridge card into.  We
  		 * currently assume that you plug it into
  		 * the right-hand most slot.
  		 */
  		isa_init_irq(IRQ_PCI);
  
  	if (machine_is_cats())
  		isa_init_irq(IRQ_IN2);
  
  	if (machine_is_netwinder())
  		isa_init_irq(IRQ_IN3);
  }
  
  /*
   * Common mapping for all systems.  Note that the outbound write flush is
   * commented out since there is a "No Fix" problem with it.  Not mapping
   * it means that we have extra bullet protection on our feet.
   */
  static struct map_desc fb_common_io_desc[] __initdata = {
a427ceef9   Deepak Saxena   [ARM] 2998/1: Rep...
132
133
  	{
  		.virtual	= ARMCSR_BASE,
865052fd5   Russell King   [ARM] Re-fix foot...
134
  		.pfn		= __phys_to_pfn(DC21285_ARMCSR_BASE),
a427ceef9   Deepak Saxena   [ARM] 2998/1: Rep...
135
  		.length		= ARMCSR_SIZE,
6460177f4   Russell King   [ARM] Fix Footbri...
136
  		.type		= MT_DEVICE,
a427ceef9   Deepak Saxena   [ARM] 2998/1: Rep...
137
138
139
140
  	}, {
  		.virtual	= XBUS_BASE,
  		.pfn		= __phys_to_pfn(0x40000000),
  		.length		= XBUS_SIZE,
6460177f4   Russell King   [ARM] Fix Footbri...
141
  		.type		= MT_DEVICE,
a427ceef9   Deepak Saxena   [ARM] 2998/1: Rep...
142
  	}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
143
144
145
146
147
148
149
150
  };
  
  /*
   * The mapping when the footbridge is in host mode.  We don't map any of
   * this when we are in add-in mode.
   */
  static struct map_desc ebsa285_host_io_desc[] __initdata = {
  #if defined(CONFIG_ARCH_FOOTBRIDGE) && defined(CONFIG_FOOTBRIDGE_HOST)
a427ceef9   Deepak Saxena   [ARM] 2998/1: Rep...
151
152
153
154
  	{
  		.virtual	= PCIMEM_BASE,
  		.pfn		= __phys_to_pfn(DC21285_PCI_MEM),
  		.length		= PCIMEM_SIZE,
6460177f4   Russell King   [ARM] Fix Footbri...
155
  		.type		= MT_DEVICE,
a427ceef9   Deepak Saxena   [ARM] 2998/1: Rep...
156
157
158
159
  	}, {
  		.virtual	= PCICFG0_BASE,
  		.pfn		= __phys_to_pfn(DC21285_PCI_TYPE_0_CONFIG),
  		.length		= PCICFG0_SIZE,
6460177f4   Russell King   [ARM] Fix Footbri...
160
  		.type		= MT_DEVICE,
a427ceef9   Deepak Saxena   [ARM] 2998/1: Rep...
161
162
163
164
  	}, {
  		.virtual	= PCICFG1_BASE,
  		.pfn		= __phys_to_pfn(DC21285_PCI_TYPE_1_CONFIG),
  		.length		= PCICFG1_SIZE,
6460177f4   Russell King   [ARM] Fix Footbri...
165
  		.type		= MT_DEVICE,
a427ceef9   Deepak Saxena   [ARM] 2998/1: Rep...
166
167
168
169
  	}, {
  		.virtual	= PCIIACK_BASE,
  		.pfn		= __phys_to_pfn(DC21285_PCI_IACK),
  		.length		= PCIIACK_SIZE,
6460177f4   Russell King   [ARM] Fix Footbri...
170
  		.type		= MT_DEVICE,
a427ceef9   Deepak Saxena   [ARM] 2998/1: Rep...
171
172
173
174
  	}, {
  		.virtual	= PCIO_BASE,
  		.pfn		= __phys_to_pfn(DC21285_PCI_IO),
  		.length		= PCIO_SIZE,
6460177f4   Russell King   [ARM] Fix Footbri...
175
176
  		.type		= MT_DEVICE,
  	},
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
177
178
  #endif
  };
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
179
180
181
182
183
184
185
186
187
188
189
190
  void __init footbridge_map_io(void)
  {
  	/*
  	 * Set up the common mapping first; we need this to
  	 * determine whether we're in host mode or not.
  	 */
  	iotable_init(fb_common_io_desc, ARRAY_SIZE(fb_common_io_desc));
  
  	/*
  	 * Now, work out what we've got to map in addition on this
  	 * platform.
  	 */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
191
192
193
194
195
  	if (footbridge_cfn_mode())
  		iotable_init(ebsa285_host_io_desc, ARRAY_SIZE(ebsa285_host_io_desc));
  }
  
  #ifdef CONFIG_FOOTBRIDGE_ADDIN
c7baab5d1   Russell King   ARM: fix clps711x...
196
197
198
199
  static inline unsigned long fb_bus_sdram_offset(void)
  {
  	return *CSR_PCISDRAMBASE & 0xfffffff0;
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
200
201
202
203
204
205
206
207
  /*
   * These two functions convert virtual addresses to PCI addresses and PCI
   * addresses to virtual addresses.  Note that it is only legal to use these
   * on memory obtained via get_zeroed_page or kmalloc.
   */
  unsigned long __virt_to_bus(unsigned long res)
  {
  	WARN_ON(res < PAGE_OFFSET || res >= (unsigned long)high_memory);
c7baab5d1   Russell King   ARM: fix clps711x...
208
  	return res + (fb_bus_sdram_offset() - PAGE_OFFSET);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
209
210
211
212
213
  }
  EXPORT_SYMBOL(__virt_to_bus);
  
  unsigned long __bus_to_virt(unsigned long res)
  {
c7baab5d1   Russell King   ARM: fix clps711x...
214
  	res = res - (fb_bus_sdram_offset() - PAGE_OFFSET);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
215
216
217
218
219
220
  
  	WARN_ON(res < PAGE_OFFSET || res >= (unsigned long)high_memory);
  
  	return res;
  }
  EXPORT_SYMBOL(__bus_to_virt);
c7baab5d1   Russell King   ARM: fix clps711x...
221
222
  unsigned long __pfn_to_bus(unsigned long pfn)
  {
64dd3b74d   wanzongshun   ARM: 6233/1: Dele...
223
  	return __pfn_to_phys(pfn) + (fb_bus_sdram_offset() - PHYS_OFFSET);
c7baab5d1   Russell King   ARM: fix clps711x...
224
225
226
227
228
229
230
231
  }
  EXPORT_SYMBOL(__pfn_to_bus);
  
  unsigned long __bus_to_pfn(unsigned long bus)
  {
  	return __phys_to_pfn(bus - (fb_bus_sdram_offset() - PHYS_OFFSET));
  }
  EXPORT_SYMBOL(__bus_to_pfn);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
232
  #endif