mirror of
https://github.com/torvalds/linux.git
synced 2024-12-11 21:52:04 +00:00
[SERIAL] serial_cs: convert IBM post-init handling to a quirk
Move IBM quirk handling into its own quirk entry. Note that doing quirk handling after we've registered the ports is racy, but since I don't know if moving this will have an undesired effect, it's probably better to leave where it is. Signed-off-by: Russell King <rmk+kernel@arm.linux.org.uk>
This commit is contained in:
parent
a8244b564c
commit
eee3a883ce
@ -84,10 +84,59 @@ 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 */
|
||||||
|
int (*post)(struct pcmcia_device *);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
struct serial_info {
|
||||||
|
struct pcmcia_device *p_dev;
|
||||||
|
int ndev;
|
||||||
|
int multi;
|
||||||
|
int slave;
|
||||||
|
int manfid;
|
||||||
|
int prodid;
|
||||||
|
int c950ctrl;
|
||||||
|
dev_node_t node[4];
|
||||||
|
int line[4];
|
||||||
|
const struct serial_quirk *quirk;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct serial_cfg_mem {
|
||||||
|
tuple_t tuple;
|
||||||
|
cisparse_t parse;
|
||||||
|
u_char buf[256];
|
||||||
|
};
|
||||||
|
|
||||||
|
static int quirk_post_ibm(struct pcmcia_device *link)
|
||||||
|
{
|
||||||
|
conf_reg_t reg = { 0, CS_READ, 0x800, 0 };
|
||||||
|
int last_ret, last_fn;
|
||||||
|
|
||||||
|
last_ret = pcmcia_access_configuration_register(link, ®);
|
||||||
|
if (last_ret) {
|
||||||
|
last_fn = AccessConfigurationRegister;
|
||||||
|
goto cs_failed;
|
||||||
|
}
|
||||||
|
reg.Action = CS_WRITE;
|
||||||
|
reg.Value = reg.Value | 1;
|
||||||
|
last_ret = pcmcia_access_configuration_register(link, ®);
|
||||||
|
if (last_ret) {
|
||||||
|
last_fn = AccessConfigurationRegister;
|
||||||
|
goto cs_failed;
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
cs_failed:
|
||||||
|
cs_error(link, last_fn, last_ret);
|
||||||
|
return -ENODEV;
|
||||||
|
}
|
||||||
|
|
||||||
static const struct serial_quirk quirks[] = {
|
static const struct serial_quirk quirks[] = {
|
||||||
{
|
{
|
||||||
|
.manfid = MANFID_IBM,
|
||||||
|
.prodid = ~0,
|
||||||
|
.multi = -1,
|
||||||
|
.post = quirk_post_ibm,
|
||||||
|
}, {
|
||||||
.manfid = MANFID_OMEGA,
|
.manfid = MANFID_OMEGA,
|
||||||
.prodid = PRODID_OMEGA_QSP_100,
|
.prodid = PRODID_OMEGA_QSP_100,
|
||||||
.multi = 4,
|
.multi = 4,
|
||||||
@ -118,25 +167,6 @@ static const struct serial_quirk quirks[] = {
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
struct serial_info {
|
|
||||||
struct pcmcia_device *p_dev;
|
|
||||||
int ndev;
|
|
||||||
int multi;
|
|
||||||
int slave;
|
|
||||||
int manfid;
|
|
||||||
int prodid;
|
|
||||||
int c950ctrl;
|
|
||||||
dev_node_t node[4];
|
|
||||||
int line[4];
|
|
||||||
const struct serial_quirk *quirk;
|
|
||||||
};
|
|
||||||
|
|
||||||
struct serial_cfg_mem {
|
|
||||||
tuple_t tuple;
|
|
||||||
cisparse_t parse;
|
|
||||||
u_char buf[256];
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
static int serial_config(struct pcmcia_device * link);
|
static int serial_config(struct pcmcia_device * link);
|
||||||
|
|
||||||
@ -687,21 +717,13 @@ static int serial_config(struct pcmcia_device * link)
|
|||||||
if (info->ndev == 0)
|
if (info->ndev == 0)
|
||||||
goto failed;
|
goto failed;
|
||||||
|
|
||||||
if (info->manfid == MANFID_IBM) {
|
/*
|
||||||
conf_reg_t reg = { 0, CS_READ, 0x800, 0 };
|
* Apply any post-init quirk. FIXME: This should really happen
|
||||||
last_ret = pcmcia_access_configuration_register(link, ®);
|
* before we register the port, since it might already be in use.
|
||||||
if (last_ret) {
|
*/
|
||||||
last_fn = AccessConfigurationRegister;
|
if (info->quirk && info->quirk->post)
|
||||||
goto cs_failed;
|
if (info->quirk->post(link))
|
||||||
}
|
goto failed;
|
||||||
reg.Action = CS_WRITE;
|
|
||||||
reg.Value = reg.Value | 1;
|
|
||||||
last_ret = pcmcia_access_configuration_register(link, ®);
|
|
||||||
if (last_ret) {
|
|
||||||
last_fn = AccessConfigurationRegister;
|
|
||||||
goto cs_failed;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
link->dev_node = &info->node[0];
|
link->dev_node = &info->node[0];
|
||||||
kfree(cfg_mem);
|
kfree(cfg_mem);
|
||||||
|
Loading…
Reference in New Issue
Block a user