Skip to content

Commit

Permalink
Convert the oxsemi tornado special cases to use the quirk interface a…
Browse files Browse the repository at this point in the history
…nd 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>
  • Loading branch information
Russell King authored and Linus Torvalds committed Jan 2, 2009
1 parent 8c056e5 commit 9f2a036
Showing 1 changed file with 51 additions and 40 deletions.
91 changes: 51 additions & 40 deletions drivers/serial/8250_pci.c
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand Down Expand Up @@ -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
*/
Expand Down Expand Up @@ -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)
{
Expand All @@ -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;

/*
Expand Down

0 comments on commit 9f2a036

Please sign in to comment.