Commit efd92dfa authored by Russell King's avatar Russell King Committed by Russell King

[SERIAL] serial_cs: add configuration quirk

Add a quirk primerily to handle tweaks to the link->conf structure,
eg as required for Socket cards.
Signed-off-by: default avatarRussell King <rmk+kernel@arm.linux.org.uk>
parent 7ef057fa
...@@ -84,6 +84,7 @@ struct serial_quirk { ...@@ -84,6 +84,7 @@ struct serial_quirk {
unsigned int manfid; unsigned int manfid;
unsigned int prodid; unsigned int prodid;
int multi; /* 1 = multifunction, > 1 = # ports */ int multi; /* 1 = multifunction, > 1 = # ports */
void (*config)(struct pcmcia_device *);
void (*wakeup)(struct pcmcia_device *); void (*wakeup)(struct pcmcia_device *);
int (*post)(struct pcmcia_device *); int (*post)(struct pcmcia_device *);
}; };
...@@ -164,6 +165,19 @@ static void quirk_wakeup_possio_gcc(struct pcmcia_device *link) ...@@ -164,6 +165,19 @@ static void quirk_wakeup_possio_gcc(struct pcmcia_device *link)
outb(0xC, ctrl + 1); outb(0xC, ctrl + 1);
} }
/*
* Socket Dual IO: this enables irq's for second port
*/
static void quirk_config_socket(struct pcmcia_device *link)
{
struct serial_info *info = link->priv;
if (info->multi) {
link->conf.Present |= PRESENT_EXT_STATUS;
link->conf.ExtStatus = ESR_REQ_ATTN_ENA;
}
}
static const struct serial_quirk quirks[] = { static const struct serial_quirk quirks[] = {
{ {
.manfid = MANFID_IBM, .manfid = MANFID_IBM,
...@@ -208,6 +222,12 @@ static const struct serial_quirk quirks[] = { ...@@ -208,6 +222,12 @@ static const struct serial_quirk quirks[] = {
.manfid = MANFID_SOCKET, .manfid = MANFID_SOCKET,
.prodid = PRODID_SOCKET_DUAL_RS232, .prodid = PRODID_SOCKET_DUAL_RS232,
.multi = 2, .multi = 2,
.config = quirk_config_socket,
}, {
.manfid = MANFID_SOCKET,
.prodid = ~0,
.multi = -1,
.config = quirk_config_socket,
} }
}; };
...@@ -504,6 +524,13 @@ static int simple_config(struct pcmcia_device *link) ...@@ -504,6 +524,13 @@ static int simple_config(struct pcmcia_device *link)
} }
if (info->multi && (info->manfid == MANFID_3COM)) if (info->multi && (info->manfid == MANFID_3COM))
link->conf.ConfigIndex &= ~(0x08); link->conf.ConfigIndex &= ~(0x08);
/*
* Apply any configuration quirks.
*/
if (info->quirk && info->quirk->config)
info->quirk->config(link);
i = pcmcia_request_configuration(link, &link->conf); i = pcmcia_request_configuration(link, &link->conf);
if (i != CS_SUCCESS) { if (i != CS_SUCCESS) {
cs_error(link, RequestConfiguration, i); cs_error(link, RequestConfiguration, i);
...@@ -592,11 +619,13 @@ static int multi_config(struct pcmcia_device * link) ...@@ -592,11 +619,13 @@ static int multi_config(struct pcmcia_device * link)
cs_error(link, RequestIRQ, i); cs_error(link, RequestIRQ, i);
link->irq.AssignedIRQ = 0; link->irq.AssignedIRQ = 0;
} }
/* Socket Dual IO: this enables irq's for second port */
if (info->multi && (info->manfid == MANFID_SOCKET)) { /*
link->conf.Present |= PRESENT_EXT_STATUS; * Apply any configuration quirks.
link->conf.ExtStatus = ESR_REQ_ATTN_ENA; */
} if (info->quirk && info->quirk->config)
info->quirk->config(link);
i = pcmcia_request_configuration(link, &link->conf); i = pcmcia_request_configuration(link, &link->conf);
if (i != CS_SUCCESS) { if (i != CS_SUCCESS) {
cs_error(link, RequestConfiguration, i); cs_error(link, RequestConfiguration, i);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment