Blame view

arch/arm/mach-spear3xx/spear310.c 6.88 KB
bc4e814e5   viresh kumar   ARM: 6017/1: ST S...
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
  /*
   * arch/arm/mach-spear3xx/spear310.c
   *
   * SPEAr310 machine source file
   *
   * Copyright (C) 2009 ST Microelectronics
   * Viresh Kumar<viresh.kumar@st.com>
   *
   * This file is licensed under the terms of the GNU General Public
   * License version 2. This program is licensed "as is" without any
   * warranty of any kind, whether express or implied.
   */
  
  #include <linux/ptrace.h>
  #include <asm/irq.h>
410782beb   viresh kumar   ARM: 6787/1: SPEA...
16
  #include <plat/shirq.h>
bc4e814e5   viresh kumar   ARM: 6017/1: ST S...
17
  #include <mach/generic.h>
02aa06bc4   viresh kumar   ARM: 6788/1: SPEA...
18
  #include <mach/hardware.h>
bc4e814e5   viresh kumar   ARM: 6017/1: ST S...
19

70f4c0bf9   viresh kumar   ARM: 6020/1: ST S...
20
21
22
23
24
  /* pad multiplexing support */
  /* muxing registers */
  #define PAD_MUX_CONFIG_REG	0x08
  
  /* devices */
6618c3ada   Ryan Mallon   ARM: 6930/1: SPEA...
25
  static struct pmx_dev_mode pmx_emi_cs_0_1_4_5_modes[] = {
70f4c0bf9   viresh kumar   ARM: 6020/1: ST S...
26
27
28
29
30
  	{
  		.ids = 0x00,
  		.mask = PMX_TIMER_3_4_MASK,
  	},
  };
6618c3ada   Ryan Mallon   ARM: 6930/1: SPEA...
31
  struct pmx_dev spear310_pmx_emi_cs_0_1_4_5 = {
70f4c0bf9   viresh kumar   ARM: 6020/1: ST S...
32
33
34
35
36
  	.name = "emi_cs_0_1_4_5",
  	.modes = pmx_emi_cs_0_1_4_5_modes,
  	.mode_count = ARRAY_SIZE(pmx_emi_cs_0_1_4_5_modes),
  	.enb_on_reset = 1,
  };
6618c3ada   Ryan Mallon   ARM: 6930/1: SPEA...
37
  static struct pmx_dev_mode pmx_emi_cs_2_3_modes[] = {
70f4c0bf9   viresh kumar   ARM: 6020/1: ST S...
38
39
40
41
42
  	{
  		.ids = 0x00,
  		.mask = PMX_TIMER_1_2_MASK,
  	},
  };
6618c3ada   Ryan Mallon   ARM: 6930/1: SPEA...
43
  struct pmx_dev spear310_pmx_emi_cs_2_3 = {
70f4c0bf9   viresh kumar   ARM: 6020/1: ST S...
44
45
46
47
48
  	.name = "emi_cs_2_3",
  	.modes = pmx_emi_cs_2_3_modes,
  	.mode_count = ARRAY_SIZE(pmx_emi_cs_2_3_modes),
  	.enb_on_reset = 1,
  };
6618c3ada   Ryan Mallon   ARM: 6930/1: SPEA...
49
  static struct pmx_dev_mode pmx_uart1_modes[] = {
70f4c0bf9   viresh kumar   ARM: 6020/1: ST S...
50
51
52
53
54
  	{
  		.ids = 0x00,
  		.mask = PMX_FIRDA_MASK,
  	},
  };
6618c3ada   Ryan Mallon   ARM: 6930/1: SPEA...
55
  struct pmx_dev spear310_pmx_uart1 = {
70f4c0bf9   viresh kumar   ARM: 6020/1: ST S...
56
57
58
59
60
  	.name = "uart1",
  	.modes = pmx_uart1_modes,
  	.mode_count = ARRAY_SIZE(pmx_uart1_modes),
  	.enb_on_reset = 1,
  };
6618c3ada   Ryan Mallon   ARM: 6930/1: SPEA...
61
  static struct pmx_dev_mode pmx_uart2_modes[] = {
70f4c0bf9   viresh kumar   ARM: 6020/1: ST S...
62
63
64
65
66
  	{
  		.ids = 0x00,
  		.mask = PMX_TIMER_1_2_MASK,
  	},
  };
6618c3ada   Ryan Mallon   ARM: 6930/1: SPEA...
67
  struct pmx_dev spear310_pmx_uart2 = {
70f4c0bf9   viresh kumar   ARM: 6020/1: ST S...
68
69
70
71
72
  	.name = "uart2",
  	.modes = pmx_uart2_modes,
  	.mode_count = ARRAY_SIZE(pmx_uart2_modes),
  	.enb_on_reset = 1,
  };
6618c3ada   Ryan Mallon   ARM: 6930/1: SPEA...
73
  static struct pmx_dev_mode pmx_uart3_4_5_modes[] = {
70f4c0bf9   viresh kumar   ARM: 6020/1: ST S...
74
75
76
77
78
  	{
  		.ids = 0x00,
  		.mask = PMX_UART0_MODEM_MASK,
  	},
  };
6618c3ada   Ryan Mallon   ARM: 6930/1: SPEA...
79
  struct pmx_dev spear310_pmx_uart3_4_5 = {
70f4c0bf9   viresh kumar   ARM: 6020/1: ST S...
80
81
82
83
84
  	.name = "uart3_4_5",
  	.modes = pmx_uart3_4_5_modes,
  	.mode_count = ARRAY_SIZE(pmx_uart3_4_5_modes),
  	.enb_on_reset = 1,
  };
6618c3ada   Ryan Mallon   ARM: 6930/1: SPEA...
85
  static struct pmx_dev_mode pmx_fsmc_modes[] = {
70f4c0bf9   viresh kumar   ARM: 6020/1: ST S...
86
87
88
89
90
  	{
  		.ids = 0x00,
  		.mask = PMX_SSP_CS_MASK,
  	},
  };
6618c3ada   Ryan Mallon   ARM: 6930/1: SPEA...
91
  struct pmx_dev spear310_pmx_fsmc = {
70f4c0bf9   viresh kumar   ARM: 6020/1: ST S...
92
93
94
95
96
  	.name = "fsmc",
  	.modes = pmx_fsmc_modes,
  	.mode_count = ARRAY_SIZE(pmx_fsmc_modes),
  	.enb_on_reset = 1,
  };
6618c3ada   Ryan Mallon   ARM: 6930/1: SPEA...
97
  static struct pmx_dev_mode pmx_rs485_0_1_modes[] = {
70f4c0bf9   viresh kumar   ARM: 6020/1: ST S...
98
99
100
101
102
  	{
  		.ids = 0x00,
  		.mask = PMX_MII_MASK,
  	},
  };
6618c3ada   Ryan Mallon   ARM: 6930/1: SPEA...
103
  struct pmx_dev spear310_pmx_rs485_0_1 = {
70f4c0bf9   viresh kumar   ARM: 6020/1: ST S...
104
105
106
107
108
  	.name = "rs485_0_1",
  	.modes = pmx_rs485_0_1_modes,
  	.mode_count = ARRAY_SIZE(pmx_rs485_0_1_modes),
  	.enb_on_reset = 1,
  };
6618c3ada   Ryan Mallon   ARM: 6930/1: SPEA...
109
  static struct pmx_dev_mode pmx_tdm0_modes[] = {
70f4c0bf9   viresh kumar   ARM: 6020/1: ST S...
110
111
112
113
114
  	{
  		.ids = 0x00,
  		.mask = PMX_MII_MASK,
  	},
  };
6618c3ada   Ryan Mallon   ARM: 6930/1: SPEA...
115
  struct pmx_dev spear310_pmx_tdm0 = {
70f4c0bf9   viresh kumar   ARM: 6020/1: ST S...
116
117
118
119
120
121
122
  	.name = "tdm0",
  	.modes = pmx_tdm0_modes,
  	.mode_count = ARRAY_SIZE(pmx_tdm0_modes),
  	.enb_on_reset = 1,
  };
  
  /* pmx driver structure */
6618c3ada   Ryan Mallon   ARM: 6930/1: SPEA...
123
  static struct pmx_driver pmx_driver = {
70f4c0bf9   viresh kumar   ARM: 6020/1: ST S...
124
125
  	.mux_reg = {.offset = PAD_MUX_CONFIG_REG, .mask = 0x00007fff},
  };
4c18e77f7   viresh kumar   ARM: 6091/1: ST S...
126
  /* spear3xx shared irq */
f6558bf92   Ryan Mallon   ARM: 6928/1: SPEA...
127
  static struct shirq_dev_config shirq_ras1_config[] = {
4c18e77f7   viresh kumar   ARM: 6091/1: ST S...
128
  	{
61e72bca0   Ryan Mallon   ARM: 6935/1: SPEA...
129
130
  		.virq = SPEAR310_VIRQ_SMII0,
  		.status_mask = SPEAR310_SMII0_IRQ_MASK,
4c18e77f7   viresh kumar   ARM: 6091/1: ST S...
131
  	}, {
61e72bca0   Ryan Mallon   ARM: 6935/1: SPEA...
132
133
  		.virq = SPEAR310_VIRQ_SMII1,
  		.status_mask = SPEAR310_SMII1_IRQ_MASK,
4c18e77f7   viresh kumar   ARM: 6091/1: ST S...
134
  	}, {
61e72bca0   Ryan Mallon   ARM: 6935/1: SPEA...
135
136
  		.virq = SPEAR310_VIRQ_SMII2,
  		.status_mask = SPEAR310_SMII2_IRQ_MASK,
4c18e77f7   viresh kumar   ARM: 6091/1: ST S...
137
  	}, {
61e72bca0   Ryan Mallon   ARM: 6935/1: SPEA...
138
139
  		.virq = SPEAR310_VIRQ_SMII3,
  		.status_mask = SPEAR310_SMII3_IRQ_MASK,
4c18e77f7   viresh kumar   ARM: 6091/1: ST S...
140
  	}, {
61e72bca0   Ryan Mallon   ARM: 6935/1: SPEA...
141
142
  		.virq = SPEAR310_VIRQ_WAKEUP_SMII0,
  		.status_mask = SPEAR310_WAKEUP_SMII0_IRQ_MASK,
4c18e77f7   viresh kumar   ARM: 6091/1: ST S...
143
  	}, {
61e72bca0   Ryan Mallon   ARM: 6935/1: SPEA...
144
145
  		.virq = SPEAR310_VIRQ_WAKEUP_SMII1,
  		.status_mask = SPEAR310_WAKEUP_SMII1_IRQ_MASK,
4c18e77f7   viresh kumar   ARM: 6091/1: ST S...
146
  	}, {
61e72bca0   Ryan Mallon   ARM: 6935/1: SPEA...
147
148
  		.virq = SPEAR310_VIRQ_WAKEUP_SMII2,
  		.status_mask = SPEAR310_WAKEUP_SMII2_IRQ_MASK,
4c18e77f7   viresh kumar   ARM: 6091/1: ST S...
149
  	}, {
61e72bca0   Ryan Mallon   ARM: 6935/1: SPEA...
150
151
  		.virq = SPEAR310_VIRQ_WAKEUP_SMII3,
  		.status_mask = SPEAR310_WAKEUP_SMII3_IRQ_MASK,
4c18e77f7   viresh kumar   ARM: 6091/1: ST S...
152
153
  	},
  };
f6558bf92   Ryan Mallon   ARM: 6928/1: SPEA...
154
  static struct spear_shirq shirq_ras1 = {
61e72bca0   Ryan Mallon   ARM: 6935/1: SPEA...
155
  	.irq = SPEAR3XX_IRQ_GEN_RAS_1,
4c18e77f7   viresh kumar   ARM: 6091/1: ST S...
156
157
158
159
  	.dev_config = shirq_ras1_config,
  	.dev_count = ARRAY_SIZE(shirq_ras1_config),
  	.regs = {
  		.enb_reg = -1,
61e72bca0   Ryan Mallon   ARM: 6935/1: SPEA...
160
161
  		.status_reg = SPEAR310_INT_STS_MASK_REG,
  		.status_reg_mask = SPEAR310_SHIRQ_RAS1_MASK,
4c18e77f7   viresh kumar   ARM: 6091/1: ST S...
162
163
164
  		.clear_reg = -1,
  	},
  };
f6558bf92   Ryan Mallon   ARM: 6928/1: SPEA...
165
  static struct shirq_dev_config shirq_ras2_config[] = {
4c18e77f7   viresh kumar   ARM: 6091/1: ST S...
166
  	{
61e72bca0   Ryan Mallon   ARM: 6935/1: SPEA...
167
168
  		.virq = SPEAR310_VIRQ_UART1,
  		.status_mask = SPEAR310_UART1_IRQ_MASK,
4c18e77f7   viresh kumar   ARM: 6091/1: ST S...
169
  	}, {
61e72bca0   Ryan Mallon   ARM: 6935/1: SPEA...
170
171
  		.virq = SPEAR310_VIRQ_UART2,
  		.status_mask = SPEAR310_UART2_IRQ_MASK,
4c18e77f7   viresh kumar   ARM: 6091/1: ST S...
172
  	}, {
61e72bca0   Ryan Mallon   ARM: 6935/1: SPEA...
173
174
  		.virq = SPEAR310_VIRQ_UART3,
  		.status_mask = SPEAR310_UART3_IRQ_MASK,
4c18e77f7   viresh kumar   ARM: 6091/1: ST S...
175
  	}, {
61e72bca0   Ryan Mallon   ARM: 6935/1: SPEA...
176
177
  		.virq = SPEAR310_VIRQ_UART4,
  		.status_mask = SPEAR310_UART4_IRQ_MASK,
4c18e77f7   viresh kumar   ARM: 6091/1: ST S...
178
  	}, {
61e72bca0   Ryan Mallon   ARM: 6935/1: SPEA...
179
180
  		.virq = SPEAR310_VIRQ_UART5,
  		.status_mask = SPEAR310_UART5_IRQ_MASK,
4c18e77f7   viresh kumar   ARM: 6091/1: ST S...
181
182
  	},
  };
f6558bf92   Ryan Mallon   ARM: 6928/1: SPEA...
183
  static struct spear_shirq shirq_ras2 = {
61e72bca0   Ryan Mallon   ARM: 6935/1: SPEA...
184
  	.irq = SPEAR3XX_IRQ_GEN_RAS_2,
4c18e77f7   viresh kumar   ARM: 6091/1: ST S...
185
186
187
188
  	.dev_config = shirq_ras2_config,
  	.dev_count = ARRAY_SIZE(shirq_ras2_config),
  	.regs = {
  		.enb_reg = -1,
61e72bca0   Ryan Mallon   ARM: 6935/1: SPEA...
189
190
  		.status_reg = SPEAR310_INT_STS_MASK_REG,
  		.status_reg_mask = SPEAR310_SHIRQ_RAS2_MASK,
4c18e77f7   viresh kumar   ARM: 6091/1: ST S...
191
192
193
  		.clear_reg = -1,
  	},
  };
f6558bf92   Ryan Mallon   ARM: 6928/1: SPEA...
194
  static struct shirq_dev_config shirq_ras3_config[] = {
4c18e77f7   viresh kumar   ARM: 6091/1: ST S...
195
  	{
61e72bca0   Ryan Mallon   ARM: 6935/1: SPEA...
196
197
  		.virq = SPEAR310_VIRQ_EMI,
  		.status_mask = SPEAR310_EMI_IRQ_MASK,
4c18e77f7   viresh kumar   ARM: 6091/1: ST S...
198
199
  	},
  };
f6558bf92   Ryan Mallon   ARM: 6928/1: SPEA...
200
  static struct spear_shirq shirq_ras3 = {
61e72bca0   Ryan Mallon   ARM: 6935/1: SPEA...
201
  	.irq = SPEAR3XX_IRQ_GEN_RAS_3,
4c18e77f7   viresh kumar   ARM: 6091/1: ST S...
202
203
204
205
  	.dev_config = shirq_ras3_config,
  	.dev_count = ARRAY_SIZE(shirq_ras3_config),
  	.regs = {
  		.enb_reg = -1,
61e72bca0   Ryan Mallon   ARM: 6935/1: SPEA...
206
207
  		.status_reg = SPEAR310_INT_STS_MASK_REG,
  		.status_reg_mask = SPEAR310_SHIRQ_RAS3_MASK,
4c18e77f7   viresh kumar   ARM: 6091/1: ST S...
208
209
210
  		.clear_reg = -1,
  	},
  };
f6558bf92   Ryan Mallon   ARM: 6928/1: SPEA...
211
  static struct shirq_dev_config shirq_intrcomm_ras_config[] = {
4c18e77f7   viresh kumar   ARM: 6091/1: ST S...
212
  	{
61e72bca0   Ryan Mallon   ARM: 6935/1: SPEA...
213
214
  		.virq = SPEAR310_VIRQ_TDM_HDLC,
  		.status_mask = SPEAR310_TDM_HDLC_IRQ_MASK,
4c18e77f7   viresh kumar   ARM: 6091/1: ST S...
215
  	}, {
61e72bca0   Ryan Mallon   ARM: 6935/1: SPEA...
216
217
  		.virq = SPEAR310_VIRQ_RS485_0,
  		.status_mask = SPEAR310_RS485_0_IRQ_MASK,
4c18e77f7   viresh kumar   ARM: 6091/1: ST S...
218
  	}, {
61e72bca0   Ryan Mallon   ARM: 6935/1: SPEA...
219
220
  		.virq = SPEAR310_VIRQ_RS485_1,
  		.status_mask = SPEAR310_RS485_1_IRQ_MASK,
4c18e77f7   viresh kumar   ARM: 6091/1: ST S...
221
222
  	},
  };
f6558bf92   Ryan Mallon   ARM: 6928/1: SPEA...
223
  static struct spear_shirq shirq_intrcomm_ras = {
61e72bca0   Ryan Mallon   ARM: 6935/1: SPEA...
224
  	.irq = SPEAR3XX_IRQ_INTRCOMM_RAS_ARM,
4c18e77f7   viresh kumar   ARM: 6091/1: ST S...
225
226
227
228
  	.dev_config = shirq_intrcomm_ras_config,
  	.dev_count = ARRAY_SIZE(shirq_intrcomm_ras_config),
  	.regs = {
  		.enb_reg = -1,
61e72bca0   Ryan Mallon   ARM: 6935/1: SPEA...
229
230
  		.status_reg = SPEAR310_INT_STS_MASK_REG,
  		.status_reg_mask = SPEAR310_SHIRQ_INTRCOMM_RAS_MASK,
4c18e77f7   viresh kumar   ARM: 6091/1: ST S...
231
232
233
  		.clear_reg = -1,
  	},
  };
c2c07831a   viresh kumar   ARM: 6791/1: SPEA...
234
  /* Add spear310 specific devices here */
70f4c0bf9   viresh kumar   ARM: 6020/1: ST S...
235
  /* spear310 routines */
6618c3ada   Ryan Mallon   ARM: 6930/1: SPEA...
236
237
  void __init spear310_init(struct pmx_mode *pmx_mode, struct pmx_dev **pmx_devs,
  		u8 pmx_dev_count)
bc4e814e5   viresh kumar   ARM: 6017/1: ST S...
238
  {
4c18e77f7   viresh kumar   ARM: 6091/1: ST S...
239
240
  	void __iomem *base;
  	int ret = 0;
bc4e814e5   viresh kumar   ARM: 6017/1: ST S...
241
242
  	/* call spear3xx family common init function */
  	spear3xx_init();
4c18e77f7   viresh kumar   ARM: 6091/1: ST S...
243

b595076a1   Uwe Kleine-König   tree-wide: fix co...
244
  	/* shared irq registration */
53821162f   viresh kumar   ARM: 6792/1: SPEA...
245
  	base = ioremap(SPEAR310_SOC_CONFIG_BASE, SZ_4K);
4c18e77f7   viresh kumar   ARM: 6091/1: ST S...
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
  	if (base) {
  		/* shirq 1 */
  		shirq_ras1.regs.base = base;
  		ret = spear_shirq_register(&shirq_ras1);
  		if (ret)
  			printk(KERN_ERR "Error registering Shared IRQ 1
  ");
  
  		/* shirq 2 */
  		shirq_ras2.regs.base = base;
  		ret = spear_shirq_register(&shirq_ras2);
  		if (ret)
  			printk(KERN_ERR "Error registering Shared IRQ 2
  ");
  
  		/* shirq 3 */
  		shirq_ras3.regs.base = base;
  		ret = spear_shirq_register(&shirq_ras3);
  		if (ret)
  			printk(KERN_ERR "Error registering Shared IRQ 3
  ");
  
  		/* shirq 4 */
  		shirq_intrcomm_ras.regs.base = base;
  		ret = spear_shirq_register(&shirq_intrcomm_ras);
  		if (ret)
  			printk(KERN_ERR "Error registering Shared IRQ 4
  ");
  	}
70f4c0bf9   viresh kumar   ARM: 6020/1: ST S...
275

53688c51e   viresh kumar   ARM: 6678/1: SPEA...
276
277
  	/* pmx initialization */
  	pmx_driver.base = base;
6618c3ada   Ryan Mallon   ARM: 6930/1: SPEA...
278
279
280
  	pmx_driver.mode = pmx_mode;
  	pmx_driver.devs = pmx_devs;
  	pmx_driver.devs_count = pmx_dev_count;
53688c51e   viresh kumar   ARM: 6678/1: SPEA...
281
282
283
284
285
  	ret = pmx_register(&pmx_driver);
  	if (ret)
  		printk(KERN_ERR "padmux: registeration failed. err no: %d
  ",
  				ret);
70f4c0bf9   viresh kumar   ARM: 6020/1: ST S...
286
  }