Convert the oxsemi tornado special cases to use the quirk interface and not
scribble on its own reference structures. Signed-off-by: Russell King <rmk+kernel@arm.linux.org.uk> Signed-off-by: Alan Cox <alan@redhat.com> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
This commit is contained in:
parent
8c056e5b14
commit
9f2a036aaa
|
@ -737,6 +737,38 @@ static void __devexit pci_ite887x_exit(struct pci_dev *dev)
|
|||
release_region(ioport, ITE_887x_IOSIZE);
|
||||
}
|
||||
|
||||
/*
|
||||
* Oxford Semiconductor Inc.
|
||||
* Check that device is part of the Tornado range of devices, then determine
|
||||
* the number of ports available on the device.
|
||||
*/
|
||||
static int pci_oxsemi_tornado_init(struct pci_dev *dev)
|
||||
{
|
||||
u8 __iomem *p;
|
||||
unsigned long deviceID;
|
||||
unsigned int number_uarts = 0;
|
||||
|
||||
/* OxSemi Tornado devices are all 0xCxxx */
|
||||
if (dev->vendor == PCI_VENDOR_ID_OXSEMI &&
|
||||
(dev->device & 0xF000) != 0xC000)
|
||||
return 0;
|
||||
|
||||
p = pci_iomap(dev, 0, 5);
|
||||
if (p == NULL)
|
||||
return -ENOMEM;
|
||||
|
||||
deviceID = ioread32(p);
|
||||
/* Tornado device */
|
||||
if (deviceID == 0x07000200) {
|
||||
number_uarts = ioread8(p + 4);
|
||||
printk(KERN_DEBUG
|
||||
"%d ports detected on Oxford PCI Express device\n",
|
||||
number_uarts);
|
||||
}
|
||||
pci_iounmap(dev, p);
|
||||
return number_uarts;
|
||||
}
|
||||
|
||||
static int
|
||||
pci_default_setup(struct serial_private *priv, struct pciserial_board *board,
|
||||
struct uart_port *port, int idx)
|
||||
|
@ -1017,6 +1049,25 @@ static struct pci_serial_quirk pci_serial_quirks[] __refdata = {
|
|||
.init = pci_netmos_init,
|
||||
.setup = pci_default_setup,
|
||||
},
|
||||
/*
|
||||
* For Oxford Semiconductor and Mainpine
|
||||
*/
|
||||
{
|
||||
.vendor = PCI_VENDOR_ID_OXSEMI,
|
||||
.device = PCI_ANY_ID,
|
||||
.subvendor = PCI_ANY_ID,
|
||||
.subdevice = PCI_ANY_ID,
|
||||
.init = pci_oxsemi_tornado_init,
|
||||
.setup = pci_default_setup,
|
||||
},
|
||||
{
|
||||
.vendor = PCI_VENDOR_ID_MAINPINE,
|
||||
.device = PCI_ANY_ID,
|
||||
.subvendor = PCI_ANY_ID,
|
||||
.subdevice = PCI_ANY_ID,
|
||||
.init = pci_oxsemi_tornado_init,
|
||||
.setup = pci_default_setup,
|
||||
},
|
||||
/*
|
||||
* Default "match everything" terminator entry
|
||||
*/
|
||||
|
@ -1854,39 +1905,6 @@ serial_pci_matches(struct pciserial_board *board,
|
|||
board->first_offset == guessed->first_offset;
|
||||
}
|
||||
|
||||
/*
|
||||
* Oxford Semiconductor Inc.
|
||||
* Check that device is part of the Tornado range of devices, then determine
|
||||
* the number of ports available on the device.
|
||||
*/
|
||||
static int pci_oxsemi_tornado_init(struct pci_dev *dev, struct pciserial_board *board)
|
||||
{
|
||||
u8 __iomem *p;
|
||||
unsigned long deviceID;
|
||||
unsigned int number_uarts;
|
||||
|
||||
/* OxSemi Tornado devices are all 0xCxxx */
|
||||
if (dev->vendor == PCI_VENDOR_ID_OXSEMI &&
|
||||
(dev->device & 0xF000) != 0xC000)
|
||||
return 0;
|
||||
|
||||
p = pci_iomap(dev, 0, 5);
|
||||
if (p == NULL)
|
||||
return -ENOMEM;
|
||||
|
||||
deviceID = ioread32(p);
|
||||
/* Tornado device */
|
||||
if (deviceID == 0x07000200) {
|
||||
number_uarts = ioread8(p + 4);
|
||||
board->num_ports = number_uarts;
|
||||
printk(KERN_DEBUG
|
||||
"%d ports detected on Oxford PCI Express device\n",
|
||||
number_uarts);
|
||||
}
|
||||
pci_iounmap(dev, p);
|
||||
return 0;
|
||||
}
|
||||
|
||||
struct serial_private *
|
||||
pciserial_init_ports(struct pci_dev *dev, struct pciserial_board *board)
|
||||
{
|
||||
|
@ -1895,13 +1913,6 @@ pciserial_init_ports(struct pci_dev *dev, struct pciserial_board *board)
|
|||
struct pci_serial_quirk *quirk;
|
||||
int rc, nr_ports, i;
|
||||
|
||||
/*
|
||||
* Find number of ports on board
|
||||
*/
|
||||
if (dev->vendor == PCI_VENDOR_ID_OXSEMI ||
|
||||
dev->vendor == PCI_VENDOR_ID_MAINPINE)
|
||||
pci_oxsemi_tornado_init(dev, board);
|
||||
|
||||
nr_ports = board->num_ports;
|
||||
|
||||
/*
|
||||
|
|
Loading…
Reference in New Issue