blob: febcdd8d4e9280ae52e146494246a9c728a69053 [file] [log] [blame]
viresh kumarbc4e8142010-04-01 12:30:58 +01001/*
2 * arch/arm/mach-spear3xx/spear300.c
3 *
4 * SPEAr300 machine source file
5 *
Viresh Kumarc5fa4fd2012-03-23 00:17:43 +05306 * Copyright (C) 2009-2012 ST Microelectronics
7 * Viresh Kumar <viresh.kumar@st.com>
viresh kumarbc4e8142010-04-01 12:30:58 +01008 *
9 * This file is licensed under the terms of the GNU General Public
10 * License version 2. This program is licensed "as is" without any
11 * warranty of any kind, whether express or implied.
12 */
13
Viresh Kumar5fb00f92012-03-26 10:39:43 +053014#define pr_fmt(fmt) "SPEAr300: " fmt
15
Viresh Kumar0b7ee712012-03-26 10:29:23 +053016#include <linux/amba/pl08x.h>
Viresh Kumarc5fa4fd2012-03-23 00:17:43 +053017#include <linux/of_platform.h>
18#include <asm/hardware/vic.h>
19#include <asm/mach/arch.h>
viresh kumar410782b2011-03-07 05:57:01 +010020#include <plat/shirq.h>
viresh kumarbc4e8142010-04-01 12:30:58 +010021#include <mach/generic.h>
Arnd Bergmann5019f0b2012-04-11 17:30:11 +000022#include <mach/spear.h>
23
24/* Base address of various IPs */
25#define SPEAR300_TELECOM_BASE UL(0x50000000)
26
27/* Interrupt registers offsets and masks */
28#define SPEAR300_INT_ENB_MASK_REG 0x54
29#define SPEAR300_INT_STS_MASK_REG 0x58
30#define SPEAR300_IT_PERS_S_IRQ_MASK (1 << 0)
31#define SPEAR300_IT_CHANGE_S_IRQ_MASK (1 << 1)
32#define SPEAR300_I2S_IRQ_MASK (1 << 2)
33#define SPEAR300_TDM_IRQ_MASK (1 << 3)
34#define SPEAR300_CAMERA_L_IRQ_MASK (1 << 4)
35#define SPEAR300_CAMERA_F_IRQ_MASK (1 << 5)
36#define SPEAR300_CAMERA_V_IRQ_MASK (1 << 6)
37#define SPEAR300_KEYBOARD_IRQ_MASK (1 << 7)
38#define SPEAR300_GPIO1_IRQ_MASK (1 << 8)
39
40#define SPEAR300_SHIRQ_RAS1_MASK 0x1FF
41
42#define SPEAR300_SOC_CONFIG_BASE UL(0x99000000)
43
44
45/* SPEAr300 Virtual irq definitions */
46/* IRQs sharing IRQ_GEN_RAS_1 */
47#define SPEAR300_VIRQ_IT_PERS_S (SPEAR3XX_VIRQ_START + 0)
48#define SPEAR300_VIRQ_IT_CHANGE_S (SPEAR3XX_VIRQ_START + 1)
49#define SPEAR300_VIRQ_I2S (SPEAR3XX_VIRQ_START + 2)
50#define SPEAR300_VIRQ_TDM (SPEAR3XX_VIRQ_START + 3)
51#define SPEAR300_VIRQ_CAMERA_L (SPEAR3XX_VIRQ_START + 4)
52#define SPEAR300_VIRQ_CAMERA_F (SPEAR3XX_VIRQ_START + 5)
53#define SPEAR300_VIRQ_CAMERA_V (SPEAR3XX_VIRQ_START + 6)
54#define SPEAR300_VIRQ_KEYBOARD (SPEAR3XX_VIRQ_START + 7)
55#define SPEAR300_VIRQ_GPIO1 (SPEAR3XX_VIRQ_START + 8)
56
57/* IRQs sharing IRQ_GEN_RAS_3 */
58#define SPEAR300_IRQ_CLCD SPEAR3XX_IRQ_GEN_RAS_3
59
60/* IRQs sharing IRQ_INTRCOMM_RAS_ARM */
61#define SPEAR300_IRQ_SDHCI SPEAR3XX_IRQ_INTRCOMM_RAS_ARM
viresh kumarbc4e8142010-04-01 12:30:58 +010062
viresh kumar70f4c0b2010-04-01 12:31:29 +010063/* pad multiplexing support */
64/* muxing registers */
65#define PAD_MUX_CONFIG_REG 0x00
66#define MODE_CONFIG_REG 0x04
67
68/* modes */
69#define NAND_MODE (1 << 0)
70#define NOR_MODE (1 << 1)
71#define PHOTO_FRAME_MODE (1 << 2)
72#define LEND_IP_PHONE_MODE (1 << 3)
73#define HEND_IP_PHONE_MODE (1 << 4)
74#define LEND_WIFI_PHONE_MODE (1 << 5)
75#define HEND_WIFI_PHONE_MODE (1 << 6)
76#define ATA_PABX_WI2S_MODE (1 << 7)
77#define ATA_PABX_I2S_MODE (1 << 8)
78#define CAML_LCDW_MODE (1 << 9)
79#define CAMU_LCD_MODE (1 << 10)
80#define CAMU_WLCD_MODE (1 << 11)
81#define CAML_LCD_MODE (1 << 12)
82#define ALL_MODES 0x1FFF
83
Ryan Mallon6618c3a2011-05-20 08:34:22 +010084struct pmx_mode spear300_nand_mode = {
viresh kumar70f4c0b2010-04-01 12:31:29 +010085 .id = NAND_MODE,
86 .name = "nand mode",
87 .mask = 0x00,
88};
89
Ryan Mallon6618c3a2011-05-20 08:34:22 +010090struct pmx_mode spear300_nor_mode = {
viresh kumar70f4c0b2010-04-01 12:31:29 +010091 .id = NOR_MODE,
92 .name = "nor mode",
93 .mask = 0x01,
94};
95
Ryan Mallon6618c3a2011-05-20 08:34:22 +010096struct pmx_mode spear300_photo_frame_mode = {
viresh kumar70f4c0b2010-04-01 12:31:29 +010097 .id = PHOTO_FRAME_MODE,
98 .name = "photo frame mode",
99 .mask = 0x02,
100};
101
Ryan Mallon6618c3a2011-05-20 08:34:22 +0100102struct pmx_mode spear300_lend_ip_phone_mode = {
viresh kumar70f4c0b2010-04-01 12:31:29 +0100103 .id = LEND_IP_PHONE_MODE,
104 .name = "lend ip phone mode",
105 .mask = 0x03,
106};
107
Ryan Mallon6618c3a2011-05-20 08:34:22 +0100108struct pmx_mode spear300_hend_ip_phone_mode = {
viresh kumar70f4c0b2010-04-01 12:31:29 +0100109 .id = HEND_IP_PHONE_MODE,
110 .name = "hend ip phone mode",
111 .mask = 0x04,
112};
113
Ryan Mallon6618c3a2011-05-20 08:34:22 +0100114struct pmx_mode spear300_lend_wifi_phone_mode = {
viresh kumar70f4c0b2010-04-01 12:31:29 +0100115 .id = LEND_WIFI_PHONE_MODE,
116 .name = "lend wifi phone mode",
117 .mask = 0x05,
118};
119
Ryan Mallon6618c3a2011-05-20 08:34:22 +0100120struct pmx_mode spear300_hend_wifi_phone_mode = {
viresh kumar70f4c0b2010-04-01 12:31:29 +0100121 .id = HEND_WIFI_PHONE_MODE,
122 .name = "hend wifi phone mode",
123 .mask = 0x06,
124};
125
Ryan Mallon6618c3a2011-05-20 08:34:22 +0100126struct pmx_mode spear300_ata_pabx_wi2s_mode = {
viresh kumar70f4c0b2010-04-01 12:31:29 +0100127 .id = ATA_PABX_WI2S_MODE,
128 .name = "ata pabx wi2s mode",
129 .mask = 0x07,
130};
131
Ryan Mallon6618c3a2011-05-20 08:34:22 +0100132struct pmx_mode spear300_ata_pabx_i2s_mode = {
viresh kumar70f4c0b2010-04-01 12:31:29 +0100133 .id = ATA_PABX_I2S_MODE,
134 .name = "ata pabx i2s mode",
135 .mask = 0x08,
136};
137
Ryan Mallon6618c3a2011-05-20 08:34:22 +0100138struct pmx_mode spear300_caml_lcdw_mode = {
viresh kumar70f4c0b2010-04-01 12:31:29 +0100139 .id = CAML_LCDW_MODE,
140 .name = "caml lcdw mode",
141 .mask = 0x0C,
142};
143
Ryan Mallon6618c3a2011-05-20 08:34:22 +0100144struct pmx_mode spear300_camu_lcd_mode = {
viresh kumar70f4c0b2010-04-01 12:31:29 +0100145 .id = CAMU_LCD_MODE,
146 .name = "camu lcd mode",
147 .mask = 0x0D,
148};
149
Ryan Mallon6618c3a2011-05-20 08:34:22 +0100150struct pmx_mode spear300_camu_wlcd_mode = {
viresh kumar70f4c0b2010-04-01 12:31:29 +0100151 .id = CAMU_WLCD_MODE,
152 .name = "camu wlcd mode",
153 .mask = 0x0E,
154};
155
Ryan Mallon6618c3a2011-05-20 08:34:22 +0100156struct pmx_mode spear300_caml_lcd_mode = {
viresh kumar70f4c0b2010-04-01 12:31:29 +0100157 .id = CAML_LCD_MODE,
158 .name = "caml lcd mode",
159 .mask = 0x0F,
160};
161
162/* devices */
Ryan Mallon6618c3a2011-05-20 08:34:22 +0100163static struct pmx_dev_mode pmx_fsmc_2_chips_modes[] = {
viresh kumar70f4c0b2010-04-01 12:31:29 +0100164 {
165 .ids = NAND_MODE | NOR_MODE | PHOTO_FRAME_MODE |
166 ATA_PABX_WI2S_MODE | ATA_PABX_I2S_MODE,
167 .mask = PMX_FIRDA_MASK,
168 },
169};
170
Ryan Mallon6618c3a2011-05-20 08:34:22 +0100171struct pmx_dev spear300_pmx_fsmc_2_chips = {
viresh kumar70f4c0b2010-04-01 12:31:29 +0100172 .name = "fsmc_2_chips",
173 .modes = pmx_fsmc_2_chips_modes,
174 .mode_count = ARRAY_SIZE(pmx_fsmc_2_chips_modes),
175 .enb_on_reset = 1,
176};
177
Ryan Mallon6618c3a2011-05-20 08:34:22 +0100178static struct pmx_dev_mode pmx_fsmc_4_chips_modes[] = {
viresh kumar70f4c0b2010-04-01 12:31:29 +0100179 {
180 .ids = NAND_MODE | NOR_MODE | PHOTO_FRAME_MODE |
181 ATA_PABX_WI2S_MODE | ATA_PABX_I2S_MODE,
182 .mask = PMX_FIRDA_MASK | PMX_UART0_MASK,
183 },
184};
185
Ryan Mallon6618c3a2011-05-20 08:34:22 +0100186struct pmx_dev spear300_pmx_fsmc_4_chips = {
viresh kumar70f4c0b2010-04-01 12:31:29 +0100187 .name = "fsmc_4_chips",
188 .modes = pmx_fsmc_4_chips_modes,
189 .mode_count = ARRAY_SIZE(pmx_fsmc_4_chips_modes),
190 .enb_on_reset = 1,
191};
192
Ryan Mallon6618c3a2011-05-20 08:34:22 +0100193static struct pmx_dev_mode pmx_keyboard_modes[] = {
viresh kumar70f4c0b2010-04-01 12:31:29 +0100194 {
195 .ids = LEND_IP_PHONE_MODE | HEND_IP_PHONE_MODE |
196 LEND_WIFI_PHONE_MODE | HEND_WIFI_PHONE_MODE |
197 CAML_LCDW_MODE | CAMU_LCD_MODE | CAMU_WLCD_MODE |
198 CAML_LCD_MODE,
199 .mask = 0x0,
200 },
201};
202
Ryan Mallon6618c3a2011-05-20 08:34:22 +0100203struct pmx_dev spear300_pmx_keyboard = {
viresh kumar70f4c0b2010-04-01 12:31:29 +0100204 .name = "keyboard",
205 .modes = pmx_keyboard_modes,
206 .mode_count = ARRAY_SIZE(pmx_keyboard_modes),
207 .enb_on_reset = 1,
208};
209
Ryan Mallon6618c3a2011-05-20 08:34:22 +0100210static struct pmx_dev_mode pmx_clcd_modes[] = {
viresh kumar70f4c0b2010-04-01 12:31:29 +0100211 {
212 .ids = PHOTO_FRAME_MODE,
213 .mask = PMX_TIMER_1_2_MASK | PMX_TIMER_3_4_MASK ,
214 }, {
215 .ids = HEND_IP_PHONE_MODE | HEND_WIFI_PHONE_MODE |
216 CAMU_LCD_MODE | CAML_LCD_MODE,
217 .mask = PMX_TIMER_3_4_MASK,
218 },
219};
220
Ryan Mallon6618c3a2011-05-20 08:34:22 +0100221struct pmx_dev spear300_pmx_clcd = {
viresh kumar70f4c0b2010-04-01 12:31:29 +0100222 .name = "clcd",
223 .modes = pmx_clcd_modes,
224 .mode_count = ARRAY_SIZE(pmx_clcd_modes),
225 .enb_on_reset = 1,
226};
227
Ryan Mallon6618c3a2011-05-20 08:34:22 +0100228static struct pmx_dev_mode pmx_telecom_gpio_modes[] = {
viresh kumar70f4c0b2010-04-01 12:31:29 +0100229 {
230 .ids = PHOTO_FRAME_MODE | CAMU_LCD_MODE | CAML_LCD_MODE,
231 .mask = PMX_MII_MASK,
232 }, {
233 .ids = LEND_IP_PHONE_MODE | LEND_WIFI_PHONE_MODE,
234 .mask = PMX_MII_MASK | PMX_TIMER_1_2_MASK | PMX_TIMER_3_4_MASK,
235 }, {
236 .ids = ATA_PABX_I2S_MODE | CAML_LCDW_MODE | CAMU_WLCD_MODE,
237 .mask = PMX_MII_MASK | PMX_TIMER_3_4_MASK,
238 }, {
239 .ids = HEND_IP_PHONE_MODE | HEND_WIFI_PHONE_MODE,
240 .mask = PMX_MII_MASK | PMX_TIMER_1_2_MASK,
241 }, {
242 .ids = ATA_PABX_WI2S_MODE,
243 .mask = PMX_MII_MASK | PMX_TIMER_1_2_MASK | PMX_TIMER_3_4_MASK
244 | PMX_UART0_MODEM_MASK,
245 },
246};
247
Ryan Mallon6618c3a2011-05-20 08:34:22 +0100248struct pmx_dev spear300_pmx_telecom_gpio = {
viresh kumar70f4c0b2010-04-01 12:31:29 +0100249 .name = "telecom_gpio",
250 .modes = pmx_telecom_gpio_modes,
251 .mode_count = ARRAY_SIZE(pmx_telecom_gpio_modes),
252 .enb_on_reset = 1,
253};
254
Ryan Mallon6618c3a2011-05-20 08:34:22 +0100255static struct pmx_dev_mode pmx_telecom_tdm_modes[] = {
viresh kumar70f4c0b2010-04-01 12:31:29 +0100256 {
257 .ids = PHOTO_FRAME_MODE | LEND_IP_PHONE_MODE |
258 HEND_IP_PHONE_MODE | LEND_WIFI_PHONE_MODE
259 | HEND_WIFI_PHONE_MODE | ATA_PABX_WI2S_MODE
260 | ATA_PABX_I2S_MODE | CAML_LCDW_MODE | CAMU_LCD_MODE
261 | CAMU_WLCD_MODE | CAML_LCD_MODE,
262 .mask = PMX_UART0_MODEM_MASK | PMX_SSP_CS_MASK,
263 },
264};
265
Ryan Mallon6618c3a2011-05-20 08:34:22 +0100266struct pmx_dev spear300_pmx_telecom_tdm = {
viresh kumar70f4c0b2010-04-01 12:31:29 +0100267 .name = "telecom_tdm",
268 .modes = pmx_telecom_tdm_modes,
269 .mode_count = ARRAY_SIZE(pmx_telecom_tdm_modes),
270 .enb_on_reset = 1,
271};
272
Ryan Mallon6618c3a2011-05-20 08:34:22 +0100273static struct pmx_dev_mode pmx_telecom_spi_cs_i2c_clk_modes[] = {
viresh kumar70f4c0b2010-04-01 12:31:29 +0100274 {
275 .ids = LEND_IP_PHONE_MODE | HEND_IP_PHONE_MODE |
276 LEND_WIFI_PHONE_MODE | HEND_WIFI_PHONE_MODE
277 | ATA_PABX_WI2S_MODE | ATA_PABX_I2S_MODE |
278 CAML_LCDW_MODE | CAML_LCD_MODE,
279 .mask = PMX_TIMER_1_2_MASK | PMX_TIMER_3_4_MASK,
280 },
281};
282
Ryan Mallon6618c3a2011-05-20 08:34:22 +0100283struct pmx_dev spear300_pmx_telecom_spi_cs_i2c_clk = {
viresh kumar70f4c0b2010-04-01 12:31:29 +0100284 .name = "telecom_spi_cs_i2c_clk",
285 .modes = pmx_telecom_spi_cs_i2c_clk_modes,
286 .mode_count = ARRAY_SIZE(pmx_telecom_spi_cs_i2c_clk_modes),
287 .enb_on_reset = 1,
288};
289
Ryan Mallon6618c3a2011-05-20 08:34:22 +0100290static struct pmx_dev_mode pmx_telecom_camera_modes[] = {
viresh kumar70f4c0b2010-04-01 12:31:29 +0100291 {
292 .ids = CAML_LCDW_MODE | CAML_LCD_MODE,
293 .mask = PMX_MII_MASK,
294 }, {
295 .ids = CAMU_LCD_MODE | CAMU_WLCD_MODE,
296 .mask = PMX_TIMER_1_2_MASK | PMX_TIMER_3_4_MASK | PMX_MII_MASK,
297 },
298};
299
Ryan Mallon6618c3a2011-05-20 08:34:22 +0100300struct pmx_dev spear300_pmx_telecom_camera = {
viresh kumar70f4c0b2010-04-01 12:31:29 +0100301 .name = "telecom_camera",
302 .modes = pmx_telecom_camera_modes,
303 .mode_count = ARRAY_SIZE(pmx_telecom_camera_modes),
304 .enb_on_reset = 1,
305};
306
Ryan Mallon6618c3a2011-05-20 08:34:22 +0100307static struct pmx_dev_mode pmx_telecom_dac_modes[] = {
viresh kumar70f4c0b2010-04-01 12:31:29 +0100308 {
309 .ids = ATA_PABX_I2S_MODE | CAML_LCDW_MODE | CAMU_LCD_MODE
310 | CAMU_WLCD_MODE | CAML_LCD_MODE,
311 .mask = PMX_TIMER_1_2_MASK,
312 },
313};
314
Ryan Mallon6618c3a2011-05-20 08:34:22 +0100315struct pmx_dev spear300_pmx_telecom_dac = {
viresh kumar70f4c0b2010-04-01 12:31:29 +0100316 .name = "telecom_dac",
317 .modes = pmx_telecom_dac_modes,
318 .mode_count = ARRAY_SIZE(pmx_telecom_dac_modes),
319 .enb_on_reset = 1,
320};
321
Ryan Mallon6618c3a2011-05-20 08:34:22 +0100322static struct pmx_dev_mode pmx_telecom_i2s_modes[] = {
viresh kumar70f4c0b2010-04-01 12:31:29 +0100323 {
324 .ids = LEND_IP_PHONE_MODE | HEND_IP_PHONE_MODE
325 | LEND_WIFI_PHONE_MODE | HEND_WIFI_PHONE_MODE |
326 ATA_PABX_I2S_MODE | CAML_LCDW_MODE | CAMU_LCD_MODE
327 | CAMU_WLCD_MODE | CAML_LCD_MODE,
328 .mask = PMX_UART0_MODEM_MASK,
329 },
330};
331
Ryan Mallon6618c3a2011-05-20 08:34:22 +0100332struct pmx_dev spear300_pmx_telecom_i2s = {
viresh kumar70f4c0b2010-04-01 12:31:29 +0100333 .name = "telecom_i2s",
334 .modes = pmx_telecom_i2s_modes,
335 .mode_count = ARRAY_SIZE(pmx_telecom_i2s_modes),
336 .enb_on_reset = 1,
337};
338
Ryan Mallon6618c3a2011-05-20 08:34:22 +0100339static struct pmx_dev_mode pmx_telecom_boot_pins_modes[] = {
viresh kumar70f4c0b2010-04-01 12:31:29 +0100340 {
341 .ids = NAND_MODE | NOR_MODE,
342 .mask = PMX_UART0_MODEM_MASK | PMX_TIMER_1_2_MASK |
343 PMX_TIMER_3_4_MASK,
344 },
345};
346
Ryan Mallon6618c3a2011-05-20 08:34:22 +0100347struct pmx_dev spear300_pmx_telecom_boot_pins = {
viresh kumar70f4c0b2010-04-01 12:31:29 +0100348 .name = "telecom_boot_pins",
349 .modes = pmx_telecom_boot_pins_modes,
350 .mode_count = ARRAY_SIZE(pmx_telecom_boot_pins_modes),
351 .enb_on_reset = 1,
352};
353
Ryan Mallon6618c3a2011-05-20 08:34:22 +0100354static struct pmx_dev_mode pmx_telecom_sdhci_4bit_modes[] = {
viresh kumar70f4c0b2010-04-01 12:31:29 +0100355 {
356 .ids = PHOTO_FRAME_MODE | LEND_IP_PHONE_MODE |
357 HEND_IP_PHONE_MODE | LEND_WIFI_PHONE_MODE |
358 HEND_WIFI_PHONE_MODE | CAML_LCDW_MODE | CAMU_LCD_MODE |
359 CAMU_WLCD_MODE | CAML_LCD_MODE | ATA_PABX_WI2S_MODE |
360 ATA_PABX_I2S_MODE,
361 .mask = PMX_GPIO_PIN0_MASK | PMX_GPIO_PIN1_MASK |
362 PMX_GPIO_PIN2_MASK | PMX_GPIO_PIN3_MASK |
363 PMX_GPIO_PIN4_MASK | PMX_GPIO_PIN5_MASK,
364 },
365};
366
Ryan Mallon6618c3a2011-05-20 08:34:22 +0100367struct pmx_dev spear300_pmx_telecom_sdhci_4bit = {
viresh kumar069580b2011-03-07 05:57:03 +0100368 .name = "telecom_sdhci_4bit",
369 .modes = pmx_telecom_sdhci_4bit_modes,
370 .mode_count = ARRAY_SIZE(pmx_telecom_sdhci_4bit_modes),
viresh kumar70f4c0b2010-04-01 12:31:29 +0100371 .enb_on_reset = 1,
372};
373
Ryan Mallon6618c3a2011-05-20 08:34:22 +0100374static struct pmx_dev_mode pmx_telecom_sdhci_8bit_modes[] = {
viresh kumar70f4c0b2010-04-01 12:31:29 +0100375 {
376 .ids = PHOTO_FRAME_MODE | LEND_IP_PHONE_MODE |
377 HEND_IP_PHONE_MODE | LEND_WIFI_PHONE_MODE |
378 HEND_WIFI_PHONE_MODE | CAML_LCDW_MODE | CAMU_LCD_MODE |
379 CAMU_WLCD_MODE | CAML_LCD_MODE,
380 .mask = PMX_GPIO_PIN0_MASK | PMX_GPIO_PIN1_MASK |
381 PMX_GPIO_PIN2_MASK | PMX_GPIO_PIN3_MASK |
382 PMX_GPIO_PIN4_MASK | PMX_GPIO_PIN5_MASK | PMX_MII_MASK,
383 },
384};
385
Ryan Mallon6618c3a2011-05-20 08:34:22 +0100386struct pmx_dev spear300_pmx_telecom_sdhci_8bit = {
viresh kumar069580b2011-03-07 05:57:03 +0100387 .name = "telecom_sdhci_8bit",
388 .modes = pmx_telecom_sdhci_8bit_modes,
389 .mode_count = ARRAY_SIZE(pmx_telecom_sdhci_8bit_modes),
viresh kumar70f4c0b2010-04-01 12:31:29 +0100390 .enb_on_reset = 1,
391};
392
Ryan Mallon6618c3a2011-05-20 08:34:22 +0100393static struct pmx_dev_mode pmx_gpio1_modes[] = {
viresh kumar70f4c0b2010-04-01 12:31:29 +0100394 {
395 .ids = PHOTO_FRAME_MODE,
396 .mask = PMX_UART0_MODEM_MASK | PMX_TIMER_1_2_MASK |
397 PMX_TIMER_3_4_MASK,
398 },
399};
400
Ryan Mallon6618c3a2011-05-20 08:34:22 +0100401struct pmx_dev spear300_pmx_gpio1 = {
viresh kumar70f4c0b2010-04-01 12:31:29 +0100402 .name = "arm gpio1",
403 .modes = pmx_gpio1_modes,
404 .mode_count = ARRAY_SIZE(pmx_gpio1_modes),
405 .enb_on_reset = 1,
406};
407
408/* pmx driver structure */
Ryan Mallon6618c3a2011-05-20 08:34:22 +0100409static struct pmx_driver pmx_driver = {
viresh kumar70f4c0b2010-04-01 12:31:29 +0100410 .mode_reg = {.offset = MODE_CONFIG_REG, .mask = 0x0000000f},
411 .mux_reg = {.offset = PAD_MUX_CONFIG_REG, .mask = 0x00007fff},
412};
413
viresh kumar4c18e772010-05-03 09:24:30 +0100414/* spear3xx shared irq */
Ryan Mallonf6558bf2011-05-20 08:34:20 +0100415static struct shirq_dev_config shirq_ras1_config[] = {
viresh kumar4c18e772010-05-03 09:24:30 +0100416 {
Ryan Mallon61e72bc2011-05-20 08:34:21 +0100417 .virq = SPEAR300_VIRQ_IT_PERS_S,
418 .enb_mask = SPEAR300_IT_PERS_S_IRQ_MASK,
419 .status_mask = SPEAR300_IT_PERS_S_IRQ_MASK,
viresh kumar4c18e772010-05-03 09:24:30 +0100420 }, {
Ryan Mallon61e72bc2011-05-20 08:34:21 +0100421 .virq = SPEAR300_VIRQ_IT_CHANGE_S,
422 .enb_mask = SPEAR300_IT_CHANGE_S_IRQ_MASK,
423 .status_mask = SPEAR300_IT_CHANGE_S_IRQ_MASK,
viresh kumar4c18e772010-05-03 09:24:30 +0100424 }, {
Ryan Mallon61e72bc2011-05-20 08:34:21 +0100425 .virq = SPEAR300_VIRQ_I2S,
426 .enb_mask = SPEAR300_I2S_IRQ_MASK,
427 .status_mask = SPEAR300_I2S_IRQ_MASK,
viresh kumar4c18e772010-05-03 09:24:30 +0100428 }, {
Ryan Mallon61e72bc2011-05-20 08:34:21 +0100429 .virq = SPEAR300_VIRQ_TDM,
430 .enb_mask = SPEAR300_TDM_IRQ_MASK,
431 .status_mask = SPEAR300_TDM_IRQ_MASK,
viresh kumar4c18e772010-05-03 09:24:30 +0100432 }, {
Ryan Mallon61e72bc2011-05-20 08:34:21 +0100433 .virq = SPEAR300_VIRQ_CAMERA_L,
434 .enb_mask = SPEAR300_CAMERA_L_IRQ_MASK,
435 .status_mask = SPEAR300_CAMERA_L_IRQ_MASK,
viresh kumar4c18e772010-05-03 09:24:30 +0100436 }, {
Ryan Mallon61e72bc2011-05-20 08:34:21 +0100437 .virq = SPEAR300_VIRQ_CAMERA_F,
438 .enb_mask = SPEAR300_CAMERA_F_IRQ_MASK,
439 .status_mask = SPEAR300_CAMERA_F_IRQ_MASK,
viresh kumar4c18e772010-05-03 09:24:30 +0100440 }, {
Ryan Mallon61e72bc2011-05-20 08:34:21 +0100441 .virq = SPEAR300_VIRQ_CAMERA_V,
442 .enb_mask = SPEAR300_CAMERA_V_IRQ_MASK,
443 .status_mask = SPEAR300_CAMERA_V_IRQ_MASK,
viresh kumar4c18e772010-05-03 09:24:30 +0100444 }, {
Ryan Mallon61e72bc2011-05-20 08:34:21 +0100445 .virq = SPEAR300_VIRQ_KEYBOARD,
446 .enb_mask = SPEAR300_KEYBOARD_IRQ_MASK,
447 .status_mask = SPEAR300_KEYBOARD_IRQ_MASK,
viresh kumar4c18e772010-05-03 09:24:30 +0100448 }, {
Ryan Mallon61e72bc2011-05-20 08:34:21 +0100449 .virq = SPEAR300_VIRQ_GPIO1,
450 .enb_mask = SPEAR300_GPIO1_IRQ_MASK,
451 .status_mask = SPEAR300_GPIO1_IRQ_MASK,
viresh kumar4c18e772010-05-03 09:24:30 +0100452 },
453};
454
Ryan Mallonf6558bf2011-05-20 08:34:20 +0100455static struct spear_shirq shirq_ras1 = {
Ryan Mallon61e72bc2011-05-20 08:34:21 +0100456 .irq = SPEAR3XX_IRQ_GEN_RAS_1,
viresh kumar4c18e772010-05-03 09:24:30 +0100457 .dev_config = shirq_ras1_config,
458 .dev_count = ARRAY_SIZE(shirq_ras1_config),
459 .regs = {
Ryan Mallon61e72bc2011-05-20 08:34:21 +0100460 .enb_reg = SPEAR300_INT_ENB_MASK_REG,
461 .status_reg = SPEAR300_INT_STS_MASK_REG,
462 .status_reg_mask = SPEAR300_SHIRQ_RAS1_MASK,
viresh kumar4c18e772010-05-03 09:24:30 +0100463 .clear_reg = -1,
464 },
viresh kumarbc4e8142010-04-01 12:30:58 +0100465};
466
Viresh Kumarc5fa4fd2012-03-23 00:17:43 +0530467/* padmux devices to enable */
468static struct pmx_dev *spear300_evb_pmx_devs[] = {
469 /* spear3xx specific devices */
470 &spear3xx_pmx_i2c,
471 &spear3xx_pmx_ssp_cs,
472 &spear3xx_pmx_ssp,
473 &spear3xx_pmx_mii,
474 &spear3xx_pmx_uart0,
475
476 /* spear300 specific devices */
477 &spear300_pmx_fsmc_2_chips,
478 &spear300_pmx_clcd,
479 &spear300_pmx_telecom_sdhci_4bit,
480 &spear300_pmx_gpio1,
viresh kumarc2c07832011-03-07 05:57:05 +0100481};
482
Viresh Kumar0b7ee712012-03-26 10:29:23 +0530483/* DMAC platform data's slave info */
484struct pl08x_channel_data spear300_dma_info[] = {
485 {
486 .bus_id = "uart0_rx",
487 .min_signal = 2,
488 .max_signal = 2,
489 .muxval = 0,
490 .cctl = 0,
491 .periph_buses = PL08X_AHB1,
492 }, {
493 .bus_id = "uart0_tx",
494 .min_signal = 3,
495 .max_signal = 3,
496 .muxval = 0,
497 .cctl = 0,
498 .periph_buses = PL08X_AHB1,
499 }, {
500 .bus_id = "ssp0_rx",
501 .min_signal = 8,
502 .max_signal = 8,
503 .muxval = 0,
504 .cctl = 0,
505 .periph_buses = PL08X_AHB1,
506 }, {
507 .bus_id = "ssp0_tx",
508 .min_signal = 9,
509 .max_signal = 9,
510 .muxval = 0,
511 .cctl = 0,
512 .periph_buses = PL08X_AHB1,
513 }, {
514 .bus_id = "i2c_rx",
515 .min_signal = 10,
516 .max_signal = 10,
517 .muxval = 0,
518 .cctl = 0,
519 .periph_buses = PL08X_AHB1,
520 }, {
521 .bus_id = "i2c_tx",
522 .min_signal = 11,
523 .max_signal = 11,
524 .muxval = 0,
525 .cctl = 0,
526 .periph_buses = PL08X_AHB1,
527 }, {
528 .bus_id = "irda",
529 .min_signal = 12,
530 .max_signal = 12,
531 .muxval = 0,
532 .cctl = 0,
533 .periph_buses = PL08X_AHB1,
534 }, {
535 .bus_id = "adc",
536 .min_signal = 13,
537 .max_signal = 13,
538 .muxval = 0,
539 .cctl = 0,
540 .periph_buses = PL08X_AHB1,
541 }, {
542 .bus_id = "to_jpeg",
543 .min_signal = 14,
544 .max_signal = 14,
545 .muxval = 0,
546 .cctl = 0,
547 .periph_buses = PL08X_AHB1,
548 }, {
549 .bus_id = "from_jpeg",
550 .min_signal = 15,
551 .max_signal = 15,
552 .muxval = 0,
553 .cctl = 0,
554 .periph_buses = PL08X_AHB1,
555 }, {
556 .bus_id = "ras0_rx",
557 .min_signal = 0,
558 .max_signal = 0,
559 .muxval = 1,
560 .cctl = 0,
561 .periph_buses = PL08X_AHB1,
562 }, {
563 .bus_id = "ras0_tx",
564 .min_signal = 1,
565 .max_signal = 1,
566 .muxval = 1,
567 .cctl = 0,
568 .periph_buses = PL08X_AHB1,
569 }, {
570 .bus_id = "ras1_rx",
571 .min_signal = 2,
572 .max_signal = 2,
573 .muxval = 1,
574 .cctl = 0,
575 .periph_buses = PL08X_AHB1,
576 }, {
577 .bus_id = "ras1_tx",
578 .min_signal = 3,
579 .max_signal = 3,
580 .muxval = 1,
581 .cctl = 0,
582 .periph_buses = PL08X_AHB1,
583 }, {
584 .bus_id = "ras2_rx",
585 .min_signal = 4,
586 .max_signal = 4,
587 .muxval = 1,
588 .cctl = 0,
589 .periph_buses = PL08X_AHB1,
590 }, {
591 .bus_id = "ras2_tx",
592 .min_signal = 5,
593 .max_signal = 5,
594 .muxval = 1,
595 .cctl = 0,
596 .periph_buses = PL08X_AHB1,
597 }, {
598 .bus_id = "ras3_rx",
599 .min_signal = 6,
600 .max_signal = 6,
601 .muxval = 1,
602 .cctl = 0,
603 .periph_buses = PL08X_AHB1,
604 }, {
605 .bus_id = "ras3_tx",
606 .min_signal = 7,
607 .max_signal = 7,
608 .muxval = 1,
609 .cctl = 0,
610 .periph_buses = PL08X_AHB1,
611 }, {
612 .bus_id = "ras4_rx",
613 .min_signal = 8,
614 .max_signal = 8,
615 .muxval = 1,
616 .cctl = 0,
617 .periph_buses = PL08X_AHB1,
618 }, {
619 .bus_id = "ras4_tx",
620 .min_signal = 9,
621 .max_signal = 9,
622 .muxval = 1,
623 .cctl = 0,
624 .periph_buses = PL08X_AHB1,
625 }, {
626 .bus_id = "ras5_rx",
627 .min_signal = 10,
628 .max_signal = 10,
629 .muxval = 1,
630 .cctl = 0,
631 .periph_buses = PL08X_AHB1,
632 }, {
633 .bus_id = "ras5_tx",
634 .min_signal = 11,
635 .max_signal = 11,
636 .muxval = 1,
637 .cctl = 0,
638 .periph_buses = PL08X_AHB1,
639 }, {
640 .bus_id = "ras6_rx",
641 .min_signal = 12,
642 .max_signal = 12,
643 .muxval = 1,
644 .cctl = 0,
645 .periph_buses = PL08X_AHB1,
646 }, {
647 .bus_id = "ras6_tx",
648 .min_signal = 13,
649 .max_signal = 13,
650 .muxval = 1,
651 .cctl = 0,
652 .periph_buses = PL08X_AHB1,
653 }, {
654 .bus_id = "ras7_rx",
655 .min_signal = 14,
656 .max_signal = 14,
657 .muxval = 1,
658 .cctl = 0,
659 .periph_buses = PL08X_AHB1,
660 }, {
661 .bus_id = "ras7_tx",
662 .min_signal = 15,
663 .max_signal = 15,
664 .muxval = 1,
665 .cctl = 0,
666 .periph_buses = PL08X_AHB1,
667 },
668};
669
Viresh Kumarc5fa4fd2012-03-23 00:17:43 +0530670/* Add SPEAr300 auxdata to pass platform data */
671static struct of_dev_auxdata spear300_auxdata_lookup[] __initdata = {
672 OF_DEV_AUXDATA("arm,pl022", SPEAR3XX_ICM1_SSP_BASE, NULL,
673 &pl022_plat_data),
Viresh Kumar0b7ee712012-03-26 10:29:23 +0530674 OF_DEV_AUXDATA("arm,pl080", SPEAR3XX_ICM3_DMA_BASE, NULL,
675 &pl080_plat_data),
Viresh Kumarc5fa4fd2012-03-23 00:17:43 +0530676 {}
677};
viresh kumarc2c07832011-03-07 05:57:05 +0100678
Viresh Kumarc5fa4fd2012-03-23 00:17:43 +0530679static void __init spear300_dt_init(void)
viresh kumarbc4e8142010-04-01 12:30:58 +0100680{
Viresh Kumarc5fa4fd2012-03-23 00:17:43 +0530681 int ret = -EINVAL;
viresh kumar4c18e772010-05-03 09:24:30 +0100682
Viresh Kumar0b7ee712012-03-26 10:29:23 +0530683 pl080_plat_data.slave_channels = spear300_dma_info;
684 pl080_plat_data.num_slave_channels = ARRAY_SIZE(spear300_dma_info);
685
Viresh Kumarc5fa4fd2012-03-23 00:17:43 +0530686 of_platform_populate(NULL, of_default_bus_match_table,
687 spear300_auxdata_lookup, NULL);
viresh kumar4c18e772010-05-03 09:24:30 +0100688
Uwe Kleine-Königb5950762010-11-01 15:38:34 -0400689 /* shared irq registration */
viresh kumar53821162011-03-07 05:57:06 +0100690 shirq_ras1.regs.base = ioremap(SPEAR300_TELECOM_BASE, SZ_4K);
viresh kumar4c18e772010-05-03 09:24:30 +0100691 if (shirq_ras1.regs.base) {
692 ret = spear_shirq_register(&shirq_ras1);
693 if (ret)
Viresh Kumar5fb00f92012-03-26 10:39:43 +0530694 pr_err("Error registering Shared IRQ\n");
viresh kumar4c18e772010-05-03 09:24:30 +0100695 }
viresh kumar70f4c0b2010-04-01 12:31:29 +0100696
Viresh Kumarc5fa4fd2012-03-23 00:17:43 +0530697 if (of_machine_is_compatible("st,spear300-evb")) {
698 /* pmx initialization */
699 pmx_driver.mode = &spear300_photo_frame_mode;
700 pmx_driver.devs = spear300_evb_pmx_devs;
701 pmx_driver.devs_count = ARRAY_SIZE(spear300_evb_pmx_devs);
Ryan Mallon6618c3a2011-05-20 08:34:22 +0100702
Viresh Kumarc5fa4fd2012-03-23 00:17:43 +0530703 pmx_driver.base = ioremap(SPEAR300_SOC_CONFIG_BASE, SZ_4K);
704 if (pmx_driver.base) {
705 ret = pmx_register(&pmx_driver);
706 if (ret)
707 pr_err("padmux: registration failed. err no: %d\n",
708 ret);
709 /* Free Mapping, device selection already done */
710 iounmap(pmx_driver.base);
711 }
712
viresh kumar53688c52011-02-16 07:40:30 +0100713 if (ret)
Viresh Kumarc5fa4fd2012-03-23 00:17:43 +0530714 pr_err("Initialization Failed");
viresh kumar53688c52011-02-16 07:40:30 +0100715 }
viresh kumar70f4c0b2010-04-01 12:31:29 +0100716}
Viresh Kumarc5fa4fd2012-03-23 00:17:43 +0530717
718static const char * const spear300_dt_board_compat[] = {
719 "st,spear300",
720 "st,spear300-evb",
721 NULL,
722};
723
724static void __init spear300_map_io(void)
725{
726 spear3xx_map_io();
727 spear300_clk_init();
728}
729
730DT_MACHINE_START(SPEAR300_DT, "ST SPEAr300 SoC with Flattened Device Tree")
731 .map_io = spear300_map_io,
732 .init_irq = spear3xx_dt_init_irq,
733 .handle_irq = vic_handle_irq,
734 .timer = &spear3xx_timer,
735 .init_machine = spear300_dt_init,
736 .restart = spear_restart,
737 .dt_compat = spear300_dt_board_compat,
738MACHINE_END