diff options
Diffstat (limited to 'drivers/char/pcmcia/synclink_cs.c')
| -rw-r--r-- | drivers/char/pcmcia/synclink_cs.c | 80 | 
1 files changed, 30 insertions, 50 deletions
diff --git a/drivers/char/pcmcia/synclink_cs.c b/drivers/char/pcmcia/synclink_cs.c index caf6e4d1946..c31a0d913d3 100644 --- a/drivers/char/pcmcia/synclink_cs.c +++ b/drivers/char/pcmcia/synclink_cs.c @@ -554,7 +554,6 @@ static int mgslpc_probe(struct pcmcia_device *link)      /* Interrupt setup */      link->irq.Attributes = IRQ_TYPE_DYNAMIC_SHARING; -    link->irq.IRQInfo1   = IRQ_LEVEL_ID;      link->irq.Handler = NULL;      link->conf.Attributes = 0; @@ -572,69 +571,51 @@ static int mgslpc_probe(struct pcmcia_device *link)  /* Card has been inserted.   */ -#define CS_CHECK(fn, ret) \ -do { last_fn = (fn); if ((last_ret = (ret)) != 0) goto cs_failed; } while (0) +static int mgslpc_ioprobe(struct pcmcia_device *p_dev, +			  cistpl_cftable_entry_t *cfg, +			  cistpl_cftable_entry_t *dflt, +			  unsigned int vcc, +			  void *priv_data) +{ +	if (cfg->io.nwin > 0) { +		p_dev->io.Attributes1 = IO_DATA_PATH_WIDTH_AUTO; +		if (!(cfg->io.flags & CISTPL_IO_8BIT)) +			p_dev->io.Attributes1 = IO_DATA_PATH_WIDTH_16; +		if (!(cfg->io.flags & CISTPL_IO_16BIT)) +			p_dev->io.Attributes1 = IO_DATA_PATH_WIDTH_8; +		p_dev->io.IOAddrLines = cfg->io.flags & CISTPL_IO_LINES_MASK; +		p_dev->io.BasePort1 = cfg->io.win[0].base; +		p_dev->io.NumPorts1 = cfg->io.win[0].len; +		return pcmcia_request_io(p_dev, &p_dev->io); +	} +	return -ENODEV; +}  static int mgslpc_config(struct pcmcia_device *link)  {      MGSLPC_INFO *info = link->priv; -    tuple_t tuple; -    cisparse_t parse; -    int last_fn, last_ret; -    u_char buf[64]; -    cistpl_cftable_entry_t dflt = { 0 }; -    cistpl_cftable_entry_t *cfg; +    int ret;      if (debug_level >= DEBUG_LEVEL_INFO)  	    printk("mgslpc_config(0x%p)\n", link); -    tuple.Attributes = 0; -    tuple.TupleData = buf; -    tuple.TupleDataMax = sizeof(buf); -    tuple.TupleOffset = 0; - -    /* get CIS configuration entry */ - -    tuple.DesiredTuple = CISTPL_CFTABLE_ENTRY; -    CS_CHECK(GetFirstTuple, pcmcia_get_first_tuple(link, &tuple)); - -    cfg = &(parse.cftable_entry); -    CS_CHECK(GetTupleData, pcmcia_get_tuple_data(link, &tuple)); -    CS_CHECK(ParseTuple, pcmcia_parse_tuple(&tuple, &parse)); - -    if (cfg->flags & CISTPL_CFTABLE_DEFAULT) dflt = *cfg; -    if (cfg->index == 0) -	    goto cs_failed; - -    link->conf.ConfigIndex = cfg->index; -    link->conf.Attributes |= CONF_ENABLE_IRQ; - -    /* IO window settings */ -    link->io.NumPorts1 = 0; -    if ((cfg->io.nwin > 0) || (dflt.io.nwin > 0)) { -	    cistpl_io_t *io = (cfg->io.nwin) ? &cfg->io : &dflt.io; -	    link->io.Attributes1 = IO_DATA_PATH_WIDTH_AUTO; -	    if (!(io->flags & CISTPL_IO_8BIT)) -		    link->io.Attributes1 = IO_DATA_PATH_WIDTH_16; -	    if (!(io->flags & CISTPL_IO_16BIT)) -		    link->io.Attributes1 = IO_DATA_PATH_WIDTH_8; -	    link->io.IOAddrLines = io->flags & CISTPL_IO_LINES_MASK; -	    link->io.BasePort1 = io->win[0].base; -	    link->io.NumPorts1 = io->win[0].len; -	    CS_CHECK(RequestIO, pcmcia_request_io(link, &link->io)); -    } +    ret = pcmcia_loop_config(link, mgslpc_ioprobe, NULL); +    if (ret != 0) +	    goto failed;      link->conf.Attributes = CONF_ENABLE_IRQ;      link->conf.IntType = INT_MEMORY_AND_IO;      link->conf.ConfigIndex = 8;      link->conf.Present = PRESENT_OPTION; -    link->irq.Attributes |= IRQ_HANDLE_PRESENT;      link->irq.Handler     = mgslpc_isr; -    link->irq.Instance    = info; -    CS_CHECK(RequestIRQ, pcmcia_request_irq(link, &link->irq)); -    CS_CHECK(RequestConfiguration, pcmcia_request_configuration(link, &link->conf)); +    ret = pcmcia_request_irq(link, &link->irq); +    if (ret) +	    goto failed; +    ret = pcmcia_request_configuration(link, &link->conf); +    if (ret) +	    goto failed;      info->io_base = link->io.BasePort1;      info->irq_level = link->irq.AssignedIRQ; @@ -654,8 +635,7 @@ static int mgslpc_config(struct pcmcia_device *link)      printk("\n");      return 0; -cs_failed: -    cs_error(link, last_fn, last_ret); +failed:      mgslpc_release((u_long)link);      return -ENODEV;  }  |