parisc: fix serial ports on C8000 workstation
The C8000 workstation (64 bit kernel only) has a somewhat different serial port configuration than other models. Thomas Bogendoerfer sent a patch to fix this in September 2010, which was now minimally modified by me. Signed-off-by: Thomas Bogendoerfer <tsbogend@alpha.franken.de> Signed-off-by: Helge Deller <deller@gmx.de>
Этот коммит содержится в:

коммит произвёл
Helge Deller

родитель
91ea820716
Коммит
9a66d1869d
@@ -811,6 +811,70 @@ int iosapic_fixup_irq(void *isi_obj, struct pci_dev *pcidev)
|
||||
return pcidev->irq;
|
||||
}
|
||||
|
||||
static struct iosapic_info *first_isi = NULL;
|
||||
|
||||
#ifdef CONFIG_64BIT
|
||||
int iosapic_serial_irq(int num)
|
||||
{
|
||||
struct iosapic_info *isi = first_isi;
|
||||
struct irt_entry *irte = NULL; /* only used if PAT PDC */
|
||||
struct vector_info *vi;
|
||||
int isi_line; /* line used by device */
|
||||
|
||||
/* lookup IRT entry for isi/slot/pin set */
|
||||
irte = &irt_cell[num];
|
||||
|
||||
DBG_IRT("iosapic_serial_irq(): irte %p %x %x %x %x %x %x %x %x\n",
|
||||
irte,
|
||||
irte->entry_type,
|
||||
irte->entry_length,
|
||||
irte->polarity_trigger,
|
||||
irte->src_bus_irq_devno,
|
||||
irte->src_bus_id,
|
||||
irte->src_seg_id,
|
||||
irte->dest_iosapic_intin,
|
||||
(u32) irte->dest_iosapic_addr);
|
||||
isi_line = irte->dest_iosapic_intin;
|
||||
|
||||
/* get vector info for this input line */
|
||||
vi = isi->isi_vector + isi_line;
|
||||
DBG_IRT("iosapic_serial_irq: line %d vi 0x%p\n", isi_line, vi);
|
||||
|
||||
/* If this IRQ line has already been setup, skip it */
|
||||
if (vi->irte)
|
||||
goto out;
|
||||
|
||||
vi->irte = irte;
|
||||
|
||||
/*
|
||||
* Allocate processor IRQ
|
||||
*
|
||||
* XXX/FIXME The txn_alloc_irq() code and related code should be
|
||||
* moved to enable_irq(). That way we only allocate processor IRQ
|
||||
* bits for devices that actually have drivers claiming them.
|
||||
* Right now we assign an IRQ to every PCI device present,
|
||||
* regardless of whether it's used or not.
|
||||
*/
|
||||
vi->txn_irq = txn_alloc_irq(8);
|
||||
|
||||
if (vi->txn_irq < 0)
|
||||
panic("I/O sapic: couldn't get TXN IRQ\n");
|
||||
|
||||
/* enable_irq() will use txn_* to program IRdT */
|
||||
vi->txn_addr = txn_alloc_addr(vi->txn_irq);
|
||||
vi->txn_data = txn_alloc_data(vi->txn_irq);
|
||||
|
||||
vi->eoi_addr = isi->addr + IOSAPIC_REG_EOI;
|
||||
vi->eoi_data = cpu_to_le32(vi->txn_data);
|
||||
|
||||
cpu_claim_irq(vi->txn_irq, &iosapic_interrupt_type, vi);
|
||||
|
||||
out:
|
||||
|
||||
return vi->txn_irq;
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
/*
|
||||
** squirrel away the I/O Sapic Version
|
||||
@@ -877,6 +941,8 @@ void *iosapic_register(unsigned long hpa)
|
||||
vip->irqline = (unsigned char) cnt;
|
||||
vip->iosapic = isi;
|
||||
}
|
||||
if (!first_isi)
|
||||
first_isi = isi;
|
||||
return isi;
|
||||
}
|
||||
|
||||
|
Ссылка в новой задаче
Block a user