2 * arch/arm/mach-spear3xx/spear300.c
4 * SPEAr300 machine source file
6 * Copyright (C) 2009-2012 ST Microelectronics
7 * Viresh Kumar <viresh.kumar@st.com>
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.
14 #define pr_fmt(fmt) "SPEAr300: " fmt
16 #include <linux/amba/pl08x.h>
17 #include <linux/of_platform.h>
18 #include <asm/hardware/vic.h>
19 #include <asm/mach/arch.h>
20 #include <plat/shirq.h>
21 #include <mach/generic.h>
22 #include <mach/spear.h>
24 /* Base address of various IPs */
25 #define SPEAR300_TELECOM_BASE UL(0x50000000)
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)
40 #define SPEAR300_SHIRQ_RAS1_MASK 0x1FF
42 #define SPEAR300_SOC_CONFIG_BASE UL(0x99000000)
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)
57 /* IRQs sharing IRQ_GEN_RAS_3 */
58 #define SPEAR300_IRQ_CLCD SPEAR3XX_IRQ_GEN_RAS_3
60 /* IRQs sharing IRQ_INTRCOMM_RAS_ARM */
61 #define SPEAR300_IRQ_SDHCI SPEAR3XX_IRQ_INTRCOMM_RAS_ARM
63 /* pad multiplexing support */
64 /* muxing registers */
65 #define PAD_MUX_CONFIG_REG 0x00
66 #define MODE_CONFIG_REG 0x04
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
84 struct pmx_mode spear300_nand_mode = {
90 struct pmx_mode spear300_nor_mode = {
96 struct pmx_mode spear300_photo_frame_mode = {
97 .id = PHOTO_FRAME_MODE,
98 .name = "photo frame mode",
102 struct pmx_mode spear300_lend_ip_phone_mode = {
103 .id = LEND_IP_PHONE_MODE,
104 .name = "lend ip phone mode",
108 struct pmx_mode spear300_hend_ip_phone_mode = {
109 .id = HEND_IP_PHONE_MODE,
110 .name = "hend ip phone mode",
114 struct pmx_mode spear300_lend_wifi_phone_mode = {
115 .id = LEND_WIFI_PHONE_MODE,
116 .name = "lend wifi phone mode",
120 struct pmx_mode spear300_hend_wifi_phone_mode = {
121 .id = HEND_WIFI_PHONE_MODE,
122 .name = "hend wifi phone mode",
126 struct pmx_mode spear300_ata_pabx_wi2s_mode = {
127 .id = ATA_PABX_WI2S_MODE,
128 .name = "ata pabx wi2s mode",
132 struct pmx_mode spear300_ata_pabx_i2s_mode = {
133 .id = ATA_PABX_I2S_MODE,
134 .name = "ata pabx i2s mode",
138 struct pmx_mode spear300_caml_lcdw_mode = {
139 .id = CAML_LCDW_MODE,
140 .name = "caml lcdw mode",
144 struct pmx_mode spear300_camu_lcd_mode = {
146 .name = "camu lcd mode",
150 struct pmx_mode spear300_camu_wlcd_mode = {
151 .id = CAMU_WLCD_MODE,
152 .name = "camu wlcd mode",
156 struct pmx_mode spear300_caml_lcd_mode = {
158 .name = "caml lcd mode",
163 static struct pmx_dev_mode pmx_fsmc_2_chips_modes[] = {
165 .ids = NAND_MODE | NOR_MODE | PHOTO_FRAME_MODE |
166 ATA_PABX_WI2S_MODE | ATA_PABX_I2S_MODE,
167 .mask = PMX_FIRDA_MASK,
171 struct pmx_dev spear300_pmx_fsmc_2_chips = {
172 .name = "fsmc_2_chips",
173 .modes = pmx_fsmc_2_chips_modes,
174 .mode_count = ARRAY_SIZE(pmx_fsmc_2_chips_modes),
178 static struct pmx_dev_mode pmx_fsmc_4_chips_modes[] = {
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,
186 struct pmx_dev spear300_pmx_fsmc_4_chips = {
187 .name = "fsmc_4_chips",
188 .modes = pmx_fsmc_4_chips_modes,
189 .mode_count = ARRAY_SIZE(pmx_fsmc_4_chips_modes),
193 static struct pmx_dev_mode pmx_keyboard_modes[] = {
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 |
203 struct pmx_dev spear300_pmx_keyboard = {
205 .modes = pmx_keyboard_modes,
206 .mode_count = ARRAY_SIZE(pmx_keyboard_modes),
210 static struct pmx_dev_mode pmx_clcd_modes[] = {
212 .ids = PHOTO_FRAME_MODE,
213 .mask = PMX_TIMER_1_2_MASK | PMX_TIMER_3_4_MASK ,
215 .ids = HEND_IP_PHONE_MODE | HEND_WIFI_PHONE_MODE |
216 CAMU_LCD_MODE | CAML_LCD_MODE,
217 .mask = PMX_TIMER_3_4_MASK,
221 struct pmx_dev spear300_pmx_clcd = {
223 .modes = pmx_clcd_modes,
224 .mode_count = ARRAY_SIZE(pmx_clcd_modes),
228 static struct pmx_dev_mode pmx_telecom_gpio_modes[] = {
230 .ids = PHOTO_FRAME_MODE | CAMU_LCD_MODE | CAML_LCD_MODE,
231 .mask = PMX_MII_MASK,
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,
236 .ids = ATA_PABX_I2S_MODE | CAML_LCDW_MODE | CAMU_WLCD_MODE,
237 .mask = PMX_MII_MASK | PMX_TIMER_3_4_MASK,
239 .ids = HEND_IP_PHONE_MODE | HEND_WIFI_PHONE_MODE,
240 .mask = PMX_MII_MASK | PMX_TIMER_1_2_MASK,
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,
248 struct pmx_dev spear300_pmx_telecom_gpio = {
249 .name = "telecom_gpio",
250 .modes = pmx_telecom_gpio_modes,
251 .mode_count = ARRAY_SIZE(pmx_telecom_gpio_modes),
255 static struct pmx_dev_mode pmx_telecom_tdm_modes[] = {
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,
266 struct pmx_dev spear300_pmx_telecom_tdm = {
267 .name = "telecom_tdm",
268 .modes = pmx_telecom_tdm_modes,
269 .mode_count = ARRAY_SIZE(pmx_telecom_tdm_modes),
273 static struct pmx_dev_mode pmx_telecom_spi_cs_i2c_clk_modes[] = {
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,
283 struct pmx_dev spear300_pmx_telecom_spi_cs_i2c_clk = {
284 .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),
290 static struct pmx_dev_mode pmx_telecom_camera_modes[] = {
292 .ids = CAML_LCDW_MODE | CAML_LCD_MODE,
293 .mask = PMX_MII_MASK,
295 .ids = CAMU_LCD_MODE | CAMU_WLCD_MODE,
296 .mask = PMX_TIMER_1_2_MASK | PMX_TIMER_3_4_MASK | PMX_MII_MASK,
300 struct pmx_dev spear300_pmx_telecom_camera = {
301 .name = "telecom_camera",
302 .modes = pmx_telecom_camera_modes,
303 .mode_count = ARRAY_SIZE(pmx_telecom_camera_modes),
307 static struct pmx_dev_mode pmx_telecom_dac_modes[] = {
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,
315 struct pmx_dev spear300_pmx_telecom_dac = {
316 .name = "telecom_dac",
317 .modes = pmx_telecom_dac_modes,
318 .mode_count = ARRAY_SIZE(pmx_telecom_dac_modes),
322 static struct pmx_dev_mode pmx_telecom_i2s_modes[] = {
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,
332 struct pmx_dev spear300_pmx_telecom_i2s = {
333 .name = "telecom_i2s",
334 .modes = pmx_telecom_i2s_modes,
335 .mode_count = ARRAY_SIZE(pmx_telecom_i2s_modes),
339 static struct pmx_dev_mode pmx_telecom_boot_pins_modes[] = {
341 .ids = NAND_MODE | NOR_MODE,
342 .mask = PMX_UART0_MODEM_MASK | PMX_TIMER_1_2_MASK |
347 struct pmx_dev spear300_pmx_telecom_boot_pins = {
348 .name = "telecom_boot_pins",
349 .modes = pmx_telecom_boot_pins_modes,
350 .mode_count = ARRAY_SIZE(pmx_telecom_boot_pins_modes),
354 static struct pmx_dev_mode pmx_telecom_sdhci_4bit_modes[] = {
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 |
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,
367 struct pmx_dev spear300_pmx_telecom_sdhci_4bit = {
368 .name = "telecom_sdhci_4bit",
369 .modes = pmx_telecom_sdhci_4bit_modes,
370 .mode_count = ARRAY_SIZE(pmx_telecom_sdhci_4bit_modes),
374 static struct pmx_dev_mode pmx_telecom_sdhci_8bit_modes[] = {
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,
386 struct pmx_dev spear300_pmx_telecom_sdhci_8bit = {
387 .name = "telecom_sdhci_8bit",
388 .modes = pmx_telecom_sdhci_8bit_modes,
389 .mode_count = ARRAY_SIZE(pmx_telecom_sdhci_8bit_modes),
393 static struct pmx_dev_mode pmx_gpio1_modes[] = {
395 .ids = PHOTO_FRAME_MODE,
396 .mask = PMX_UART0_MODEM_MASK | PMX_TIMER_1_2_MASK |
401 struct pmx_dev spear300_pmx_gpio1 = {
403 .modes = pmx_gpio1_modes,
404 .mode_count = ARRAY_SIZE(pmx_gpio1_modes),
408 /* pmx driver structure */
409 static struct pmx_driver pmx_driver = {
410 .mode_reg = {.offset = MODE_CONFIG_REG, .mask = 0x0000000f},
411 .mux_reg = {.offset = PAD_MUX_CONFIG_REG, .mask = 0x00007fff},
414 /* spear3xx shared irq */
415 static struct shirq_dev_config shirq_ras1_config[] = {
417 .virq = SPEAR300_VIRQ_IT_PERS_S,
418 .enb_mask = SPEAR300_IT_PERS_S_IRQ_MASK,
419 .status_mask = SPEAR300_IT_PERS_S_IRQ_MASK,
421 .virq = SPEAR300_VIRQ_IT_CHANGE_S,
422 .enb_mask = SPEAR300_IT_CHANGE_S_IRQ_MASK,
423 .status_mask = SPEAR300_IT_CHANGE_S_IRQ_MASK,
425 .virq = SPEAR300_VIRQ_I2S,
426 .enb_mask = SPEAR300_I2S_IRQ_MASK,
427 .status_mask = SPEAR300_I2S_IRQ_MASK,
429 .virq = SPEAR300_VIRQ_TDM,
430 .enb_mask = SPEAR300_TDM_IRQ_MASK,
431 .status_mask = SPEAR300_TDM_IRQ_MASK,
433 .virq = SPEAR300_VIRQ_CAMERA_L,
434 .enb_mask = SPEAR300_CAMERA_L_IRQ_MASK,
435 .status_mask = SPEAR300_CAMERA_L_IRQ_MASK,
437 .virq = SPEAR300_VIRQ_CAMERA_F,
438 .enb_mask = SPEAR300_CAMERA_F_IRQ_MASK,
439 .status_mask = SPEAR300_CAMERA_F_IRQ_MASK,
441 .virq = SPEAR300_VIRQ_CAMERA_V,
442 .enb_mask = SPEAR300_CAMERA_V_IRQ_MASK,
443 .status_mask = SPEAR300_CAMERA_V_IRQ_MASK,
445 .virq = SPEAR300_VIRQ_KEYBOARD,
446 .enb_mask = SPEAR300_KEYBOARD_IRQ_MASK,
447 .status_mask = SPEAR300_KEYBOARD_IRQ_MASK,
449 .virq = SPEAR300_VIRQ_GPIO1,
450 .enb_mask = SPEAR300_GPIO1_IRQ_MASK,
451 .status_mask = SPEAR300_GPIO1_IRQ_MASK,
455 static struct spear_shirq shirq_ras1 = {
456 .irq = SPEAR3XX_IRQ_GEN_RAS_1,
457 .dev_config = shirq_ras1_config,
458 .dev_count = ARRAY_SIZE(shirq_ras1_config),
460 .enb_reg = SPEAR300_INT_ENB_MASK_REG,
461 .status_reg = SPEAR300_INT_STS_MASK_REG,
462 .status_reg_mask = SPEAR300_SHIRQ_RAS1_MASK,
467 /* padmux devices to enable */
468 static struct pmx_dev *spear300_evb_pmx_devs[] = {
469 /* spear3xx specific devices */
471 &spear3xx_pmx_ssp_cs,
476 /* spear300 specific devices */
477 &spear300_pmx_fsmc_2_chips,
479 &spear300_pmx_telecom_sdhci_4bit,
483 /* DMAC platform data's slave info */
484 struct pl08x_channel_data spear300_dma_info[] = {
486 .bus_id = "uart0_rx",
491 .periph_buses = PL08X_AHB1,
493 .bus_id = "uart0_tx",
498 .periph_buses = PL08X_AHB1,
505 .periph_buses = PL08X_AHB1,
512 .periph_buses = PL08X_AHB1,
519 .periph_buses = PL08X_AHB1,
526 .periph_buses = PL08X_AHB1,
533 .periph_buses = PL08X_AHB1,
540 .periph_buses = PL08X_AHB1,
547 .periph_buses = PL08X_AHB1,
549 .bus_id = "from_jpeg",
554 .periph_buses = PL08X_AHB1,
561 .periph_buses = PL08X_AHB1,
568 .periph_buses = PL08X_AHB1,
575 .periph_buses = PL08X_AHB1,
582 .periph_buses = PL08X_AHB1,
589 .periph_buses = PL08X_AHB1,
596 .periph_buses = PL08X_AHB1,
603 .periph_buses = PL08X_AHB1,
610 .periph_buses = PL08X_AHB1,
617 .periph_buses = PL08X_AHB1,
624 .periph_buses = PL08X_AHB1,
631 .periph_buses = PL08X_AHB1,
638 .periph_buses = PL08X_AHB1,
645 .periph_buses = PL08X_AHB1,
652 .periph_buses = PL08X_AHB1,
659 .periph_buses = PL08X_AHB1,
666 .periph_buses = PL08X_AHB1,
670 /* Add SPEAr300 auxdata to pass platform data */
671 static struct of_dev_auxdata spear300_auxdata_lookup[] __initdata = {
672 OF_DEV_AUXDATA("arm,pl022", SPEAR3XX_ICM1_SSP_BASE, NULL,
674 OF_DEV_AUXDATA("arm,pl080", SPEAR3XX_ICM3_DMA_BASE, NULL,
679 static void __init spear300_dt_init(void)
683 pl080_plat_data.slave_channels = spear300_dma_info;
684 pl080_plat_data.num_slave_channels = ARRAY_SIZE(spear300_dma_info);
686 of_platform_populate(NULL, of_default_bus_match_table,
687 spear300_auxdata_lookup, NULL);
689 /* shared irq registration */
690 shirq_ras1.regs.base = ioremap(SPEAR300_TELECOM_BASE, SZ_4K);
691 if (shirq_ras1.regs.base) {
692 ret = spear_shirq_register(&shirq_ras1);
694 pr_err("Error registering Shared IRQ\n");
697 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);
703 pmx_driver.base = ioremap(SPEAR300_SOC_CONFIG_BASE, SZ_4K);
704 if (pmx_driver.base) {
705 ret = pmx_register(&pmx_driver);
707 pr_err("padmux: registration failed. err no: %d\n",
709 /* Free Mapping, device selection already done */
710 iounmap(pmx_driver.base);
714 pr_err("Initialization Failed");
718 static const char * const spear300_dt_board_compat[] = {
724 static void __init spear300_map_io(void)
730 DT_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,