1/* 2 * 3 * arch/arm/mach-u300/core.c 4 * 5 * 6 * Copyright (C) 2007-2012 ST-Ericsson SA 7 * License terms: GNU General Public License (GPL) version 2 8 * Core platform support, IRQ handling and device definitions. 9 * Author: Linus Walleij <linus.walleij@stericsson.com> 10 */ 11#include <linux/kernel.h> 12#include <linux/pinctrl/machine.h> 13#include <linux/pinctrl/pinconf-generic.h> 14#include <linux/platform_data/clk-u300.h> 15#include <linux/irqchip.h> 16#include <linux/of_address.h> 17#include <linux/of_platform.h> 18#include <linux/clocksource.h> 19#include <linux/clk.h> 20 21#include <asm/mach/map.h> 22#include <asm/mach/arch.h> 23 24/* 25 * These are the large blocks of memory allocated for I/O. 26 * the defines are used for setting up the I/O memory mapping. 27 */ 28 29/* NAND Flash CS0 */ 30#define U300_NAND_CS0_PHYS_BASE 0x80000000 31/* NFIF */ 32#define U300_NAND_IF_PHYS_BASE 0x9f800000 33/* ALE, CLE offset for FSMC NAND */ 34#define PLAT_NAND_CLE (1 << 16) 35#define PLAT_NAND_ALE (1 << 17) 36/* AHB Peripherals */ 37#define U300_AHB_PER_PHYS_BASE 0xa0000000 38#define U300_AHB_PER_VIRT_BASE 0xff010000 39/* FAST Peripherals */ 40#define U300_FAST_PER_PHYS_BASE 0xc0000000 41#define U300_FAST_PER_VIRT_BASE 0xff020000 42/* SLOW Peripherals */ 43#define U300_SLOW_PER_PHYS_BASE 0xc0010000 44#define U300_SLOW_PER_VIRT_BASE 0xff000000 45/* Boot ROM */ 46#define U300_BOOTROM_PHYS_BASE 0xffff0000 47#define U300_BOOTROM_VIRT_BASE 0xffff0000 48/* SEMI config base */ 49#define U300_SEMI_CONFIG_BASE 0x2FFE0000 50 51/* 52 * AHB peripherals 53 */ 54 55/* AHB Peripherals Bridge Controller */ 56#define U300_AHB_BRIDGE_BASE (U300_AHB_PER_PHYS_BASE+0x0000) 57/* Vectored Interrupt Controller 0, servicing 32 interrupts */ 58#define U300_INTCON0_BASE (U300_AHB_PER_PHYS_BASE+0x1000) 59#define U300_INTCON0_VBASE IOMEM(U300_AHB_PER_VIRT_BASE+0x1000) 60/* Vectored Interrupt Controller 1, servicing 32 interrupts */ 61#define U300_INTCON1_BASE (U300_AHB_PER_PHYS_BASE+0x2000) 62#define U300_INTCON1_VBASE IOMEM(U300_AHB_PER_VIRT_BASE+0x2000) 63/* Memory Stick Pro (MSPRO) controller */ 64#define U300_MSPRO_BASE (U300_AHB_PER_PHYS_BASE+0x3000) 65/* EMIF Configuration Area */ 66#define U300_EMIF_CFG_BASE (U300_AHB_PER_PHYS_BASE+0x4000) 67 68/* 69 * FAST peripherals 70 */ 71 72/* FAST bridge control */ 73#define U300_FAST_BRIDGE_BASE (U300_FAST_PER_PHYS_BASE+0x0000) 74/* MMC/SD controller */ 75#define U300_MMCSD_BASE (U300_FAST_PER_PHYS_BASE+0x1000) 76/* PCM I2S0 controller */ 77#define U300_PCM_I2S0_BASE (U300_FAST_PER_PHYS_BASE+0x2000) 78/* PCM I2S1 controller */ 79#define U300_PCM_I2S1_BASE (U300_FAST_PER_PHYS_BASE+0x3000) 80/* I2C0 controller */ 81#define U300_I2C0_BASE (U300_FAST_PER_PHYS_BASE+0x4000) 82/* I2C1 controller */ 83#define U300_I2C1_BASE (U300_FAST_PER_PHYS_BASE+0x5000) 84/* SPI controller */ 85#define U300_SPI_BASE (U300_FAST_PER_PHYS_BASE+0x6000) 86/* Fast UART1 on U335 only */ 87#define U300_UART1_BASE (U300_FAST_PER_PHYS_BASE+0x7000) 88 89/* 90 * SLOW peripherals 91 */ 92 93/* SLOW bridge control */ 94#define U300_SLOW_BRIDGE_BASE (U300_SLOW_PER_PHYS_BASE) 95/* SYSCON */ 96#define U300_SYSCON_BASE (U300_SLOW_PER_PHYS_BASE+0x1000) 97#define U300_SYSCON_VBASE IOMEM(U300_SLOW_PER_VIRT_BASE+0x1000) 98/* Watchdog */ 99#define U300_WDOG_BASE (U300_SLOW_PER_PHYS_BASE+0x2000) 100/* UART0 */ 101#define U300_UART0_BASE (U300_SLOW_PER_PHYS_BASE+0x3000) 102/* APP side special timer */ 103#define U300_TIMER_APP_BASE (U300_SLOW_PER_PHYS_BASE+0x4000) 104#define U300_TIMER_APP_VBASE IOMEM(U300_SLOW_PER_VIRT_BASE+0x4000) 105/* Keypad */ 106#define U300_KEYPAD_BASE (U300_SLOW_PER_PHYS_BASE+0x5000) 107/* GPIO */ 108#define U300_GPIO_BASE (U300_SLOW_PER_PHYS_BASE+0x6000) 109/* RTC */ 110#define U300_RTC_BASE (U300_SLOW_PER_PHYS_BASE+0x7000) 111/* Bus tracer */ 112#define U300_BUSTR_BASE (U300_SLOW_PER_PHYS_BASE+0x8000) 113/* Event handler (hardware queue) */ 114#define U300_EVHIST_BASE (U300_SLOW_PER_PHYS_BASE+0x9000) 115/* Genric Timer */ 116#define U300_TIMER_BASE (U300_SLOW_PER_PHYS_BASE+0xa000) 117/* PPM */ 118#define U300_PPM_BASE (U300_SLOW_PER_PHYS_BASE+0xb000) 119 120/* 121 * REST peripherals 122 */ 123 124/* ISP (image signal processor) */ 125#define U300_ISP_BASE (0xA0008000) 126/* DMA Controller base */ 127#define U300_DMAC_BASE (0xC0020000) 128/* MSL Base */ 129#define U300_MSL_BASE (0xc0022000) 130/* APEX Base */ 131#define U300_APEX_BASE (0xc0030000) 132/* Video Encoder Base */ 133#define U300_VIDEOENC_BASE (0xc0080000) 134/* XGAM Base */ 135#define U300_XGAM_BASE (0xd0000000) 136 137/* 138 * SYSCON addresses applicable to the core machine. 139 */ 140 141/* Chip ID register 16bit (R/-) */ 142#define U300_SYSCON_CIDR (0x400) 143/* SMCR */ 144#define U300_SYSCON_SMCR (0x4d0) 145#define U300_SYSCON_SMCR_FIELD_MASK (0x000e) 146#define U300_SYSCON_SMCR_SEMI_SREFACK_IND (0x0008) 147#define U300_SYSCON_SMCR_SEMI_SREFREQ_ENABLE (0x0004) 148#define U300_SYSCON_SMCR_SEMI_EXT_BOOT_MODE_ENABLE (0x0002) 149/* CPU_SW_DBGEN Software Debug Enable 16bit (R/W) */ 150#define U300_SYSCON_CSDR (0x4f0) 151#define U300_SYSCON_CSDR_SW_DEBUG_ENABLE (0x0001) 152/* PRINT_CONTROL Print Control 16bit (R/-) */ 153#define U300_SYSCON_PCR (0x4f8) 154#define U300_SYSCON_PCR_SERV_IND (0x0001) 155/* BOOT_CONTROL 16bit (R/-) */ 156#define U300_SYSCON_BCR (0x4fc) 157#define U300_SYSCON_BCR_ACC_CPU_SUBSYS_VINITHI_IND (0x0400) 158#define U300_SYSCON_BCR_APP_CPU_SUBSYS_VINITHI_IND (0x0200) 159#define U300_SYSCON_BCR_EXTRA_BOOT_OPTION_MASK (0x01FC) 160#define U300_SYSCON_BCR_APP_BOOT_SERV_MASK (0x0003) 161 162static void __iomem *syscon_base; 163 164/* 165 * Static I/O mappings that are needed for booting the U300 platforms. The 166 * only things we need are the areas where we find the timer, syscon and 167 * intcon, since the remaining device drivers will map their own memory 168 * physical to virtual as the need arise. 169 */ 170static struct map_desc u300_io_desc[] __initdata = { 171 { 172 .virtual = U300_SLOW_PER_VIRT_BASE, 173 .pfn = __phys_to_pfn(U300_SLOW_PER_PHYS_BASE), 174 .length = SZ_64K, 175 .type = MT_DEVICE, 176 }, 177 { 178 .virtual = U300_AHB_PER_VIRT_BASE, 179 .pfn = __phys_to_pfn(U300_AHB_PER_PHYS_BASE), 180 .length = SZ_32K, 181 .type = MT_DEVICE, 182 }, 183 { 184 .virtual = U300_FAST_PER_VIRT_BASE, 185 .pfn = __phys_to_pfn(U300_FAST_PER_PHYS_BASE), 186 .length = SZ_32K, 187 .type = MT_DEVICE, 188 }, 189}; 190 191static void __init u300_map_io(void) 192{ 193 iotable_init(u300_io_desc, ARRAY_SIZE(u300_io_desc)); 194} 195 196static unsigned long pin_pullup_conf[] = { 197 PIN_CONF_PACKED(PIN_CONFIG_BIAS_PULL_UP, 1), 198}; 199 200static unsigned long pin_highz_conf[] = { 201 PIN_CONF_PACKED(PIN_CONFIG_BIAS_HIGH_IMPEDANCE, 0), 202}; 203 204/* Pin control settings */ 205static struct pinctrl_map __initdata u300_pinmux_map[] = { 206 /* anonymous maps for chip power and EMIFs */ 207 PIN_MAP_MUX_GROUP_HOG_DEFAULT("pinctrl-u300", NULL, "power"), 208 PIN_MAP_MUX_GROUP_HOG_DEFAULT("pinctrl-u300", NULL, "emif0"), 209 PIN_MAP_MUX_GROUP_HOG_DEFAULT("pinctrl-u300", NULL, "emif1"), 210 /* per-device maps for MMC/SD, SPI and UART */ 211 PIN_MAP_MUX_GROUP_DEFAULT("mmci", "pinctrl-u300", NULL, "mmc0"), 212 PIN_MAP_MUX_GROUP_DEFAULT("pl022", "pinctrl-u300", NULL, "spi0"), 213 PIN_MAP_MUX_GROUP_DEFAULT("uart0", "pinctrl-u300", NULL, "uart0"), 214 /* This pin is used for clock return rather than GPIO */ 215 PIN_MAP_CONFIGS_PIN_DEFAULT("mmci", "pinctrl-u300", "PIO APP GPIO 11", 216 pin_pullup_conf), 217 /* This pin is used for card detect */ 218 PIN_MAP_CONFIGS_PIN_DEFAULT("mmci", "pinctrl-u300", "PIO MS INS", 219 pin_highz_conf), 220}; 221 222struct db_chip { 223 u16 chipid; 224 const char *name; 225}; 226 227/* 228 * This is a list of the Digital Baseband chips used in the U300 platform. 229 */ 230static struct db_chip db_chips[] __initdata = { 231 { 232 .chipid = 0xb800, 233 .name = "DB3000", 234 }, 235 { 236 .chipid = 0xc000, 237 .name = "DB3100", 238 }, 239 { 240 .chipid = 0xc800, 241 .name = "DB3150", 242 }, 243 { 244 .chipid = 0xd800, 245 .name = "DB3200", 246 }, 247 { 248 .chipid = 0xe000, 249 .name = "DB3250", 250 }, 251 { 252 .chipid = 0xe800, 253 .name = "DB3210", 254 }, 255 { 256 .chipid = 0xf000, 257 .name = "DB3350 P1x", 258 }, 259 { 260 .chipid = 0xf100, 261 .name = "DB3350 P2x", 262 }, 263 { 264 .chipid = 0x0000, /* List terminator */ 265 .name = NULL, 266 } 267}; 268 269static void __init u300_init_check_chip(void) 270{ 271 272 u16 val; 273 struct db_chip *chip; 274 const char *chipname; 275 const char unknown[] = "UNKNOWN"; 276 277 /* Read out and print chip ID */ 278 val = readw(syscon_base + U300_SYSCON_CIDR); 279 /* This is in funky bigendian order... */ 280 val = (val & 0xFFU) << 8 | (val >> 8); 281 chip = db_chips; 282 chipname = unknown; 283 284 for ( ; chip->chipid; chip++) { 285 if (chip->chipid == (val & 0xFF00U)) { 286 chipname = chip->name; 287 break; 288 } 289 } 290 printk(KERN_INFO "Initializing U300 system on %s baseband chip " \ 291 "(chip ID 0x%04x)\n", chipname, val); 292 293 if ((val & 0xFF00U) != 0xf000 && (val & 0xFF00U) != 0xf100) { 294 printk(KERN_ERR "Platform configured for BS335 " \ 295 " with DB3350 but %s detected, expect problems!", 296 chipname); 297 } 298} 299 300/* Forward declare this function from the watchdog */ 301void coh901327_watchdog_reset(void); 302 303static void u300_restart(enum reboot_mode mode, const char *cmd) 304{ 305 switch (mode) { 306 case REBOOT_SOFT: 307 case REBOOT_HARD: 308#ifdef CONFIG_COH901327_WATCHDOG 309 coh901327_watchdog_reset(); 310#endif 311 break; 312 default: 313 /* Do nothing */ 314 break; 315 } 316 /* Wait for system do die/reset. */ 317 while (1); 318} 319 320/* These are mostly to get the right device names for the clock lookups */ 321static struct of_dev_auxdata u300_auxdata_lookup[] __initdata = { 322 OF_DEV_AUXDATA("stericsson,pinctrl-u300", U300_SYSCON_BASE, 323 "pinctrl-u300", NULL), 324 OF_DEV_AUXDATA("stericsson,gpio-coh901", U300_GPIO_BASE, 325 "u300-gpio", NULL), 326 OF_DEV_AUXDATA("stericsson,coh901327", U300_WDOG_BASE, 327 "coh901327_wdog", NULL), 328 OF_DEV_AUXDATA("stericsson,coh901331", U300_RTC_BASE, 329 "rtc-coh901331", NULL), 330 OF_DEV_AUXDATA("stericsson,coh901318", U300_DMAC_BASE, 331 "coh901318", NULL), 332 OF_DEV_AUXDATA("stericsson,fsmc-nand", U300_NAND_IF_PHYS_BASE, 333 "fsmc-nand", NULL), 334 OF_DEV_AUXDATA("arm,primecell", U300_UART0_BASE, 335 "uart0", NULL), 336 OF_DEV_AUXDATA("arm,primecell", U300_UART1_BASE, 337 "uart1", NULL), 338 OF_DEV_AUXDATA("arm,primecell", U300_SPI_BASE, 339 "pl022", NULL), 340 OF_DEV_AUXDATA("st,ddci2c", U300_I2C0_BASE, 341 "stu300.0", NULL), 342 OF_DEV_AUXDATA("st,ddci2c", U300_I2C1_BASE, 343 "stu300.1", NULL), 344 OF_DEV_AUXDATA("arm,primecell", U300_MMCSD_BASE, 345 "mmci", NULL), 346 { /* sentinel */ }, 347}; 348 349static void __init u300_init_irq_dt(void) 350{ 351 struct device_node *syscon; 352 struct clk *clk; 353 354 syscon = of_find_node_by_path("/syscon@c0011000"); 355 if (!syscon) { 356 pr_crit("could not find syscon node\n"); 357 return; 358 } 359 syscon_base = of_iomap(syscon, 0); 360 if (!syscon_base) { 361 pr_crit("could not remap syscon\n"); 362 return; 363 } 364 /* initialize clocking early, we want to clock the INTCON */ 365 u300_clk_init(syscon_base); 366 367 /* Bootstrap EMIF and SEMI clocks */ 368 clk = clk_get_sys("pl172", NULL); 369 BUG_ON(IS_ERR(clk)); 370 clk_prepare_enable(clk); 371 clk = clk_get_sys("semi", NULL); 372 BUG_ON(IS_ERR(clk)); 373 clk_prepare_enable(clk); 374 375 /* Clock the interrupt controller */ 376 clk = clk_get_sys("intcon", NULL); 377 BUG_ON(IS_ERR(clk)); 378 clk_prepare_enable(clk); 379 380 irqchip_init(); 381} 382 383static void __init u300_init_machine_dt(void) 384{ 385 u16 val; 386 387 /* Check what platform we run and print some status information */ 388 u300_init_check_chip(); 389 390 /* Initialize pinmuxing */ 391 pinctrl_register_mappings(u300_pinmux_map, 392 ARRAY_SIZE(u300_pinmux_map)); 393 394 of_platform_populate(NULL, of_default_bus_match_table, 395 u300_auxdata_lookup, NULL); 396 397 /* Enable SEMI self refresh */ 398 val = readw(syscon_base + U300_SYSCON_SMCR) | 399 U300_SYSCON_SMCR_SEMI_SREFREQ_ENABLE; 400 writew(val, syscon_base + U300_SYSCON_SMCR); 401} 402 403static const char * u300_board_compat[] = { 404 "stericsson,u300", 405 NULL, 406}; 407 408DT_MACHINE_START(U300_DT, "U300 S335/B335 (Device Tree)") 409 .map_io = u300_map_io, 410 .init_irq = u300_init_irq_dt, 411 .init_time = clocksource_of_init, 412 .init_machine = u300_init_machine_dt, 413 .restart = u300_restart, 414 .dt_compat = u300_board_compat, 415MACHINE_END 416