Skip to content

Commit

Permalink
[SERIAL] serial_cs: convert IBM post-init handling to a quirk
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
Russell King authored and Russell King committed Oct 1, 2006
1 parent a8244b5 commit eee3a88
Showing 1 changed file with 56 additions and 34 deletions.
90 changes: 56 additions & 34 deletions drivers/serial/serial_cs.c
Original file line number Diff line number Diff line change
Expand Up @@ -84,10 +84,59 @@ struct serial_quirk {
unsigned int manfid;
unsigned int prodid;
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[] = {
{
.manfid = MANFID_IBM,
.prodid = ~0,
.multi = -1,
.post = quirk_post_ibm,
}, {
.manfid = MANFID_OMEGA,
.prodid = PRODID_OMEGA_QSP_100,
.multi = 4,
Expand Down Expand Up @@ -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);

Expand Down Expand Up @@ -687,21 +717,13 @@ static int serial_config(struct pcmcia_device * link)
if (info->ndev == 0)
goto failed;

if (info->manfid == MANFID_IBM) {
conf_reg_t reg = { 0, CS_READ, 0x800, 0 };
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;
}
}
/*
* Apply any post-init quirk. FIXME: This should really happen
* before we register the port, since it might already be in use.
*/
if (info->quirk && info->quirk->post)
if (info->quirk->post(link))
goto failed;

link->dev_node = &info->node[0];
kfree(cfg_mem);
Expand Down

0 comments on commit eee3a88

Please sign in to comment.