mirror of
https://github.com/team-infusion-developers/android_kernel_samsung_msm8976.git
synced 2024-09-30 00:34:35 +00:00
[SERIAL] Pass around serial_private instead of pci_dev
Pass the serial_private structure via the setup method instead of the pci_dev. We don't want to assume that the pci_dev's driver data is a pointer to serial_private. Instead, put the pci_dev inside serial_private. Signed-off-by: Russell King <rmk+kernel@arm.linux.org.uk>
This commit is contained in:
parent
67d74b8707
commit
70db3d91a5
1 changed files with 22 additions and 18 deletions
|
@ -63,6 +63,8 @@ struct pciserial_board {
|
||||||
unsigned int first_offset;
|
unsigned int first_offset;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
struct serial_private;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* init function returns:
|
* init function returns:
|
||||||
* > 0 - number of ports
|
* > 0 - number of ports
|
||||||
|
@ -75,7 +77,7 @@ struct pci_serial_quirk {
|
||||||
u32 subvendor;
|
u32 subvendor;
|
||||||
u32 subdevice;
|
u32 subdevice;
|
||||||
int (*init)(struct pci_dev *dev);
|
int (*init)(struct pci_dev *dev);
|
||||||
int (*setup)(struct pci_dev *dev, struct pciserial_board *,
|
int (*setup)(struct serial_private *, struct pciserial_board *,
|
||||||
struct uart_port *port, int idx);
|
struct uart_port *port, int idx);
|
||||||
void (*exit)(struct pci_dev *dev);
|
void (*exit)(struct pci_dev *dev);
|
||||||
};
|
};
|
||||||
|
@ -83,6 +85,7 @@ struct pci_serial_quirk {
|
||||||
#define PCI_NUM_BAR_RESOURCES 6
|
#define PCI_NUM_BAR_RESOURCES 6
|
||||||
|
|
||||||
struct serial_private {
|
struct serial_private {
|
||||||
|
struct pci_dev *dev;
|
||||||
unsigned int nr;
|
unsigned int nr;
|
||||||
void __iomem *remapped_bar[PCI_NUM_BAR_RESOURCES];
|
void __iomem *remapped_bar[PCI_NUM_BAR_RESOURCES];
|
||||||
struct pci_serial_quirk *quirk;
|
struct pci_serial_quirk *quirk;
|
||||||
|
@ -101,10 +104,10 @@ static void moan_device(const char *str, struct pci_dev *dev)
|
||||||
}
|
}
|
||||||
|
|
||||||
static int
|
static int
|
||||||
setup_port(struct pci_dev *dev, struct uart_port *port,
|
setup_port(struct serial_private *priv, struct uart_port *port,
|
||||||
int bar, int offset, int regshift)
|
int bar, int offset, int regshift)
|
||||||
{
|
{
|
||||||
struct serial_private *priv = pci_get_drvdata(dev);
|
struct pci_dev *dev = priv->dev;
|
||||||
unsigned long base, len;
|
unsigned long base, len;
|
||||||
|
|
||||||
if (bar >= PCI_NUM_BAR_RESOURCES)
|
if (bar >= PCI_NUM_BAR_RESOURCES)
|
||||||
|
@ -140,7 +143,7 @@ setup_port(struct pci_dev *dev, struct uart_port *port,
|
||||||
* Not that ugly ;) -- HW
|
* Not that ugly ;) -- HW
|
||||||
*/
|
*/
|
||||||
static int
|
static int
|
||||||
afavlab_setup(struct pci_dev *dev, struct pciserial_board *board,
|
afavlab_setup(struct serial_private *priv, struct pciserial_board *board,
|
||||||
struct uart_port *port, int idx)
|
struct uart_port *port, int idx)
|
||||||
{
|
{
|
||||||
unsigned int bar, offset = board->first_offset;
|
unsigned int bar, offset = board->first_offset;
|
||||||
|
@ -153,7 +156,7 @@ afavlab_setup(struct pci_dev *dev, struct pciserial_board *board,
|
||||||
offset += (idx - 4) * board->uart_offset;
|
offset += (idx - 4) * board->uart_offset;
|
||||||
}
|
}
|
||||||
|
|
||||||
return setup_port(dev, port, bar, offset, board->reg_shift);
|
return setup_port(priv, port, bar, offset, board->reg_shift);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -193,13 +196,13 @@ static int __devinit pci_hp_diva_init(struct pci_dev *dev)
|
||||||
* some serial ports are supposed to be hidden on certain models.
|
* some serial ports are supposed to be hidden on certain models.
|
||||||
*/
|
*/
|
||||||
static int
|
static int
|
||||||
pci_hp_diva_setup(struct pci_dev *dev, struct pciserial_board *board,
|
pci_hp_diva_setup(struct serial_private *priv, struct pciserial_board *board,
|
||||||
struct uart_port *port, int idx)
|
struct uart_port *port, int idx)
|
||||||
{
|
{
|
||||||
unsigned int offset = board->first_offset;
|
unsigned int offset = board->first_offset;
|
||||||
unsigned int bar = FL_GET_BASE(board->flags);
|
unsigned int bar = FL_GET_BASE(board->flags);
|
||||||
|
|
||||||
switch (dev->subsystem_device) {
|
switch (priv->dev->subsystem_device) {
|
||||||
case PCI_DEVICE_ID_HP_DIVA_MAESTRO:
|
case PCI_DEVICE_ID_HP_DIVA_MAESTRO:
|
||||||
if (idx == 3)
|
if (idx == 3)
|
||||||
idx++;
|
idx++;
|
||||||
|
@ -216,7 +219,7 @@ pci_hp_diva_setup(struct pci_dev *dev, struct pciserial_board *board,
|
||||||
|
|
||||||
offset += idx * board->uart_offset;
|
offset += idx * board->uart_offset;
|
||||||
|
|
||||||
return setup_port(dev, port, bar, offset, board->reg_shift);
|
return setup_port(priv, port, bar, offset, board->reg_shift);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -311,7 +314,7 @@ static void __devexit pci_plx9050_exit(struct pci_dev *dev)
|
||||||
|
|
||||||
/* SBS Technologies Inc. PMC-OCTPRO and P-OCTAL cards */
|
/* SBS Technologies Inc. PMC-OCTPRO and P-OCTAL cards */
|
||||||
static int
|
static int
|
||||||
sbs_setup(struct pci_dev *dev, struct pciserial_board *board,
|
sbs_setup(struct serial_private *priv, struct pciserial_board *board,
|
||||||
struct uart_port *port, int idx)
|
struct uart_port *port, int idx)
|
||||||
{
|
{
|
||||||
unsigned int bar, offset = board->first_offset;
|
unsigned int bar, offset = board->first_offset;
|
||||||
|
@ -327,7 +330,7 @@ sbs_setup(struct pci_dev *dev, struct pciserial_board *board,
|
||||||
} else /* we have only 8 ports on PMC-OCTALPRO */
|
} else /* we have only 8 ports on PMC-OCTALPRO */
|
||||||
return 1;
|
return 1;
|
||||||
|
|
||||||
return setup_port(dev, port, bar, offset, board->reg_shift);
|
return setup_port(priv, port, bar, offset, board->reg_shift);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -543,7 +546,7 @@ static int __devinit pci_timedia_init(struct pci_dev *dev)
|
||||||
* Ugh, this is ugly as all hell --- TYT
|
* Ugh, this is ugly as all hell --- TYT
|
||||||
*/
|
*/
|
||||||
static int
|
static int
|
||||||
pci_timedia_setup(struct pci_dev *dev, struct pciserial_board *board,
|
pci_timedia_setup(struct serial_private *priv, struct pciserial_board *board,
|
||||||
struct uart_port *port, int idx)
|
struct uart_port *port, int idx)
|
||||||
{
|
{
|
||||||
unsigned int bar = 0, offset = board->first_offset;
|
unsigned int bar = 0, offset = board->first_offset;
|
||||||
|
@ -569,14 +572,14 @@ pci_timedia_setup(struct pci_dev *dev, struct pciserial_board *board,
|
||||||
bar = idx - 2;
|
bar = idx - 2;
|
||||||
}
|
}
|
||||||
|
|
||||||
return setup_port(dev, port, bar, offset, board->reg_shift);
|
return setup_port(priv, port, bar, offset, board->reg_shift);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Some Titan cards are also a little weird
|
* Some Titan cards are also a little weird
|
||||||
*/
|
*/
|
||||||
static int
|
static int
|
||||||
titan_400l_800l_setup(struct pci_dev *dev,
|
titan_400l_800l_setup(struct serial_private *priv,
|
||||||
struct pciserial_board *board,
|
struct pciserial_board *board,
|
||||||
struct uart_port *port, int idx)
|
struct uart_port *port, int idx)
|
||||||
{
|
{
|
||||||
|
@ -594,7 +597,7 @@ titan_400l_800l_setup(struct pci_dev *dev,
|
||||||
offset = (idx - 2) * board->uart_offset;
|
offset = (idx - 2) * board->uart_offset;
|
||||||
}
|
}
|
||||||
|
|
||||||
return setup_port(dev, port, bar, offset, board->reg_shift);
|
return setup_port(priv, port, bar, offset, board->reg_shift);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int __devinit pci_xircom_init(struct pci_dev *dev)
|
static int __devinit pci_xircom_init(struct pci_dev *dev)
|
||||||
|
@ -614,7 +617,7 @@ static int __devinit pci_netmos_init(struct pci_dev *dev)
|
||||||
}
|
}
|
||||||
|
|
||||||
static int
|
static int
|
||||||
pci_default_setup(struct pci_dev *dev, struct pciserial_board *board,
|
pci_default_setup(struct serial_private *priv, struct pciserial_board *board,
|
||||||
struct uart_port *port, int idx)
|
struct uart_port *port, int idx)
|
||||||
{
|
{
|
||||||
unsigned int bar, offset = board->first_offset, maxnr;
|
unsigned int bar, offset = board->first_offset, maxnr;
|
||||||
|
@ -625,13 +628,13 @@ pci_default_setup(struct pci_dev *dev, struct pciserial_board *board,
|
||||||
else
|
else
|
||||||
offset += idx * board->uart_offset;
|
offset += idx * board->uart_offset;
|
||||||
|
|
||||||
maxnr = (pci_resource_len(dev, bar) - board->first_offset) /
|
maxnr = (pci_resource_len(priv->dev, bar) - board->first_offset) /
|
||||||
(8 << board->reg_shift);
|
(8 << board->reg_shift);
|
||||||
|
|
||||||
if (board->flags & FL_REGION_SZ_CAP && idx >= maxnr)
|
if (board->flags & FL_REGION_SZ_CAP && idx >= maxnr)
|
||||||
return 1;
|
return 1;
|
||||||
|
|
||||||
return setup_port(dev, port, bar, offset, board->reg_shift);
|
return setup_port(priv, port, bar, offset, board->reg_shift);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* This should be in linux/pci_ids.h */
|
/* This should be in linux/pci_ids.h */
|
||||||
|
@ -1612,6 +1615,7 @@ pciserial_init_one(struct pci_dev *dev, const struct pci_device_id *ent)
|
||||||
memset(priv, 0, sizeof(struct serial_private) +
|
memset(priv, 0, sizeof(struct serial_private) +
|
||||||
sizeof(unsigned int) * nr_ports);
|
sizeof(unsigned int) * nr_ports);
|
||||||
|
|
||||||
|
priv->dev = dev;
|
||||||
priv->quirk = quirk;
|
priv->quirk = quirk;
|
||||||
pci_set_drvdata(dev, priv);
|
pci_set_drvdata(dev, priv);
|
||||||
|
|
||||||
|
@ -1622,7 +1626,7 @@ pciserial_init_one(struct pci_dev *dev, const struct pci_device_id *ent)
|
||||||
serial_port.dev = &dev->dev;
|
serial_port.dev = &dev->dev;
|
||||||
|
|
||||||
for (i = 0; i < nr_ports; i++) {
|
for (i = 0; i < nr_ports; i++) {
|
||||||
if (quirk->setup(dev, board, &serial_port, i))
|
if (quirk->setup(priv, board, &serial_port, i))
|
||||||
break;
|
break;
|
||||||
|
|
||||||
#ifdef SERIAL_DEBUG_PCI
|
#ifdef SERIAL_DEBUG_PCI
|
||||||
|
|
Loading…
Reference in a new issue