diff options
Diffstat (limited to 'drivers/bluetooth/btuart_cs.c')
| -rw-r--r-- | drivers/bluetooth/btuart_cs.c | 51 | 
1 files changed, 26 insertions, 25 deletions
diff --git a/drivers/bluetooth/btuart_cs.c b/drivers/bluetooth/btuart_cs.c index 8a6864fc8c3..9f9bb69dc0a 100644 --- a/drivers/bluetooth/btuart_cs.c +++ b/drivers/bluetooth/btuart_cs.c @@ -585,10 +585,8 @@ static int btuart_probe(struct pcmcia_device *link)  	info->p_dev = link;  	link->priv = info; -	link->resource[0]->flags |= IO_DATA_PATH_WIDTH_8; -	link->resource[0]->end = 8; - -	link->config_flags |= CONF_ENABLE_IRQ | CONF_AUTO_SET_VPP; +	link->config_flags |= CONF_ENABLE_IRQ | CONF_AUTO_SET_VPP | +		CONF_AUTO_SET_IO;  	return btuart_config(link);  } @@ -602,38 +600,41 @@ static void btuart_detach(struct pcmcia_device *link)  	kfree(info);  } -static int btuart_check_config(struct pcmcia_device *p_dev, -			       cistpl_cftable_entry_t *cf, -			       cistpl_cftable_entry_t *dflt, -			       void *priv_data) +static int btuart_check_config(struct pcmcia_device *p_dev, void *priv_data)  {  	int *try = priv_data; -	p_dev->io_lines = (try == 0) ? 16 : cf->io.flags & CISTPL_IO_LINES_MASK; -	if ((cf->io.nwin > 0) && (cf->io.win[0].len == 8) && -	    (cf->io.win[0].base != 0)) { -		p_dev->resource[0]->start = cf->io.win[0].base; -		if (!pcmcia_request_io(p_dev)) -			return 0; -	} -	return -ENODEV; +	if (try == 0) +		p_dev->io_lines = 16; + +	if ((p_dev->resource[0]->end != 8) || (p_dev->resource[0]->start == 0)) +		return -EINVAL; + +	p_dev->resource[0]->end = 8; +	p_dev->resource[0]->flags &= ~IO_DATA_PATH_WIDTH; +	p_dev->resource[0]->flags |= IO_DATA_PATH_WIDTH_8; + +	return pcmcia_request_io(p_dev);  }  static int btuart_check_config_notpicky(struct pcmcia_device *p_dev, -					cistpl_cftable_entry_t *cf, -					cistpl_cftable_entry_t *dflt,  					void *priv_data)  {  	static unsigned int base[5] = { 0x3f8, 0x2f8, 0x3e8, 0x2e8, 0x0 };  	int j; -	if ((cf->io.nwin > 0) && ((cf->io.flags & CISTPL_IO_LINES_MASK) <= 3)) { -		for (j = 0; j < 5; j++) { -			p_dev->resource[0]->start = base[j]; -			p_dev->io_lines = base[j] ? 16 : 3; -			if (!pcmcia_request_io(p_dev)) -				return 0; -		} +	if (p_dev->io_lines > 3) +		return -ENODEV; + +	p_dev->resource[0]->flags &= ~IO_DATA_PATH_WIDTH; +	p_dev->resource[0]->flags |= IO_DATA_PATH_WIDTH_8; +	p_dev->resource[0]->end = 8; + +	for (j = 0; j < 5; j++) { +		p_dev->resource[0]->start = base[j]; +		p_dev->io_lines = base[j] ? 16 : 3; +		if (!pcmcia_request_io(p_dev)) +			return 0;  	}  	return -ENODEV;  }  |