1/* 2 * iop13xx platform Initialization 3 * Copyright (c) 2005-2006, Intel Corporation. 4 * 5 * This program is free software; you can redistribute it and/or modify it 6 * under the terms and conditions of the GNU General Public License, 7 * version 2, as published by the Free Software Foundation. 8 * 9 * This program is distributed in the hope it will be useful, but WITHOUT 10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for 12 * more details. 13 * 14 * You should have received a copy of the GNU General Public License along with 15 * this program; if not, write to the Free Software Foundation, Inc., 59 Temple 16 * Place - Suite 330, Boston, MA 02111-1307 USA. 17 * 18 */ 19 20#include <linux/dma-mapping.h> 21#include <linux/serial_8250.h> 22#include <linux/io.h> 23#include <linux/reboot.h> 24#ifdef CONFIG_MTD_PHYSMAP 25#include <linux/mtd/physmap.h> 26#endif 27#include <asm/mach/map.h> 28#include <mach/hardware.h> 29#include <asm/irq.h> 30#include <asm/hardware/iop_adma.h> 31#include <mach/irqs.h> 32 33#define IOP13XX_UART_XTAL 33334000 34#define IOP13XX_SETUP_DEBUG 0 35#define PRINTK(x...) ((void)(IOP13XX_SETUP_DEBUG && printk(x))) 36 37/* Standard IO mapping for all IOP13XX based systems 38 */ 39static struct map_desc iop13xx_std_desc[] __initdata = { 40 { /* mem mapped registers */ 41 .virtual = (unsigned long)IOP13XX_PMMR_VIRT_MEM_BASE, 42 .pfn = __phys_to_pfn(IOP13XX_PMMR_PHYS_MEM_BASE), 43 .length = IOP13XX_PMMR_SIZE, 44 .type = MT_DEVICE, 45 }, 46}; 47 48static struct resource iop13xx_uart0_resources[] = { 49 [0] = { 50 .start = IOP13XX_UART0_PHYS, 51 .end = IOP13XX_UART0_PHYS + 0x3f, 52 .flags = IORESOURCE_MEM, 53 }, 54 [1] = { 55 .start = IRQ_IOP13XX_UART0, 56 .end = IRQ_IOP13XX_UART0, 57 .flags = IORESOURCE_IRQ 58 } 59}; 60 61static struct resource iop13xx_uart1_resources[] = { 62 [0] = { 63 .start = IOP13XX_UART1_PHYS, 64 .end = IOP13XX_UART1_PHYS + 0x3f, 65 .flags = IORESOURCE_MEM, 66 }, 67 [1] = { 68 .start = IRQ_IOP13XX_UART1, 69 .end = IRQ_IOP13XX_UART1, 70 .flags = IORESOURCE_IRQ 71 } 72}; 73 74static struct plat_serial8250_port iop13xx_uart0_data[] = { 75 { 76 .membase = IOP13XX_UART0_VIRT, 77 .mapbase = IOP13XX_UART0_PHYS, 78 .irq = IRQ_IOP13XX_UART0, 79 .uartclk = IOP13XX_UART_XTAL, 80 .regshift = 2, 81 .iotype = UPIO_MEM, 82 .flags = UPF_SKIP_TEST, 83 }, 84 { }, 85}; 86 87static struct plat_serial8250_port iop13xx_uart1_data[] = { 88 { 89 .membase = IOP13XX_UART1_VIRT, 90 .mapbase = IOP13XX_UART1_PHYS, 91 .irq = IRQ_IOP13XX_UART1, 92 .uartclk = IOP13XX_UART_XTAL, 93 .regshift = 2, 94 .iotype = UPIO_MEM, 95 .flags = UPF_SKIP_TEST, 96 }, 97 { }, 98}; 99 100/* The ids are fixed up later in iop13xx_platform_init */ 101static struct platform_device iop13xx_uart0 = { 102 .name = "serial8250", 103 .id = 0, 104 .dev.platform_data = iop13xx_uart0_data, 105 .num_resources = 2, 106 .resource = iop13xx_uart0_resources, 107}; 108 109static struct platform_device iop13xx_uart1 = { 110 .name = "serial8250", 111 .id = 0, 112 .dev.platform_data = iop13xx_uart1_data, 113 .num_resources = 2, 114 .resource = iop13xx_uart1_resources 115}; 116 117static struct resource iop13xx_i2c_0_resources[] = { 118 [0] = { 119 .start = IOP13XX_I2C0_PHYS, 120 .end = IOP13XX_I2C0_PHYS + 0x18, 121 .flags = IORESOURCE_MEM, 122 }, 123 [1] = { 124 .start = IRQ_IOP13XX_I2C_0, 125 .end = IRQ_IOP13XX_I2C_0, 126 .flags = IORESOURCE_IRQ 127 } 128}; 129 130static struct resource iop13xx_i2c_1_resources[] = { 131 [0] = { 132 .start = IOP13XX_I2C1_PHYS, 133 .end = IOP13XX_I2C1_PHYS + 0x18, 134 .flags = IORESOURCE_MEM, 135 }, 136 [1] = { 137 .start = IRQ_IOP13XX_I2C_1, 138 .end = IRQ_IOP13XX_I2C_1, 139 .flags = IORESOURCE_IRQ 140 } 141}; 142 143static struct resource iop13xx_i2c_2_resources[] = { 144 [0] = { 145 .start = IOP13XX_I2C2_PHYS, 146 .end = IOP13XX_I2C2_PHYS + 0x18, 147 .flags = IORESOURCE_MEM, 148 }, 149 [1] = { 150 .start = IRQ_IOP13XX_I2C_2, 151 .end = IRQ_IOP13XX_I2C_2, 152 .flags = IORESOURCE_IRQ 153 } 154}; 155 156/* I2C controllers. The IOP13XX uses the same block as the IOP3xx, so 157 * we just use the same device name. 158 */ 159 160/* The ids are fixed up later in iop13xx_platform_init */ 161static struct platform_device iop13xx_i2c_0_controller = { 162 .name = "IOP3xx-I2C", 163 .id = 0, 164 .num_resources = 2, 165 .resource = iop13xx_i2c_0_resources 166}; 167 168static struct platform_device iop13xx_i2c_1_controller = { 169 .name = "IOP3xx-I2C", 170 .id = 0, 171 .num_resources = 2, 172 .resource = iop13xx_i2c_1_resources 173}; 174 175static struct platform_device iop13xx_i2c_2_controller = { 176 .name = "IOP3xx-I2C", 177 .id = 0, 178 .num_resources = 2, 179 .resource = iop13xx_i2c_2_resources 180}; 181 182#ifdef CONFIG_MTD_PHYSMAP 183/* PBI Flash Device 184 */ 185static struct physmap_flash_data iq8134x_flash_data = { 186 .width = 2, 187}; 188 189static struct resource iq8134x_flash_resource = { 190 .start = IQ81340_FLASHBASE, 191 .end = 0, 192 .flags = IORESOURCE_MEM, 193}; 194 195static struct platform_device iq8134x_flash = { 196 .name = "physmap-flash", 197 .id = 0, 198 .dev = { .platform_data = &iq8134x_flash_data, }, 199 .num_resources = 1, 200 .resource = &iq8134x_flash_resource, 201}; 202 203static unsigned long iq8134x_probe_flash_size(void) 204{ 205 uint8_t __iomem *flash_addr = ioremap(IQ81340_FLASHBASE, PAGE_SIZE); 206 int i; 207 char query[3]; 208 unsigned long size = 0; 209 int width = iq8134x_flash_data.width; 210 211 if (flash_addr) { 212 /* send CFI 'query' command */ 213 writew(0x98, flash_addr); 214 215 /* check for CFI compliance */ 216 for (i = 0; i < 3 * width; i += width) 217 query[i / width] = readb(flash_addr + (0x10 * width) + i); 218 219 /* read the size */ 220 if (memcmp(query, "QRY", 3) == 0) 221 size = 1 << readb(flash_addr + (0x27 * width)); 222 223 /* send CFI 'read array' command */ 224 writew(0xff, flash_addr); 225 226 iounmap(flash_addr); 227 } 228 229 return size; 230} 231#endif 232 233/* ADMA Channels */ 234static struct resource iop13xx_adma_0_resources[] = { 235 [0] = { 236 .start = IOP13XX_ADMA_PHYS_BASE(0), 237 .end = IOP13XX_ADMA_UPPER_PA(0), 238 .flags = IORESOURCE_MEM, 239 }, 240 [1] = { 241 .start = IRQ_IOP13XX_ADMA0_EOT, 242 .end = IRQ_IOP13XX_ADMA0_EOT, 243 .flags = IORESOURCE_IRQ 244 }, 245 [2] = { 246 .start = IRQ_IOP13XX_ADMA0_EOC, 247 .end = IRQ_IOP13XX_ADMA0_EOC, 248 .flags = IORESOURCE_IRQ 249 }, 250 [3] = { 251 .start = IRQ_IOP13XX_ADMA0_ERR, 252 .end = IRQ_IOP13XX_ADMA0_ERR, 253 .flags = IORESOURCE_IRQ 254 } 255}; 256 257static struct resource iop13xx_adma_1_resources[] = { 258 [0] = { 259 .start = IOP13XX_ADMA_PHYS_BASE(1), 260 .end = IOP13XX_ADMA_UPPER_PA(1), 261 .flags = IORESOURCE_MEM, 262 }, 263 [1] = { 264 .start = IRQ_IOP13XX_ADMA1_EOT, 265 .end = IRQ_IOP13XX_ADMA1_EOT, 266 .flags = IORESOURCE_IRQ 267 }, 268 [2] = { 269 .start = IRQ_IOP13XX_ADMA1_EOC, 270 .end = IRQ_IOP13XX_ADMA1_EOC, 271 .flags = IORESOURCE_IRQ 272 }, 273 [3] = { 274 .start = IRQ_IOP13XX_ADMA1_ERR, 275 .end = IRQ_IOP13XX_ADMA1_ERR, 276 .flags = IORESOURCE_IRQ 277 } 278}; 279 280static struct resource iop13xx_adma_2_resources[] = { 281 [0] = { 282 .start = IOP13XX_ADMA_PHYS_BASE(2), 283 .end = IOP13XX_ADMA_UPPER_PA(2), 284 .flags = IORESOURCE_MEM, 285 }, 286 [1] = { 287 .start = IRQ_IOP13XX_ADMA2_EOT, 288 .end = IRQ_IOP13XX_ADMA2_EOT, 289 .flags = IORESOURCE_IRQ 290 }, 291 [2] = { 292 .start = IRQ_IOP13XX_ADMA2_EOC, 293 .end = IRQ_IOP13XX_ADMA2_EOC, 294 .flags = IORESOURCE_IRQ 295 }, 296 [3] = { 297 .start = IRQ_IOP13XX_ADMA2_ERR, 298 .end = IRQ_IOP13XX_ADMA2_ERR, 299 .flags = IORESOURCE_IRQ 300 } 301}; 302 303static u64 iop13xx_adma_dmamask = DMA_BIT_MASK(64); 304static struct iop_adma_platform_data iop13xx_adma_0_data = { 305 .hw_id = 0, 306 .pool_size = PAGE_SIZE, 307}; 308 309static struct iop_adma_platform_data iop13xx_adma_1_data = { 310 .hw_id = 1, 311 .pool_size = PAGE_SIZE, 312}; 313 314static struct iop_adma_platform_data iop13xx_adma_2_data = { 315 .hw_id = 2, 316 .pool_size = PAGE_SIZE, 317}; 318 319/* The ids are fixed up later in iop13xx_platform_init */ 320static struct platform_device iop13xx_adma_0_channel = { 321 .name = "iop-adma", 322 .id = 0, 323 .num_resources = 4, 324 .resource = iop13xx_adma_0_resources, 325 .dev = { 326 .dma_mask = &iop13xx_adma_dmamask, 327 .coherent_dma_mask = DMA_BIT_MASK(64), 328 .platform_data = (void *) &iop13xx_adma_0_data, 329 }, 330}; 331 332static struct platform_device iop13xx_adma_1_channel = { 333 .name = "iop-adma", 334 .id = 0, 335 .num_resources = 4, 336 .resource = iop13xx_adma_1_resources, 337 .dev = { 338 .dma_mask = &iop13xx_adma_dmamask, 339 .coherent_dma_mask = DMA_BIT_MASK(64), 340 .platform_data = (void *) &iop13xx_adma_1_data, 341 }, 342}; 343 344static struct platform_device iop13xx_adma_2_channel = { 345 .name = "iop-adma", 346 .id = 0, 347 .num_resources = 4, 348 .resource = iop13xx_adma_2_resources, 349 .dev = { 350 .dma_mask = &iop13xx_adma_dmamask, 351 .coherent_dma_mask = DMA_BIT_MASK(64), 352 .platform_data = (void *) &iop13xx_adma_2_data, 353 }, 354}; 355 356void __init iop13xx_map_io(void) 357{ 358 /* Initialize the Static Page Table maps */ 359 iotable_init(iop13xx_std_desc, ARRAY_SIZE(iop13xx_std_desc)); 360} 361 362static int init_uart; 363static int init_i2c; 364static int init_adma; 365 366void __init iop13xx_platform_init(void) 367{ 368 int i; 369 u32 uart_idx, i2c_idx, adma_idx, plat_idx; 370 struct platform_device *iop13xx_devices[IQ81340_MAX_PLAT_DEVICES]; 371 372 /* set the bases so we can read the device id */ 373 iop13xx_set_atu_mmr_bases(); 374 375 memset(iop13xx_devices, 0, sizeof(iop13xx_devices)); 376 377 if (init_uart == IOP13XX_INIT_UART_DEFAULT) { 378 switch (iop13xx_dev_id()) { 379 /* enable both uarts on iop341 */ 380 case 0x3380: 381 case 0x3384: 382 case 0x3388: 383 case 0x338c: 384 init_uart |= IOP13XX_INIT_UART_0; 385 init_uart |= IOP13XX_INIT_UART_1; 386 break; 387 /* only enable uart 1 */ 388 default: 389 init_uart |= IOP13XX_INIT_UART_1; 390 } 391 } 392 393 if (init_i2c == IOP13XX_INIT_I2C_DEFAULT) { 394 switch (iop13xx_dev_id()) { 395 /* enable all i2c units on iop341 and iop342 */ 396 case 0x3380: 397 case 0x3384: 398 case 0x3388: 399 case 0x338c: 400 case 0x3382: 401 case 0x3386: 402 case 0x338a: 403 case 0x338e: 404 init_i2c |= IOP13XX_INIT_I2C_0; 405 init_i2c |= IOP13XX_INIT_I2C_1; 406 init_i2c |= IOP13XX_INIT_I2C_2; 407 break; 408 /* only enable i2c 1 and 2 */ 409 default: 410 init_i2c |= IOP13XX_INIT_I2C_1; 411 init_i2c |= IOP13XX_INIT_I2C_2; 412 } 413 } 414 415 if (init_adma == IOP13XX_INIT_ADMA_DEFAULT) { 416 init_adma |= IOP13XX_INIT_ADMA_0; 417 init_adma |= IOP13XX_INIT_ADMA_1; 418 init_adma |= IOP13XX_INIT_ADMA_2; 419 } 420 421 plat_idx = 0; 422 uart_idx = 0; 423 i2c_idx = 0; 424 425 /* uart 1 (if enabled) is ttyS0 */ 426 if (init_uart & IOP13XX_INIT_UART_1) { 427 PRINTK("Adding uart1 to platform device list\n"); 428 iop13xx_uart1.id = uart_idx++; 429 iop13xx_devices[plat_idx++] = &iop13xx_uart1; 430 } 431 if (init_uart & IOP13XX_INIT_UART_0) { 432 PRINTK("Adding uart0 to platform device list\n"); 433 iop13xx_uart0.id = uart_idx++; 434 iop13xx_devices[plat_idx++] = &iop13xx_uart0; 435 } 436 437 for(i = 0; i < IQ81340_NUM_I2C; i++) { 438 if ((init_i2c & (1 << i)) && IOP13XX_SETUP_DEBUG) 439 printk("Adding i2c%d to platform device list\n", i); 440 switch(init_i2c & (1 << i)) { 441 case IOP13XX_INIT_I2C_0: 442 iop13xx_i2c_0_controller.id = i2c_idx++; 443 iop13xx_devices[plat_idx++] = 444 &iop13xx_i2c_0_controller; 445 break; 446 case IOP13XX_INIT_I2C_1: 447 iop13xx_i2c_1_controller.id = i2c_idx++; 448 iop13xx_devices[plat_idx++] = 449 &iop13xx_i2c_1_controller; 450 break; 451 case IOP13XX_INIT_I2C_2: 452 iop13xx_i2c_2_controller.id = i2c_idx++; 453 iop13xx_devices[plat_idx++] = 454 &iop13xx_i2c_2_controller; 455 break; 456 } 457 } 458 459 /* initialize adma channel ids and capabilities */ 460 adma_idx = 0; 461 for (i = 0; i < IQ81340_NUM_ADMA; i++) { 462 struct iop_adma_platform_data *plat_data; 463 if ((init_adma & (1 << i)) && IOP13XX_SETUP_DEBUG) 464 printk(KERN_INFO 465 "Adding adma%d to platform device list\n", i); 466 switch (init_adma & (1 << i)) { 467 case IOP13XX_INIT_ADMA_0: 468 iop13xx_adma_0_channel.id = adma_idx++; 469 iop13xx_devices[plat_idx++] = &iop13xx_adma_0_channel; 470 plat_data = &iop13xx_adma_0_data; 471 dma_cap_set(DMA_MEMCPY, plat_data->cap_mask); 472 dma_cap_set(DMA_XOR, plat_data->cap_mask); 473 dma_cap_set(DMA_XOR_VAL, plat_data->cap_mask); 474 dma_cap_set(DMA_INTERRUPT, plat_data->cap_mask); 475 break; 476 case IOP13XX_INIT_ADMA_1: 477 iop13xx_adma_1_channel.id = adma_idx++; 478 iop13xx_devices[plat_idx++] = &iop13xx_adma_1_channel; 479 plat_data = &iop13xx_adma_1_data; 480 dma_cap_set(DMA_MEMCPY, plat_data->cap_mask); 481 dma_cap_set(DMA_XOR, plat_data->cap_mask); 482 dma_cap_set(DMA_XOR_VAL, plat_data->cap_mask); 483 dma_cap_set(DMA_INTERRUPT, plat_data->cap_mask); 484 break; 485 case IOP13XX_INIT_ADMA_2: 486 iop13xx_adma_2_channel.id = adma_idx++; 487 iop13xx_devices[plat_idx++] = &iop13xx_adma_2_channel; 488 plat_data = &iop13xx_adma_2_data; 489 dma_cap_set(DMA_MEMCPY, plat_data->cap_mask); 490 dma_cap_set(DMA_XOR, plat_data->cap_mask); 491 dma_cap_set(DMA_XOR_VAL, plat_data->cap_mask); 492 dma_cap_set(DMA_INTERRUPT, plat_data->cap_mask); 493 dma_cap_set(DMA_PQ, plat_data->cap_mask); 494 dma_cap_set(DMA_PQ_VAL, plat_data->cap_mask); 495 break; 496 } 497 } 498 499#ifdef CONFIG_MTD_PHYSMAP 500 iq8134x_flash_resource.end = iq8134x_flash_resource.start + 501 iq8134x_probe_flash_size() - 1; 502 if (iq8134x_flash_resource.end > iq8134x_flash_resource.start) 503 iop13xx_devices[plat_idx++] = &iq8134x_flash; 504 else 505 printk(KERN_ERR "%s: Failed to probe flash size\n", __func__); 506#endif 507 508 platform_add_devices(iop13xx_devices, plat_idx); 509} 510 511static int __init iop13xx_init_uart_setup(char *str) 512{ 513 if (str) { 514 while (*str != '\0') { 515 switch(*str) { 516 case '0': 517 init_uart |= IOP13XX_INIT_UART_0; 518 break; 519 case '1': 520 init_uart |= IOP13XX_INIT_UART_1; 521 break; 522 case ',': 523 case '=': 524 break; 525 default: 526 PRINTK("\"iop13xx_init_uart\" malformed" 527 " at character: \'%c\'", *str); 528 *(str + 1) = '\0'; 529 init_uart = IOP13XX_INIT_UART_DEFAULT; 530 } 531 str++; 532 } 533 } 534 return 1; 535} 536 537static int __init iop13xx_init_i2c_setup(char *str) 538{ 539 if (str) { 540 while (*str != '\0') { 541 switch(*str) { 542 case '0': 543 init_i2c |= IOP13XX_INIT_I2C_0; 544 break; 545 case '1': 546 init_i2c |= IOP13XX_INIT_I2C_1; 547 break; 548 case '2': 549 init_i2c |= IOP13XX_INIT_I2C_2; 550 break; 551 case ',': 552 case '=': 553 break; 554 default: 555 PRINTK("\"iop13xx_init_i2c\" malformed" 556 " at character: \'%c\'", *str); 557 *(str + 1) = '\0'; 558 init_i2c = IOP13XX_INIT_I2C_DEFAULT; 559 } 560 str++; 561 } 562 } 563 return 1; 564} 565 566static int __init iop13xx_init_adma_setup(char *str) 567{ 568 if (str) { 569 while (*str != '\0') { 570 switch (*str) { 571 case '0': 572 init_adma |= IOP13XX_INIT_ADMA_0; 573 break; 574 case '1': 575 init_adma |= IOP13XX_INIT_ADMA_1; 576 break; 577 case '2': 578 init_adma |= IOP13XX_INIT_ADMA_2; 579 break; 580 case ',': 581 case '=': 582 break; 583 default: 584 PRINTK("\"iop13xx_init_adma\" malformed" 585 " at character: \'%c\'", *str); 586 *(str + 1) = '\0'; 587 init_adma = IOP13XX_INIT_ADMA_DEFAULT; 588 } 589 str++; 590 } 591 } 592 return 1; 593} 594 595__setup("iop13xx_init_adma", iop13xx_init_adma_setup); 596__setup("iop13xx_init_uart", iop13xx_init_uart_setup); 597__setup("iop13xx_init_i2c", iop13xx_init_i2c_setup); 598 599void iop13xx_restart(enum reboot_mode mode, const char *cmd) 600{ 601 /* 602 * Reset the internal bus (warning both cores are reset) 603 */ 604 write_wdtcr(IOP_WDTCR_EN_ARM); 605 write_wdtcr(IOP_WDTCR_EN); 606 write_wdtsr(IOP13XX_WDTSR_WRITE_EN | IOP13XX_WDTCR_IB_RESET); 607 write_wdtcr(0x1000); 608} 609