diff options
author | Russell King <rmk@dyn-67.arm.linux.org.uk> | 2006-09-16 23:00:54 +0100 |
---|---|---|
committer | Russell King <rmk+kernel@arm.linux.org.uk> | 2006-10-01 17:06:37 +0100 |
commit | efd92dfaad962c4fbaf4251b28578c97bd3aa85f (patch) | |
tree | d3f0a68985fb72423681ac005df3500d8e3955b3 /drivers/serial/serial_cs.c | |
parent | 7ef057fa707897c19725d7e07123e57f6aea79db (diff) | |
download | blackbird-op-linux-efd92dfaad962c4fbaf4251b28578c97bd3aa85f.tar.gz blackbird-op-linux-efd92dfaad962c4fbaf4251b28578c97bd3aa85f.zip |
[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: Russell King <rmk+kernel@arm.linux.org.uk>
Diffstat (limited to 'drivers/serial/serial_cs.c')
-rw-r--r-- | drivers/serial/serial_cs.c | 39 |
1 files changed, 34 insertions, 5 deletions
diff --git a/drivers/serial/serial_cs.c b/drivers/serial/serial_cs.c index 8e48cb659b3d..788ba404efc6 100644 --- a/drivers/serial/serial_cs.c +++ b/drivers/serial/serial_cs.c @@ -84,6 +84,7 @@ struct serial_quirk { unsigned int manfid; unsigned int prodid; int multi; /* 1 = multifunction, > 1 = # ports */ + void (*config)(struct pcmcia_device *); void (*wakeup)(struct pcmcia_device *); int (*post)(struct pcmcia_device *); }; @@ -164,6 +165,19 @@ static void quirk_wakeup_possio_gcc(struct pcmcia_device *link) 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[] = { { .manfid = MANFID_IBM, @@ -208,6 +222,12 @@ static const struct serial_quirk quirks[] = { .manfid = MANFID_SOCKET, .prodid = PRODID_SOCKET_DUAL_RS232, .multi = 2, + .config = quirk_config_socket, + }, { + .manfid = MANFID_SOCKET, + .prodid = ~0, + .multi = -1, + .config = quirk_config_socket, } }; @@ -504,6 +524,13 @@ next_entry: } if (info->multi && (info->manfid == MANFID_3COM)) 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); if (i != CS_SUCCESS) { cs_error(link, RequestConfiguration, i); @@ -592,11 +619,13 @@ static int multi_config(struct pcmcia_device * link) cs_error(link, RequestIRQ, i); 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; - link->conf.ExtStatus = ESR_REQ_ATTN_ENA; - } + + /* + * Apply any configuration quirks. + */ + if (info->quirk && info->quirk->config) + info->quirk->config(link); + i = pcmcia_request_configuration(link, &link->conf); if (i != CS_SUCCESS) { cs_error(link, RequestConfiguration, i); |