Blame view
arch/arm/mach-spear3xx/spear310.c
6.88 KB
bc4e814e5 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 ARM: 6787/1: SPEA... |
16 |
#include <plat/shirq.h> |
bc4e814e5 ARM: 6017/1: ST S... |
17 |
#include <mach/generic.h> |
02aa06bc4 ARM: 6788/1: SPEA... |
18 |
#include <mach/hardware.h> |
bc4e814e5 ARM: 6017/1: ST S... |
19 |
|
70f4c0bf9 ARM: 6020/1: ST S... |
20 21 22 23 24 |
/* pad multiplexing support */ /* muxing registers */ #define PAD_MUX_CONFIG_REG 0x08 /* devices */ |
6618c3ada ARM: 6930/1: SPEA... |
25 |
static struct pmx_dev_mode pmx_emi_cs_0_1_4_5_modes[] = { |
70f4c0bf9 ARM: 6020/1: ST S... |
26 27 28 29 30 |
{ .ids = 0x00, .mask = PMX_TIMER_3_4_MASK, }, }; |
6618c3ada ARM: 6930/1: SPEA... |
31 |
struct pmx_dev spear310_pmx_emi_cs_0_1_4_5 = { |
70f4c0bf9 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 ARM: 6930/1: SPEA... |
37 |
static struct pmx_dev_mode pmx_emi_cs_2_3_modes[] = { |
70f4c0bf9 ARM: 6020/1: ST S... |
38 39 40 41 42 |
{ .ids = 0x00, .mask = PMX_TIMER_1_2_MASK, }, }; |
6618c3ada ARM: 6930/1: SPEA... |
43 |
struct pmx_dev spear310_pmx_emi_cs_2_3 = { |
70f4c0bf9 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 ARM: 6930/1: SPEA... |
49 |
static struct pmx_dev_mode pmx_uart1_modes[] = { |
70f4c0bf9 ARM: 6020/1: ST S... |
50 51 52 53 54 |
{ .ids = 0x00, .mask = PMX_FIRDA_MASK, }, }; |
6618c3ada ARM: 6930/1: SPEA... |
55 |
struct pmx_dev spear310_pmx_uart1 = { |
70f4c0bf9 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 ARM: 6930/1: SPEA... |
61 |
static struct pmx_dev_mode pmx_uart2_modes[] = { |
70f4c0bf9 ARM: 6020/1: ST S... |
62 63 64 65 66 |
{ .ids = 0x00, .mask = PMX_TIMER_1_2_MASK, }, }; |
6618c3ada ARM: 6930/1: SPEA... |
67 |
struct pmx_dev spear310_pmx_uart2 = { |
70f4c0bf9 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 ARM: 6930/1: SPEA... |
73 |
static struct pmx_dev_mode pmx_uart3_4_5_modes[] = { |
70f4c0bf9 ARM: 6020/1: ST S... |
74 75 76 77 78 |
{ .ids = 0x00, .mask = PMX_UART0_MODEM_MASK, }, }; |
6618c3ada ARM: 6930/1: SPEA... |
79 |
struct pmx_dev spear310_pmx_uart3_4_5 = { |
70f4c0bf9 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 ARM: 6930/1: SPEA... |
85 |
static struct pmx_dev_mode pmx_fsmc_modes[] = { |
70f4c0bf9 ARM: 6020/1: ST S... |
86 87 88 89 90 |
{ .ids = 0x00, .mask = PMX_SSP_CS_MASK, }, }; |
6618c3ada ARM: 6930/1: SPEA... |
91 |
struct pmx_dev spear310_pmx_fsmc = { |
70f4c0bf9 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 ARM: 6930/1: SPEA... |
97 |
static struct pmx_dev_mode pmx_rs485_0_1_modes[] = { |
70f4c0bf9 ARM: 6020/1: ST S... |
98 99 100 101 102 |
{ .ids = 0x00, .mask = PMX_MII_MASK, }, }; |
6618c3ada ARM: 6930/1: SPEA... |
103 |
struct pmx_dev spear310_pmx_rs485_0_1 = { |
70f4c0bf9 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 ARM: 6930/1: SPEA... |
109 |
static struct pmx_dev_mode pmx_tdm0_modes[] = { |
70f4c0bf9 ARM: 6020/1: ST S... |
110 111 112 113 114 |
{ .ids = 0x00, .mask = PMX_MII_MASK, }, }; |
6618c3ada ARM: 6930/1: SPEA... |
115 |
struct pmx_dev spear310_pmx_tdm0 = { |
70f4c0bf9 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 ARM: 6930/1: SPEA... |
123 |
static struct pmx_driver pmx_driver = { |
70f4c0bf9 ARM: 6020/1: ST S... |
124 125 |
.mux_reg = {.offset = PAD_MUX_CONFIG_REG, .mask = 0x00007fff}, }; |
4c18e77f7 ARM: 6091/1: ST S... |
126 |
/* spear3xx shared irq */ |
f6558bf92 ARM: 6928/1: SPEA... |
127 |
static struct shirq_dev_config shirq_ras1_config[] = { |
4c18e77f7 ARM: 6091/1: ST S... |
128 |
{ |
61e72bca0 ARM: 6935/1: SPEA... |
129 130 |
.virq = SPEAR310_VIRQ_SMII0, .status_mask = SPEAR310_SMII0_IRQ_MASK, |
4c18e77f7 ARM: 6091/1: ST S... |
131 |
}, { |
61e72bca0 ARM: 6935/1: SPEA... |
132 133 |
.virq = SPEAR310_VIRQ_SMII1, .status_mask = SPEAR310_SMII1_IRQ_MASK, |
4c18e77f7 ARM: 6091/1: ST S... |
134 |
}, { |
61e72bca0 ARM: 6935/1: SPEA... |
135 136 |
.virq = SPEAR310_VIRQ_SMII2, .status_mask = SPEAR310_SMII2_IRQ_MASK, |
4c18e77f7 ARM: 6091/1: ST S... |
137 |
}, { |
61e72bca0 ARM: 6935/1: SPEA... |
138 139 |
.virq = SPEAR310_VIRQ_SMII3, .status_mask = SPEAR310_SMII3_IRQ_MASK, |
4c18e77f7 ARM: 6091/1: ST S... |
140 |
}, { |
61e72bca0 ARM: 6935/1: SPEA... |
141 142 |
.virq = SPEAR310_VIRQ_WAKEUP_SMII0, .status_mask = SPEAR310_WAKEUP_SMII0_IRQ_MASK, |
4c18e77f7 ARM: 6091/1: ST S... |
143 |
}, { |
61e72bca0 ARM: 6935/1: SPEA... |
144 145 |
.virq = SPEAR310_VIRQ_WAKEUP_SMII1, .status_mask = SPEAR310_WAKEUP_SMII1_IRQ_MASK, |
4c18e77f7 ARM: 6091/1: ST S... |
146 |
}, { |
61e72bca0 ARM: 6935/1: SPEA... |
147 148 |
.virq = SPEAR310_VIRQ_WAKEUP_SMII2, .status_mask = SPEAR310_WAKEUP_SMII2_IRQ_MASK, |
4c18e77f7 ARM: 6091/1: ST S... |
149 |
}, { |
61e72bca0 ARM: 6935/1: SPEA... |
150 151 |
.virq = SPEAR310_VIRQ_WAKEUP_SMII3, .status_mask = SPEAR310_WAKEUP_SMII3_IRQ_MASK, |
4c18e77f7 ARM: 6091/1: ST S... |
152 153 |
}, }; |
f6558bf92 ARM: 6928/1: SPEA... |
154 |
static struct spear_shirq shirq_ras1 = { |
61e72bca0 ARM: 6935/1: SPEA... |
155 |
.irq = SPEAR3XX_IRQ_GEN_RAS_1, |
4c18e77f7 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 ARM: 6935/1: SPEA... |
160 161 |
.status_reg = SPEAR310_INT_STS_MASK_REG, .status_reg_mask = SPEAR310_SHIRQ_RAS1_MASK, |
4c18e77f7 ARM: 6091/1: ST S... |
162 163 164 |
.clear_reg = -1, }, }; |
f6558bf92 ARM: 6928/1: SPEA... |
165 |
static struct shirq_dev_config shirq_ras2_config[] = { |
4c18e77f7 ARM: 6091/1: ST S... |
166 |
{ |
61e72bca0 ARM: 6935/1: SPEA... |
167 168 |
.virq = SPEAR310_VIRQ_UART1, .status_mask = SPEAR310_UART1_IRQ_MASK, |
4c18e77f7 ARM: 6091/1: ST S... |
169 |
}, { |
61e72bca0 ARM: 6935/1: SPEA... |
170 171 |
.virq = SPEAR310_VIRQ_UART2, .status_mask = SPEAR310_UART2_IRQ_MASK, |
4c18e77f7 ARM: 6091/1: ST S... |
172 |
}, { |
61e72bca0 ARM: 6935/1: SPEA... |
173 174 |
.virq = SPEAR310_VIRQ_UART3, .status_mask = SPEAR310_UART3_IRQ_MASK, |
4c18e77f7 ARM: 6091/1: ST S... |
175 |
}, { |
61e72bca0 ARM: 6935/1: SPEA... |
176 177 |
.virq = SPEAR310_VIRQ_UART4, .status_mask = SPEAR310_UART4_IRQ_MASK, |
4c18e77f7 ARM: 6091/1: ST S... |
178 |
}, { |
61e72bca0 ARM: 6935/1: SPEA... |
179 180 |
.virq = SPEAR310_VIRQ_UART5, .status_mask = SPEAR310_UART5_IRQ_MASK, |
4c18e77f7 ARM: 6091/1: ST S... |
181 182 |
}, }; |
f6558bf92 ARM: 6928/1: SPEA... |
183 |
static struct spear_shirq shirq_ras2 = { |
61e72bca0 ARM: 6935/1: SPEA... |
184 |
.irq = SPEAR3XX_IRQ_GEN_RAS_2, |
4c18e77f7 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 ARM: 6935/1: SPEA... |
189 190 |
.status_reg = SPEAR310_INT_STS_MASK_REG, .status_reg_mask = SPEAR310_SHIRQ_RAS2_MASK, |
4c18e77f7 ARM: 6091/1: ST S... |
191 192 193 |
.clear_reg = -1, }, }; |
f6558bf92 ARM: 6928/1: SPEA... |
194 |
static struct shirq_dev_config shirq_ras3_config[] = { |
4c18e77f7 ARM: 6091/1: ST S... |
195 |
{ |
61e72bca0 ARM: 6935/1: SPEA... |
196 197 |
.virq = SPEAR310_VIRQ_EMI, .status_mask = SPEAR310_EMI_IRQ_MASK, |
4c18e77f7 ARM: 6091/1: ST S... |
198 199 |
}, }; |
f6558bf92 ARM: 6928/1: SPEA... |
200 |
static struct spear_shirq shirq_ras3 = { |
61e72bca0 ARM: 6935/1: SPEA... |
201 |
.irq = SPEAR3XX_IRQ_GEN_RAS_3, |
4c18e77f7 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 ARM: 6935/1: SPEA... |
206 207 |
.status_reg = SPEAR310_INT_STS_MASK_REG, .status_reg_mask = SPEAR310_SHIRQ_RAS3_MASK, |
4c18e77f7 ARM: 6091/1: ST S... |
208 209 210 |
.clear_reg = -1, }, }; |
f6558bf92 ARM: 6928/1: SPEA... |
211 |
static struct shirq_dev_config shirq_intrcomm_ras_config[] = { |
4c18e77f7 ARM: 6091/1: ST S... |
212 |
{ |
61e72bca0 ARM: 6935/1: SPEA... |
213 214 |
.virq = SPEAR310_VIRQ_TDM_HDLC, .status_mask = SPEAR310_TDM_HDLC_IRQ_MASK, |
4c18e77f7 ARM: 6091/1: ST S... |
215 |
}, { |
61e72bca0 ARM: 6935/1: SPEA... |
216 217 |
.virq = SPEAR310_VIRQ_RS485_0, .status_mask = SPEAR310_RS485_0_IRQ_MASK, |
4c18e77f7 ARM: 6091/1: ST S... |
218 |
}, { |
61e72bca0 ARM: 6935/1: SPEA... |
219 220 |
.virq = SPEAR310_VIRQ_RS485_1, .status_mask = SPEAR310_RS485_1_IRQ_MASK, |
4c18e77f7 ARM: 6091/1: ST S... |
221 222 |
}, }; |
f6558bf92 ARM: 6928/1: SPEA... |
223 |
static struct spear_shirq shirq_intrcomm_ras = { |
61e72bca0 ARM: 6935/1: SPEA... |
224 |
.irq = SPEAR3XX_IRQ_INTRCOMM_RAS_ARM, |
4c18e77f7 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 ARM: 6935/1: SPEA... |
229 230 |
.status_reg = SPEAR310_INT_STS_MASK_REG, .status_reg_mask = SPEAR310_SHIRQ_INTRCOMM_RAS_MASK, |
4c18e77f7 ARM: 6091/1: ST S... |
231 232 233 |
.clear_reg = -1, }, }; |
c2c07831a ARM: 6791/1: SPEA... |
234 |
/* Add spear310 specific devices here */ |
70f4c0bf9 ARM: 6020/1: ST S... |
235 |
/* spear310 routines */ |
6618c3ada 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 ARM: 6017/1: ST S... |
238 |
{ |
4c18e77f7 ARM: 6091/1: ST S... |
239 240 |
void __iomem *base; int ret = 0; |
bc4e814e5 ARM: 6017/1: ST S... |
241 242 |
/* call spear3xx family common init function */ spear3xx_init(); |
4c18e77f7 ARM: 6091/1: ST S... |
243 |
|
b595076a1 tree-wide: fix co... |
244 |
/* shared irq registration */ |
53821162f ARM: 6792/1: SPEA... |
245 |
base = ioremap(SPEAR310_SOC_CONFIG_BASE, SZ_4K); |
4c18e77f7 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 ARM: 6020/1: ST S... |
275 |
|
53688c51e ARM: 6678/1: SPEA... |
276 277 |
/* pmx initialization */ pmx_driver.base = base; |
6618c3ada 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 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 ARM: 6020/1: ST S... |
286 |
} |