.. | .. |
---|
34 | 34 | * Special configuration registers directly in the first few words |
---|
35 | 35 | * in I/O space. |
---|
36 | 36 | */ |
---|
37 | | -#define PCI_IOSIZE 0x00 |
---|
38 | | -#define PCI_PROT 0x04 /* AHB protection */ |
---|
39 | | -#define PCI_CTRL 0x08 /* PCI control signal */ |
---|
40 | | -#define PCI_SOFTRST 0x10 /* Soft reset counter and response error enable */ |
---|
41 | | -#define PCI_CONFIG 0x28 /* PCI configuration command register */ |
---|
42 | | -#define PCI_DATA 0x2C |
---|
| 37 | +#define FTPCI_IOSIZE 0x00 |
---|
| 38 | +#define FTPCI_PROT 0x04 /* AHB protection */ |
---|
| 39 | +#define FTPCI_CTRL 0x08 /* PCI control signal */ |
---|
| 40 | +#define FTPCI_SOFTRST 0x10 /* Soft reset counter and response error enable */ |
---|
| 41 | +#define FTPCI_CONFIG 0x28 /* PCI configuration command register */ |
---|
| 42 | +#define FTPCI_DATA 0x2C |
---|
43 | 43 | |
---|
44 | 44 | #define FARADAY_PCI_STATUS_CMD 0x04 /* Status and command */ |
---|
45 | 45 | #define FARADAY_PCI_PMC 0x40 /* Power management control */ |
---|
.. | .. |
---|
195 | 195 | PCI_CONF_FUNCTION(PCI_FUNC(fn)) | |
---|
196 | 196 | PCI_CONF_WHERE(config) | |
---|
197 | 197 | PCI_CONF_ENABLE, |
---|
198 | | - p->base + PCI_CONFIG); |
---|
| 198 | + p->base + FTPCI_CONFIG); |
---|
199 | 199 | |
---|
200 | | - *value = readl(p->base + PCI_DATA); |
---|
| 200 | + *value = readl(p->base + FTPCI_DATA); |
---|
201 | 201 | |
---|
202 | 202 | if (size == 1) |
---|
203 | 203 | *value = (*value >> (8 * (config & 3))) & 0xFF; |
---|
.. | .. |
---|
230 | 230 | PCI_CONF_FUNCTION(PCI_FUNC(fn)) | |
---|
231 | 231 | PCI_CONF_WHERE(config) | |
---|
232 | 232 | PCI_CONF_ENABLE, |
---|
233 | | - p->base + PCI_CONFIG); |
---|
| 233 | + p->base + FTPCI_CONFIG); |
---|
234 | 234 | |
---|
235 | 235 | switch (size) { |
---|
236 | 236 | case 4: |
---|
237 | | - writel(value, p->base + PCI_DATA); |
---|
| 237 | + writel(value, p->base + FTPCI_DATA); |
---|
238 | 238 | break; |
---|
239 | 239 | case 2: |
---|
240 | | - writew(value, p->base + PCI_DATA + (config & 3)); |
---|
| 240 | + writew(value, p->base + FTPCI_DATA + (config & 3)); |
---|
241 | 241 | break; |
---|
242 | 242 | case 1: |
---|
243 | | - writeb(value, p->base + PCI_DATA + (config & 3)); |
---|
| 243 | + writeb(value, p->base + FTPCI_DATA + (config & 3)); |
---|
244 | 244 | break; |
---|
245 | 245 | default: |
---|
246 | 246 | ret = PCIBIOS_BAD_REGISTER_NUMBER; |
---|
.. | .. |
---|
375 | 375 | return 0; |
---|
376 | 376 | } |
---|
377 | 377 | |
---|
378 | | -static int faraday_pci_parse_map_dma_ranges(struct faraday_pci *p, |
---|
379 | | - struct device_node *np) |
---|
| 378 | +static int faraday_pci_parse_map_dma_ranges(struct faraday_pci *p) |
---|
380 | 379 | { |
---|
381 | | - struct of_pci_range range; |
---|
382 | | - struct of_pci_range_parser parser; |
---|
383 | 380 | struct device *dev = p->dev; |
---|
| 381 | + struct pci_host_bridge *bridge = pci_host_bridge_from_priv(p); |
---|
| 382 | + struct resource_entry *entry; |
---|
384 | 383 | u32 confreg[3] = { |
---|
385 | 384 | FARADAY_PCI_MEM1_BASE_SIZE, |
---|
386 | 385 | FARADAY_PCI_MEM2_BASE_SIZE, |
---|
.. | .. |
---|
389 | 388 | int i = 0; |
---|
390 | 389 | u32 val; |
---|
391 | 390 | |
---|
392 | | - if (of_pci_dma_range_parser_init(&parser, np)) { |
---|
393 | | - dev_err(dev, "missing dma-ranges property\n"); |
---|
394 | | - return -EINVAL; |
---|
395 | | - } |
---|
396 | | - |
---|
397 | | - /* |
---|
398 | | - * Get the dma-ranges from the device tree |
---|
399 | | - */ |
---|
400 | | - for_each_of_pci_range(&parser, &range) { |
---|
401 | | - u64 end = range.pci_addr + range.size - 1; |
---|
| 391 | + resource_list_for_each_entry(entry, &bridge->dma_ranges) { |
---|
| 392 | + u64 pci_addr = entry->res->start - entry->offset; |
---|
| 393 | + u64 end = entry->res->end - entry->offset; |
---|
402 | 394 | int ret; |
---|
403 | 395 | |
---|
404 | | - ret = faraday_res_to_memcfg(range.pci_addr, range.size, &val); |
---|
| 396 | + ret = faraday_res_to_memcfg(pci_addr, |
---|
| 397 | + resource_size(entry->res), &val); |
---|
405 | 398 | if (ret) { |
---|
406 | 399 | dev_err(dev, |
---|
407 | 400 | "DMA range %d: illegal MEM resource size\n", i); |
---|
.. | .. |
---|
409 | 402 | } |
---|
410 | 403 | |
---|
411 | 404 | dev_info(dev, "DMA MEM%d BASE: 0x%016llx -> 0x%016llx config %08x\n", |
---|
412 | | - i + 1, range.pci_addr, end, val); |
---|
| 405 | + i + 1, pci_addr, end, val); |
---|
413 | 406 | if (i <= 2) { |
---|
414 | 407 | faraday_raw_pci_write_config(p, 0, 0, confreg[i], |
---|
415 | 408 | 4, val); |
---|
.. | .. |
---|
429 | 422 | struct device *dev = &pdev->dev; |
---|
430 | 423 | const struct faraday_pci_variant *variant = |
---|
431 | 424 | of_device_get_match_data(dev); |
---|
432 | | - struct resource *regs; |
---|
433 | | - resource_size_t io_base; |
---|
434 | 425 | struct resource_entry *win; |
---|
435 | 426 | struct faraday_pci *p; |
---|
436 | | - struct resource *mem; |
---|
437 | 427 | struct resource *io; |
---|
438 | 428 | struct pci_host_bridge *host; |
---|
439 | 429 | struct clk *clk; |
---|
.. | .. |
---|
441 | 431 | unsigned char cur_bus_speed = PCI_SPEED_33MHz; |
---|
442 | 432 | int ret; |
---|
443 | 433 | u32 val; |
---|
444 | | - LIST_HEAD(res); |
---|
445 | 434 | |
---|
446 | 435 | host = devm_pci_alloc_host_bridge(dev, sizeof(*p)); |
---|
447 | 436 | if (!host) |
---|
448 | 437 | return -ENOMEM; |
---|
449 | 438 | |
---|
450 | | - host->dev.parent = dev; |
---|
451 | 439 | host->ops = &faraday_pci_ops; |
---|
452 | | - host->busnr = 0; |
---|
453 | | - host->msi = NULL; |
---|
454 | | - host->map_irq = of_irq_parse_and_map_pci; |
---|
455 | | - host->swizzle_irq = pci_common_swizzle; |
---|
456 | 440 | p = pci_host_bridge_priv(host); |
---|
457 | 441 | host->sysdata = p; |
---|
458 | 442 | p->dev = dev; |
---|
459 | 443 | |
---|
460 | 444 | /* Retrieve and enable optional clocks */ |
---|
461 | | - clk = devm_clk_get(dev, "PCLK"); |
---|
| 445 | + clk = devm_clk_get_enabled(dev, "PCLK"); |
---|
462 | 446 | if (IS_ERR(clk)) |
---|
463 | 447 | return PTR_ERR(clk); |
---|
464 | | - ret = clk_prepare_enable(clk); |
---|
465 | | - if (ret) { |
---|
466 | | - dev_err(dev, "could not prepare PCLK\n"); |
---|
467 | | - return ret; |
---|
468 | | - } |
---|
469 | | - p->bus_clk = devm_clk_get(dev, "PCICLK"); |
---|
| 448 | + p->bus_clk = devm_clk_get_enabled(dev, "PCICLK"); |
---|
470 | 449 | if (IS_ERR(p->bus_clk)) |
---|
471 | 450 | return PTR_ERR(p->bus_clk); |
---|
472 | | - ret = clk_prepare_enable(p->bus_clk); |
---|
473 | | - if (ret) { |
---|
474 | | - dev_err(dev, "could not prepare PCICLK\n"); |
---|
475 | | - return ret; |
---|
476 | | - } |
---|
477 | 451 | |
---|
478 | | - regs = platform_get_resource(pdev, IORESOURCE_MEM, 0); |
---|
479 | | - p->base = devm_ioremap_resource(dev, regs); |
---|
| 452 | + p->base = devm_platform_ioremap_resource(pdev, 0); |
---|
480 | 453 | if (IS_ERR(p->base)) |
---|
481 | 454 | return PTR_ERR(p->base); |
---|
482 | 455 | |
---|
483 | | - ret = devm_of_pci_get_host_bridge_resources(dev, 0, 0xff, |
---|
484 | | - &res, &io_base); |
---|
485 | | - if (ret) |
---|
486 | | - return ret; |
---|
487 | | - |
---|
488 | | - ret = devm_request_pci_bus_resources(dev, &res); |
---|
489 | | - if (ret) |
---|
490 | | - return ret; |
---|
491 | | - |
---|
492 | | - /* Get the I/O and memory ranges from DT */ |
---|
493 | | - resource_list_for_each_entry(win, &res) { |
---|
494 | | - switch (resource_type(win->res)) { |
---|
495 | | - case IORESOURCE_IO: |
---|
496 | | - io = win->res; |
---|
497 | | - io->name = "Gemini PCI I/O"; |
---|
498 | | - if (!faraday_res_to_memcfg(io->start - win->offset, |
---|
499 | | - resource_size(io), &val)) { |
---|
500 | | - /* setup I/O space size */ |
---|
501 | | - writel(val, p->base + PCI_IOSIZE); |
---|
502 | | - } else { |
---|
503 | | - dev_err(dev, "illegal IO mem size\n"); |
---|
504 | | - return -EINVAL; |
---|
505 | | - } |
---|
506 | | - ret = devm_pci_remap_iospace(dev, io, io_base); |
---|
507 | | - if (ret) { |
---|
508 | | - dev_warn(dev, "error %d: failed to map resource %pR\n", |
---|
509 | | - ret, io); |
---|
510 | | - continue; |
---|
511 | | - } |
---|
512 | | - break; |
---|
513 | | - case IORESOURCE_MEM: |
---|
514 | | - mem = win->res; |
---|
515 | | - mem->name = "Gemini PCI MEM"; |
---|
516 | | - break; |
---|
517 | | - case IORESOURCE_BUS: |
---|
518 | | - break; |
---|
519 | | - default: |
---|
520 | | - break; |
---|
| 456 | + win = resource_list_first_type(&host->windows, IORESOURCE_IO); |
---|
| 457 | + if (win) { |
---|
| 458 | + io = win->res; |
---|
| 459 | + if (!faraday_res_to_memcfg(io->start - win->offset, |
---|
| 460 | + resource_size(io), &val)) { |
---|
| 461 | + /* setup I/O space size */ |
---|
| 462 | + writel(val, p->base + FTPCI_IOSIZE); |
---|
| 463 | + } else { |
---|
| 464 | + dev_err(dev, "illegal IO mem size\n"); |
---|
| 465 | + return -EINVAL; |
---|
521 | 466 | } |
---|
522 | 467 | } |
---|
523 | 468 | |
---|
524 | 469 | /* Setup hostbridge */ |
---|
525 | | - val = readl(p->base + PCI_CTRL); |
---|
| 470 | + val = readl(p->base + FTPCI_CTRL); |
---|
526 | 471 | val |= PCI_COMMAND_IO; |
---|
527 | 472 | val |= PCI_COMMAND_MEMORY; |
---|
528 | 473 | val |= PCI_COMMAND_MASTER; |
---|
529 | | - writel(val, p->base + PCI_CTRL); |
---|
| 474 | + writel(val, p->base + FTPCI_CTRL); |
---|
530 | 475 | /* Mask and clear all interrupts */ |
---|
531 | 476 | faraday_raw_pci_write_config(p, 0, 0, FARADAY_PCI_CTRL2 + 2, 2, 0xF000); |
---|
532 | 477 | if (variant->cascaded_irq) { |
---|
.. | .. |
---|
565 | 510 | cur_bus_speed = PCI_SPEED_66MHz; |
---|
566 | 511 | } |
---|
567 | 512 | |
---|
568 | | - ret = faraday_pci_parse_map_dma_ranges(p, dev->of_node); |
---|
| 513 | + ret = faraday_pci_parse_map_dma_ranges(p); |
---|
569 | 514 | if (ret) |
---|
570 | 515 | return ret; |
---|
571 | 516 | |
---|
572 | | - list_splice_init(&res, &host->windows); |
---|
573 | 517 | ret = pci_scan_root_bus_bridge(host); |
---|
574 | 518 | if (ret) { |
---|
575 | 519 | dev_err(dev, "failed to scan host: %d\n", ret); |
---|
.. | .. |
---|
581 | 525 | |
---|
582 | 526 | pci_bus_assign_resources(p->bus); |
---|
583 | 527 | pci_bus_add_devices(p->bus); |
---|
584 | | - pci_free_resource_list(&res); |
---|
585 | 528 | |
---|
586 | 529 | return 0; |
---|
587 | 530 | } |
---|