hc
2024-02-20 102a0743326a03cd1a1202ceda21e175b7d3575c
kernel/drivers/pci/controller/pci-ftpci100.c
....@@ -34,12 +34,12 @@
3434 * Special configuration registers directly in the first few words
3535 * in I/O space.
3636 */
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
4343
4444 #define FARADAY_PCI_STATUS_CMD 0x04 /* Status and command */
4545 #define FARADAY_PCI_PMC 0x40 /* Power management control */
....@@ -195,9 +195,9 @@
195195 PCI_CONF_FUNCTION(PCI_FUNC(fn)) |
196196 PCI_CONF_WHERE(config) |
197197 PCI_CONF_ENABLE,
198
- p->base + PCI_CONFIG);
198
+ p->base + FTPCI_CONFIG);
199199
200
- *value = readl(p->base + PCI_DATA);
200
+ *value = readl(p->base + FTPCI_DATA);
201201
202202 if (size == 1)
203203 *value = (*value >> (8 * (config & 3))) & 0xFF;
....@@ -230,17 +230,17 @@
230230 PCI_CONF_FUNCTION(PCI_FUNC(fn)) |
231231 PCI_CONF_WHERE(config) |
232232 PCI_CONF_ENABLE,
233
- p->base + PCI_CONFIG);
233
+ p->base + FTPCI_CONFIG);
234234
235235 switch (size) {
236236 case 4:
237
- writel(value, p->base + PCI_DATA);
237
+ writel(value, p->base + FTPCI_DATA);
238238 break;
239239 case 2:
240
- writew(value, p->base + PCI_DATA + (config & 3));
240
+ writew(value, p->base + FTPCI_DATA + (config & 3));
241241 break;
242242 case 1:
243
- writeb(value, p->base + PCI_DATA + (config & 3));
243
+ writeb(value, p->base + FTPCI_DATA + (config & 3));
244244 break;
245245 default:
246246 ret = PCIBIOS_BAD_REGISTER_NUMBER;
....@@ -375,12 +375,11 @@
375375 return 0;
376376 }
377377
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)
380379 {
381
- struct of_pci_range range;
382
- struct of_pci_range_parser parser;
383380 struct device *dev = p->dev;
381
+ struct pci_host_bridge *bridge = pci_host_bridge_from_priv(p);
382
+ struct resource_entry *entry;
384383 u32 confreg[3] = {
385384 FARADAY_PCI_MEM1_BASE_SIZE,
386385 FARADAY_PCI_MEM2_BASE_SIZE,
....@@ -389,19 +388,13 @@
389388 int i = 0;
390389 u32 val;
391390
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;
402394 int ret;
403395
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);
405398 if (ret) {
406399 dev_err(dev,
407400 "DMA range %d: illegal MEM resource size\n", i);
....@@ -409,7 +402,7 @@
409402 }
410403
411404 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);
413406 if (i <= 2) {
414407 faraday_raw_pci_write_config(p, 0, 0, confreg[i],
415408 4, val);
....@@ -429,11 +422,8 @@
429422 struct device *dev = &pdev->dev;
430423 const struct faraday_pci_variant *variant =
431424 of_device_get_match_data(dev);
432
- struct resource *regs;
433
- resource_size_t io_base;
434425 struct resource_entry *win;
435426 struct faraday_pci *p;
436
- struct resource *mem;
437427 struct resource *io;
438428 struct pci_host_bridge *host;
439429 struct clk *clk;
....@@ -441,92 +431,47 @@
441431 unsigned char cur_bus_speed = PCI_SPEED_33MHz;
442432 int ret;
443433 u32 val;
444
- LIST_HEAD(res);
445434
446435 host = devm_pci_alloc_host_bridge(dev, sizeof(*p));
447436 if (!host)
448437 return -ENOMEM;
449438
450
- host->dev.parent = dev;
451439 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;
456440 p = pci_host_bridge_priv(host);
457441 host->sysdata = p;
458442 p->dev = dev;
459443
460444 /* Retrieve and enable optional clocks */
461
- clk = devm_clk_get(dev, "PCLK");
445
+ clk = devm_clk_get_enabled(dev, "PCLK");
462446 if (IS_ERR(clk))
463447 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");
470449 if (IS_ERR(p->bus_clk))
471450 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
- }
477451
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);
480453 if (IS_ERR(p->base))
481454 return PTR_ERR(p->base);
482455
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;
521466 }
522467 }
523468
524469 /* Setup hostbridge */
525
- val = readl(p->base + PCI_CTRL);
470
+ val = readl(p->base + FTPCI_CTRL);
526471 val |= PCI_COMMAND_IO;
527472 val |= PCI_COMMAND_MEMORY;
528473 val |= PCI_COMMAND_MASTER;
529
- writel(val, p->base + PCI_CTRL);
474
+ writel(val, p->base + FTPCI_CTRL);
530475 /* Mask and clear all interrupts */
531476 faraday_raw_pci_write_config(p, 0, 0, FARADAY_PCI_CTRL2 + 2, 2, 0xF000);
532477 if (variant->cascaded_irq) {
....@@ -565,11 +510,10 @@
565510 cur_bus_speed = PCI_SPEED_66MHz;
566511 }
567512
568
- ret = faraday_pci_parse_map_dma_ranges(p, dev->of_node);
513
+ ret = faraday_pci_parse_map_dma_ranges(p);
569514 if (ret)
570515 return ret;
571516
572
- list_splice_init(&res, &host->windows);
573517 ret = pci_scan_root_bus_bridge(host);
574518 if (ret) {
575519 dev_err(dev, "failed to scan host: %d\n", ret);
....@@ -581,7 +525,6 @@
581525
582526 pci_bus_assign_resources(p->bus);
583527 pci_bus_add_devices(p->bus);
584
- pci_free_resource_list(&res);
585528
586529 return 0;
587530 }