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

[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: default avatarRussell King <rmk+kernel@arm.linux.org.uk>
parent a8244b56
...@@ -84,10 +84,59 @@ struct serial_quirk { ...@@ -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, &reg);
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, &reg);
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[] = { ...@@ -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) ...@@ -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, &reg); * 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, &reg);
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);
......
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