1 // SPDX-License-Identifier: GPL-2.0
3 * leon_pci_grpci1.c: GRPCI1 Host PCI driver
5 * Copyright (C) 2013 Aeroflex Gaisler AB
7 * This GRPCI1 driver does not support PCI interrupts taken from
8 * GPIO pins. Interrupt generation at PCI parity and system error
9 * detection is by default turned off since some GRPCI1 cores does
10 * not support detection. It can be turned on from the bootloader
11 * using the all_pci_errors property.
13 * Contributors: Daniel Hellstrom <daniel@gaisler.com>
16 #include <linux/of_device.h>
17 #include <linux/export.h>
18 #include <linux/kernel.h>
19 #include <linux/of_irq.h>
20 #include <linux/delay.h>
21 #include <linux/pci.h>
23 #include <asm/leon_pci.h>
24 #include <asm/sections.h>
25 #include <asm/vaddrs.h>
31 /* Enable/Disable Debugging Configuration Space Access */
32 #undef GRPCI1_DEBUG_CFGACCESS
35 * GRPCI1 APB Register MAP
38 unsigned int cfg_stat
; /* 0x00 Configuration / Status */
39 unsigned int bar0
; /* 0x04 BAR0 (RO) */
40 unsigned int page0
; /* 0x08 PAGE0 (RO) */
41 unsigned int bar1
; /* 0x0C BAR1 (RO) */
42 unsigned int page1
; /* 0x10 PAGE1 */
43 unsigned int iomap
; /* 0x14 IO Map */
44 unsigned int stat_cmd
; /* 0x18 PCI Status & Command (RO) */
45 unsigned int irq
; /* 0x1C Interrupt register */
48 #define REGLOAD(a) (be32_to_cpu(__raw_readl(&(a))))
49 #define REGSTORE(a, v) (__raw_writel(cpu_to_be32(v), &(a)))
51 #define PAGE0_BTEN_BIT 0
52 #define PAGE0_BTEN (1 << PAGE0_BTEN_BIT)
54 #define CFGSTAT_HOST_BIT 13
55 #define CFGSTAT_CTO_BIT 8
56 #define CFGSTAT_HOST (1 << CFGSTAT_HOST_BIT)
57 #define CFGSTAT_CTO (1 << CFGSTAT_CTO_BIT)
59 #define IRQ_DPE (1 << 9)
60 #define IRQ_SSE (1 << 8)
61 #define IRQ_RMA (1 << 7)
62 #define IRQ_RTA (1 << 6)
63 #define IRQ_STA (1 << 5)
64 #define IRQ_DPED (1 << 4)
65 #define IRQ_INTD (1 << 3)
66 #define IRQ_INTC (1 << 2)
67 #define IRQ_INTB (1 << 1)
68 #define IRQ_INTA (1 << 0)
69 #define IRQ_DEF_ERRORS (IRQ_RMA | IRQ_RTA | IRQ_STA)
70 #define IRQ_ALL_ERRORS (IRQ_DPED | IRQ_DEF_ERRORS | IRQ_SSE | IRQ_DPE)
71 #define IRQ_INTX (IRQ_INTA | IRQ_INTB | IRQ_INTC | IRQ_INTD)
72 #define IRQ_MASK_BIT 16
74 #define DEF_PCI_ERRORS (PCI_STATUS_SIG_TARGET_ABORT | \
75 PCI_STATUS_REC_TARGET_ABORT | \
76 PCI_STATUS_REC_MASTER_ABORT)
77 #define ALL_PCI_ERRORS (PCI_STATUS_PARITY | PCI_STATUS_DETECTED_PARITY | \
78 PCI_STATUS_SIG_SYSTEM_ERROR | DEF_PCI_ERRORS)
83 struct leon_pci_info info
; /* must be on top of this structure */
84 struct grpci1_regs __iomem
*regs
; /* GRPCI register map */
86 int pci_err_mask
; /* STATUS register error mask */
87 int irq
; /* LEON irqctrl GRPCI IRQ */
88 unsigned char irq_map
[4]; /* GRPCI nexus PCI INTX# IRQs */
89 unsigned int irq_err
; /* GRPCI nexus Virt Error IRQ */
92 unsigned long pci_area
; /* MEMORY */
93 unsigned long pci_area_end
;
94 unsigned long pci_io
; /* I/O */
95 unsigned long pci_conf
; /* CONFIGURATION */
96 unsigned long pci_conf_end
;
97 unsigned long pci_io_va
;
100 static struct grpci1_priv
*grpci1priv
;
102 static int grpci1_cfg_w32(struct grpci1_priv
*priv
, unsigned int bus
,
103 unsigned int devfn
, int where
, u32 val
);
105 static int grpci1_map_irq(const struct pci_dev
*dev
, u8 slot
, u8 pin
)
107 struct grpci1_priv
*priv
= dev
->bus
->sysdata
;
110 /* Use default IRQ decoding on PCI BUS0 according slot numbering */
111 irq_group
= slot
& 0x3;
112 pin
= ((pin
- 1) + irq_group
) & 0x3;
114 return priv
->irq_map
[pin
];
117 static int grpci1_cfg_r32(struct grpci1_priv
*priv
, unsigned int bus
,
118 unsigned int devfn
, int where
, u32
*val
)
120 u32
*pci_conf
, tmp
, cfg
;
126 devfn
+= (0x8 * 6); /* start at AD16=Device0 */
127 } else if (bus
== TGT
) {
129 devfn
= 0; /* special case: bridge controller itself */
133 cfg
= REGLOAD(priv
->regs
->cfg_stat
);
134 REGSTORE(priv
->regs
->cfg_stat
, (cfg
& ~(0xf << 23)) | (bus
<< 23));
137 pci_conf
= (u32
*) (priv
->pci_conf
| (devfn
<< 8) | (where
& 0xfc));
138 tmp
= LEON3_BYPASS_LOAD_PA(pci_conf
);
140 /* check if master abort was received */
141 if (REGLOAD(priv
->regs
->cfg_stat
) & CFGSTAT_CTO
) {
143 /* Clear Master abort bit in PCI cfg space (is set) */
144 tmp
= REGLOAD(priv
->regs
->stat_cmd
);
145 grpci1_cfg_w32(priv
, TGT
, 0, PCI_COMMAND
, tmp
);
147 /* Bus always little endian (unaffected by byte-swapping) */
154 static int grpci1_cfg_r16(struct grpci1_priv
*priv
, unsigned int bus
,
155 unsigned int devfn
, int where
, u32
*val
)
162 ret
= grpci1_cfg_r32(priv
, bus
, devfn
, where
& ~0x3, &v
);
163 *val
= 0xffff & (v
>> (8 * (where
& 0x3)));
167 static int grpci1_cfg_r8(struct grpci1_priv
*priv
, unsigned int bus
,
168 unsigned int devfn
, int where
, u32
*val
)
173 ret
= grpci1_cfg_r32(priv
, bus
, devfn
, where
& ~0x3, &v
);
174 *val
= 0xff & (v
>> (8 * (where
& 3)));
179 static int grpci1_cfg_w32(struct grpci1_priv
*priv
, unsigned int bus
,
180 unsigned int devfn
, int where
, u32 val
)
182 unsigned int *pci_conf
;
189 devfn
+= (0x8 * 6); /* start at AD16=Device0 */
190 } else if (bus
== TGT
) {
192 devfn
= 0; /* special case: bridge controller itself */
196 cfg
= REGLOAD(priv
->regs
->cfg_stat
);
197 REGSTORE(priv
->regs
->cfg_stat
, (cfg
& ~(0xf << 23)) | (bus
<< 23));
199 pci_conf
= (unsigned int *) (priv
->pci_conf
|
200 (devfn
<< 8) | (where
& 0xfc));
201 LEON3_BYPASS_STORE_PA(pci_conf
, swab32(val
));
206 static int grpci1_cfg_w16(struct grpci1_priv
*priv
, unsigned int bus
,
207 unsigned int devfn
, int where
, u32 val
)
214 ret
= grpci1_cfg_r32(priv
, bus
, devfn
, where
&~3, &v
);
217 v
= (v
& ~(0xffff << (8 * (where
& 0x3)))) |
218 ((0xffff & val
) << (8 * (where
& 0x3)));
219 return grpci1_cfg_w32(priv
, bus
, devfn
, where
& ~0x3, v
);
222 static int grpci1_cfg_w8(struct grpci1_priv
*priv
, unsigned int bus
,
223 unsigned int devfn
, int where
, u32 val
)
228 ret
= grpci1_cfg_r32(priv
, bus
, devfn
, where
& ~0x3, &v
);
231 v
= (v
& ~(0xff << (8 * (where
& 0x3)))) |
232 ((0xff & val
) << (8 * (where
& 0x3)));
233 return grpci1_cfg_w32(priv
, bus
, devfn
, where
& ~0x3, v
);
236 /* Read from Configuration Space. When entering here the PCI layer has taken
237 * the pci_lock spinlock and IRQ is off.
239 static int grpci1_read_config(struct pci_bus
*bus
, unsigned int devfn
,
240 int where
, int size
, u32
*val
)
242 struct grpci1_priv
*priv
= grpci1priv
;
243 unsigned int busno
= bus
->number
;
246 if (PCI_SLOT(devfn
) > 15 || busno
> 15) {
253 ret
= grpci1_cfg_r8(priv
, busno
, devfn
, where
, val
);
256 ret
= grpci1_cfg_r16(priv
, busno
, devfn
, where
, val
);
259 ret
= grpci1_cfg_r32(priv
, busno
, devfn
, where
, val
);
266 #ifdef GRPCI1_DEBUG_CFGACCESS
268 "grpci1_read_config: [%02x:%02x:%x] ofs=%d val=%x size=%d\n",
269 busno
, PCI_SLOT(devfn
), PCI_FUNC(devfn
), where
, *val
, size
);
275 /* Write to Configuration Space. When entering here the PCI layer has taken
276 * the pci_lock spinlock and IRQ is off.
278 static int grpci1_write_config(struct pci_bus
*bus
, unsigned int devfn
,
279 int where
, int size
, u32 val
)
281 struct grpci1_priv
*priv
= grpci1priv
;
282 unsigned int busno
= bus
->number
;
284 if (PCI_SLOT(devfn
) > 15 || busno
> 15)
287 #ifdef GRPCI1_DEBUG_CFGACCESS
289 "grpci1_write_config: [%02x:%02x:%x] ofs=%d size=%d val=%x\n",
290 busno
, PCI_SLOT(devfn
), PCI_FUNC(devfn
), where
, size
, val
);
297 return grpci1_cfg_w8(priv
, busno
, devfn
, where
, val
);
299 return grpci1_cfg_w16(priv
, busno
, devfn
, where
, val
);
301 return grpci1_cfg_w32(priv
, busno
, devfn
, where
, val
);
305 static struct pci_ops grpci1_ops
= {
306 .read
= grpci1_read_config
,
307 .write
= grpci1_write_config
,
310 /* GENIRQ IRQ chip implementation for grpci1 irqmode=0..2. In configuration
311 * 3 where all PCI Interrupts has a separate IRQ on the system IRQ controller
312 * this is not needed and the standard IRQ controller can be used.
315 static void grpci1_mask_irq(struct irq_data
*data
)
318 struct grpci1_priv
*priv
= grpci1priv
;
320 irqidx
= (u32
)data
->chip_data
- 1;
321 if (irqidx
> 3) /* only mask PCI interrupts here */
323 irqidx
+= IRQ_MASK_BIT
;
325 REGSTORE(priv
->regs
->irq
, REGLOAD(priv
->regs
->irq
) & ~(1 << irqidx
));
328 static void grpci1_unmask_irq(struct irq_data
*data
)
331 struct grpci1_priv
*priv
= grpci1priv
;
333 irqidx
= (u32
)data
->chip_data
- 1;
334 if (irqidx
> 3) /* only unmask PCI interrupts here */
336 irqidx
+= IRQ_MASK_BIT
;
338 REGSTORE(priv
->regs
->irq
, REGLOAD(priv
->regs
->irq
) | (1 << irqidx
));
341 static unsigned int grpci1_startup_irq(struct irq_data
*data
)
343 grpci1_unmask_irq(data
);
347 static void grpci1_shutdown_irq(struct irq_data
*data
)
349 grpci1_mask_irq(data
);
352 static struct irq_chip grpci1_irq
= {
354 .irq_startup
= grpci1_startup_irq
,
355 .irq_shutdown
= grpci1_shutdown_irq
,
356 .irq_mask
= grpci1_mask_irq
,
357 .irq_unmask
= grpci1_unmask_irq
,
360 /* Handle one or multiple IRQs from the PCI core */
361 static void grpci1_pci_flow_irq(struct irq_desc
*desc
)
363 struct grpci1_priv
*priv
= grpci1priv
;
367 irqreg
= REGLOAD(priv
->regs
->irq
);
368 irqreg
= (irqreg
>> IRQ_MASK_BIT
) & irqreg
;
370 /* Error Interrupt? */
371 if (irqreg
& IRQ_ALL_ERRORS
) {
372 generic_handle_irq(priv
->irq_err
);
377 if (irqreg
& IRQ_INTX
) {
378 /* Call respective PCI Interrupt handler */
379 for (i
= 0; i
< 4; i
++) {
380 if (irqreg
& (1 << i
))
381 generic_handle_irq(priv
->irq_map
[i
]);
387 * Call "first level" IRQ chip end-of-irq handler. It will ACK LEON IRQ
388 * Controller, this must be done after IRQ sources have been handled to
389 * avoid double IRQ generation
392 desc
->irq_data
.chip
->irq_eoi(&desc
->irq_data
);
395 /* Create a virtual IRQ */
396 static unsigned int grpci1_build_device_irq(unsigned int irq
)
398 unsigned int virq
= 0, pil
;
401 virq
= irq_alloc(irq
, pil
);
405 irq_set_chip_and_handler_name(virq
, &grpci1_irq
, handle_simple_irq
,
407 irq_set_chip_data(virq
, (void *)irq
);
414 * Initialize mappings AMBA<->PCI, clear IRQ state, setup PCI interface
417 * BAR0: unused in this implementation
418 * BAR1: peripheral DMA to host's memory (size at least 256MByte)
419 * BAR2..BAR5: not implemented in hardware
421 static void grpci1_hw_init(struct grpci1_priv
*priv
)
423 u32 ahbadr
, bar_sz
, data
, pciadr
;
424 struct grpci1_regs __iomem
*regs
= priv
->regs
;
426 /* set 1:1 mapping between AHB -> PCI memory space */
427 REGSTORE(regs
->cfg_stat
, priv
->pci_area
& 0xf0000000);
429 /* map PCI accesses to target BAR1 to Linux kernel memory 1:1 */
430 ahbadr
= 0xf0000000 & (u32
)__pa(PAGE_ALIGN((unsigned long) &_end
));
431 REGSTORE(regs
->page1
, ahbadr
);
433 /* translate I/O accesses to 0, I/O Space always @ PCI low 64Kbytes */
434 REGSTORE(regs
->iomap
, REGLOAD(regs
->iomap
) & 0x0000ffff);
436 /* disable and clear pending interrupts */
437 REGSTORE(regs
->irq
, 0);
439 /* Setup BAR0 outside access range so that it does not conflict with
440 * peripheral DMA. There is no need to set up the PAGE0 register.
442 grpci1_cfg_w32(priv
, TGT
, 0, PCI_BASE_ADDRESS_0
, 0xffffffff);
443 grpci1_cfg_r32(priv
, TGT
, 0, PCI_BASE_ADDRESS_0
, &bar_sz
);
444 bar_sz
= ~bar_sz
+ 1;
445 pciadr
= priv
->pci_area
- bar_sz
;
446 grpci1_cfg_w32(priv
, TGT
, 0, PCI_BASE_ADDRESS_0
, pciadr
);
449 * Setup the Host's PCI Target BAR1 for other peripherals to access,
450 * and do DMA to the host's memory.
452 grpci1_cfg_w32(priv
, TGT
, 0, PCI_BASE_ADDRESS_1
, ahbadr
);
455 * Setup Latency Timer and cache line size. Default cache line
456 * size will result in poor performance (256 word fetches), 0xff
457 * will set it according to the max size of the PCI FIFO.
459 grpci1_cfg_w8(priv
, TGT
, 0, PCI_CACHE_LINE_SIZE
, 0xff);
460 grpci1_cfg_w8(priv
, TGT
, 0, PCI_LATENCY_TIMER
, 0x40);
462 /* set as bus master, enable pci memory responses, clear status bits */
463 grpci1_cfg_r32(priv
, TGT
, 0, PCI_COMMAND
, &data
);
464 data
|= (PCI_COMMAND_MEMORY
| PCI_COMMAND_MASTER
);
465 grpci1_cfg_w32(priv
, TGT
, 0, PCI_COMMAND
, data
);
468 static irqreturn_t
grpci1_jump_interrupt(int irq
, void *arg
)
470 struct grpci1_priv
*priv
= arg
;
471 dev_err(priv
->dev
, "Jump IRQ happened\n");
475 /* Handle GRPCI1 Error Interrupt */
476 static irqreturn_t
grpci1_err_interrupt(int irq
, void *arg
)
478 struct grpci1_priv
*priv
= arg
;
481 grpci1_cfg_r16(priv
, TGT
, 0, PCI_STATUS
, &status
);
482 status
&= priv
->pci_err_mask
;
487 if (status
& PCI_STATUS_PARITY
)
488 dev_err(priv
->dev
, "Data Parity Error\n");
490 if (status
& PCI_STATUS_SIG_TARGET_ABORT
)
491 dev_err(priv
->dev
, "Signalled Target Abort\n");
493 if (status
& PCI_STATUS_REC_TARGET_ABORT
)
494 dev_err(priv
->dev
, "Received Target Abort\n");
496 if (status
& PCI_STATUS_REC_MASTER_ABORT
)
497 dev_err(priv
->dev
, "Received Master Abort\n");
499 if (status
& PCI_STATUS_SIG_SYSTEM_ERROR
)
500 dev_err(priv
->dev
, "Signalled System Error\n");
502 if (status
& PCI_STATUS_DETECTED_PARITY
)
503 dev_err(priv
->dev
, "Parity Error\n");
505 /* Clear handled INT TYPE IRQs */
506 grpci1_cfg_w16(priv
, TGT
, 0, PCI_STATUS
, status
);
511 static int grpci1_of_probe(struct platform_device
*ofdev
)
513 struct grpci1_regs __iomem
*regs
;
514 struct grpci1_priv
*priv
;
517 u32 cfg
, size
, err_mask
;
518 struct resource
*res
;
521 dev_err(&ofdev
->dev
, "only one GRPCI1 supported\n");
525 if (ofdev
->num_resources
< 3) {
526 dev_err(&ofdev
->dev
, "not enough APB/AHB resources\n");
530 priv
= devm_kzalloc(&ofdev
->dev
, sizeof(*priv
), GFP_KERNEL
);
532 dev_err(&ofdev
->dev
, "memory allocation failed\n");
535 platform_set_drvdata(ofdev
, priv
);
536 priv
->dev
= &ofdev
->dev
;
538 /* find device register base address */
539 res
= platform_get_resource(ofdev
, IORESOURCE_MEM
, 0);
540 regs
= devm_ioremap_resource(&ofdev
->dev
, res
);
542 return PTR_ERR(regs
);
545 * check that we're in Host Slot and that we can act as a Host Bridge
546 * and not only as target/peripheral.
548 cfg
= REGLOAD(regs
->cfg_stat
);
549 if ((cfg
& CFGSTAT_HOST
) == 0) {
550 dev_err(&ofdev
->dev
, "not in host system slot\n");
554 /* check that BAR1 support 256 MByte so that we can map kernel space */
555 REGSTORE(regs
->page1
, 0xffffffff);
556 size
= ~REGLOAD(regs
->page1
) + 1;
557 if (size
< 0x10000000) {
558 dev_err(&ofdev
->dev
, "BAR1 must be at least 256MByte\n");
562 /* hardware must support little-endian PCI (byte-twisting) */
563 if ((REGLOAD(regs
->page0
) & PAGE0_BTEN
) == 0) {
564 dev_err(&ofdev
->dev
, "byte-twisting is required\n");
569 priv
->irq
= irq_of_parse_and_map(ofdev
->dev
.of_node
, 0);
570 dev_info(&ofdev
->dev
, "host found at 0x%p, irq%d\n", regs
, priv
->irq
);
572 /* Find PCI Memory, I/O and Configuration Space Windows */
573 priv
->pci_area
= ofdev
->resource
[1].start
;
574 priv
->pci_area_end
= ofdev
->resource
[1].end
+1;
575 priv
->pci_io
= ofdev
->resource
[2].start
;
576 priv
->pci_conf
= ofdev
->resource
[2].start
+ 0x10000;
577 priv
->pci_conf_end
= priv
->pci_conf
+ 0x10000;
578 priv
->pci_io_va
= (unsigned long)ioremap(priv
->pci_io
, 0x10000);
579 if (!priv
->pci_io_va
) {
580 dev_err(&ofdev
->dev
, "unable to map PCI I/O area\n");
585 "GRPCI1: MEMORY SPACE [0x%08lx - 0x%08lx]\n"
586 " I/O SPACE [0x%08lx - 0x%08lx]\n"
587 " CONFIG SPACE [0x%08lx - 0x%08lx]\n",
588 priv
->pci_area
, priv
->pci_area_end
-1,
589 priv
->pci_io
, priv
->pci_conf
-1,
590 priv
->pci_conf
, priv
->pci_conf_end
-1);
593 * I/O Space resources in I/O Window mapped into Virtual Adr Space
594 * We never use low 4KB because some devices seem have problems using
597 priv
->info
.io_space
.name
= "GRPCI1 PCI I/O Space";
598 priv
->info
.io_space
.start
= priv
->pci_io_va
+ 0x1000;
599 priv
->info
.io_space
.end
= priv
->pci_io_va
+ 0x10000 - 1;
600 priv
->info
.io_space
.flags
= IORESOURCE_IO
;
603 * grpci1 has no prefetchable memory, map everything as
604 * non-prefetchable memory
606 priv
->info
.mem_space
.name
= "GRPCI1 PCI MEM Space";
607 priv
->info
.mem_space
.start
= priv
->pci_area
;
608 priv
->info
.mem_space
.end
= priv
->pci_area_end
- 1;
609 priv
->info
.mem_space
.flags
= IORESOURCE_MEM
;
611 if (request_resource(&iomem_resource
, &priv
->info
.mem_space
) < 0) {
612 dev_err(&ofdev
->dev
, "unable to request PCI memory area\n");
617 if (request_resource(&ioport_resource
, &priv
->info
.io_space
) < 0) {
618 dev_err(&ofdev
->dev
, "unable to request PCI I/O area\n");
623 /* setup maximum supported PCI buses */
624 priv
->info
.busn
.name
= "GRPCI1 busn";
625 priv
->info
.busn
.start
= 0;
626 priv
->info
.busn
.end
= 15;
630 /* Initialize hardware */
631 grpci1_hw_init(priv
);
634 * Get PCI Interrupt to System IRQ mapping and setup IRQ handling
635 * Error IRQ. All PCI and PCI-Error interrupts are shared using the
638 leon_update_virq_handling(priv
->irq
, grpci1_pci_flow_irq
, "pcilvl", 0);
640 priv
->irq_map
[0] = grpci1_build_device_irq(1);
641 priv
->irq_map
[1] = grpci1_build_device_irq(2);
642 priv
->irq_map
[2] = grpci1_build_device_irq(3);
643 priv
->irq_map
[3] = grpci1_build_device_irq(4);
644 priv
->irq_err
= grpci1_build_device_irq(5);
646 printk(KERN_INFO
" PCI INTA..D#: IRQ%d, IRQ%d, IRQ%d, IRQ%d\n",
647 priv
->irq_map
[0], priv
->irq_map
[1], priv
->irq_map
[2],
650 /* Enable IRQs on LEON IRQ controller */
651 err
= devm_request_irq(&ofdev
->dev
, priv
->irq
, grpci1_jump_interrupt
, 0,
652 "GRPCI1_JUMP", priv
);
654 dev_err(&ofdev
->dev
, "ERR IRQ request failed: %d\n", err
);
658 /* Setup IRQ handler for access errors */
659 err
= devm_request_irq(&ofdev
->dev
, priv
->irq_err
,
660 grpci1_err_interrupt
, IRQF_SHARED
, "GRPCI1_ERR",
663 dev_err(&ofdev
->dev
, "ERR VIRQ request failed: %d\n", err
);
667 tmp
= of_get_property(ofdev
->dev
.of_node
, "all_pci_errors", &len
);
668 if (tmp
&& (len
== 4)) {
669 priv
->pci_err_mask
= ALL_PCI_ERRORS
;
670 err_mask
= IRQ_ALL_ERRORS
<< IRQ_MASK_BIT
;
672 priv
->pci_err_mask
= DEF_PCI_ERRORS
;
673 err_mask
= IRQ_DEF_ERRORS
<< IRQ_MASK_BIT
;
677 * Enable Error Interrupts. PCI interrupts are unmasked once request_irq
678 * is called by the PCI Device drivers
680 REGSTORE(regs
->irq
, err_mask
);
682 /* Init common layer and scan buses */
683 priv
->info
.ops
= &grpci1_ops
;
684 priv
->info
.map_irq
= grpci1_map_irq
;
685 leon_pci_init(ofdev
, &priv
->info
);
690 release_resource(&priv
->info
.io_space
);
692 release_resource(&priv
->info
.mem_space
);
694 iounmap((void __iomem
*)priv
->pci_io_va
);
699 static const struct of_device_id grpci1_of_match
[] __initconst
= {
701 .name
= "GAISLER_PCIFBRG",
709 static struct platform_driver grpci1_of_driver
= {
712 .of_match_table
= grpci1_of_match
,
714 .probe
= grpci1_of_probe
,
717 static int __init
grpci1_init(void)
719 return platform_driver_register(&grpci1_of_driver
);
722 subsys_initcall(grpci1_init
);