mirror of
https://github.com/BobTheBlinker/android_kernel_motorola_sm6375.git
synced 2026-10-29 03:01:39 -04:00
pcmcia: use autoconfiguration feature for ioports and iomem
When CONF_AUTO_SET_IO or CONF_AUTO_SET_IOMEM are set, the corresponding fields in struct pcmcia_device *p_dev->resource[0,1,2] are set accordinly. Drivers wishing to override certain settings may do so in the callback function, but they no longer need to parse the CIS entries stored in cistpl_cftable_entry_t themselves. CC: [email protected] CC: [email protected] CC: [email protected] CC: [email protected] CC: [email protected] CC: [email protected] CC: [email protected] CC: [email protected] CC: [email protected] CC: Jiri Kosina <[email protected]> CC: [email protected] Tested-by: Wolfram Sang <[email protected]> Signed-off-by: Dominik Brodowski <[email protected]>
This commit is contained in:
parent
440eed43e2
commit
00990e7ce0
44 changed files with 515 additions and 1025 deletions
|
|
@ -72,13 +72,8 @@ static void avmcs_detach(struct pcmcia_device *p_dev);
|
|||
|
||||
static int avmcs_probe(struct pcmcia_device *p_dev)
|
||||
{
|
||||
|
||||
/* The io structure describes IO port mapping */
|
||||
p_dev->resource[0]->end = 16;
|
||||
p_dev->resource[0]->flags |= IO_DATA_PATH_WIDTH_8;
|
||||
|
||||
/* General socket configuration */
|
||||
p_dev->config_flags |= CONF_ENABLE_IRQ;
|
||||
p_dev->config_flags |= CONF_ENABLE_IRQ | CONF_AUTO_SET_IO;
|
||||
p_dev->config_index = 1;
|
||||
p_dev->config_regs = PRESENT_OPTION;
|
||||
|
||||
|
|
@ -107,16 +102,12 @@ static void avmcs_detach(struct pcmcia_device *link)
|
|||
|
||||
======================================================================*/
|
||||
|
||||
static int avmcs_configcheck(struct pcmcia_device *p_dev,
|
||||
cistpl_cftable_entry_t *cf,
|
||||
cistpl_cftable_entry_t *dflt,
|
||||
void *priv_data)
|
||||
static int avmcs_configcheck(struct pcmcia_device *p_dev, void *priv_data)
|
||||
{
|
||||
if (cf->io.nwin <= 0)
|
||||
return -ENODEV;
|
||||
p_dev->resource[0]->end = 16;
|
||||
p_dev->resource[0]->flags &= ~IO_DATA_PATH_WIDTH;
|
||||
p_dev->resource[0]->flags |= IO_DATA_PATH_WIDTH_8;
|
||||
|
||||
p_dev->resource[0]->start = cf->io.win[0].base;
|
||||
p_dev->resource[0]->end = cf->io.win[0].len;
|
||||
return pcmcia_request_io(p_dev);
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -76,14 +76,8 @@ static int __devinit avma1cs_probe(struct pcmcia_device *p_dev)
|
|||
{
|
||||
dev_dbg(&p_dev->dev, "avma1cs_attach()\n");
|
||||
|
||||
/* The io structure describes IO port mapping */
|
||||
p_dev->resource[0]->end = 16;
|
||||
p_dev->resource[0]->flags |= IO_DATA_PATH_WIDTH_8;
|
||||
p_dev->resource[1]->end = 16;
|
||||
p_dev->resource[1]->flags |= IO_DATA_PATH_WIDTH_16;
|
||||
|
||||
/* General socket configuration */
|
||||
p_dev->config_flags |= CONF_ENABLE_IRQ;
|
||||
p_dev->config_flags |= CONF_ENABLE_IRQ | CONF_AUTO_SET_IO;
|
||||
p_dev->config_index = 1;
|
||||
p_dev->config_regs = PRESENT_OPTION;
|
||||
|
||||
|
|
@ -114,17 +108,13 @@ static void __devexit avma1cs_detach(struct pcmcia_device *link)
|
|||
|
||||
======================================================================*/
|
||||
|
||||
static int avma1cs_configcheck(struct pcmcia_device *p_dev,
|
||||
cistpl_cftable_entry_t *cf,
|
||||
cistpl_cftable_entry_t *dflt,
|
||||
void *priv_data)
|
||||
static int avma1cs_configcheck(struct pcmcia_device *p_dev, void *priv_data)
|
||||
{
|
||||
if (cf->io.nwin <= 0)
|
||||
return -ENODEV;
|
||||
|
||||
p_dev->resource[0]->start = cf->io.win[0].base;
|
||||
p_dev->resource[0]->end = cf->io.win[0].len;
|
||||
p_dev->resource[0]->end = 16;
|
||||
p_dev->resource[0]->flags &= ~IO_DATA_PATH_WIDTH;
|
||||
p_dev->resource[0]->flags |= IO_DATA_PATH_WIDTH_8;
|
||||
p_dev->io_lines = 5;
|
||||
|
||||
return pcmcia_request_io(p_dev);
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -118,16 +118,6 @@ static int __devinit elsa_cs_probe(struct pcmcia_device *link)
|
|||
|
||||
local->cardnr = -1;
|
||||
|
||||
/*
|
||||
General socket configuration defaults can go here. In this
|
||||
client, we assume very little, and rely on the CIS for almost
|
||||
everything. In most clients, many details (i.e., number, sizes,
|
||||
and attributes of IO windows) are fixed by the nature of the
|
||||
device, and can be hard-wired here.
|
||||
*/
|
||||
link->resource[0]->end = 8;
|
||||
link->resource[0]->flags |= IO_DATA_PATH_WIDTH_AUTO;
|
||||
|
||||
return elsa_cs_config(link);
|
||||
} /* elsa_cs_attach */
|
||||
|
||||
|
|
@ -160,18 +150,17 @@ static void __devexit elsa_cs_detach(struct pcmcia_device *link)
|
|||
|
||||
======================================================================*/
|
||||
|
||||
static int elsa_cs_configcheck(struct pcmcia_device *p_dev,
|
||||
cistpl_cftable_entry_t *cf,
|
||||
cistpl_cftable_entry_t *dflt,
|
||||
void *priv_data)
|
||||
static int elsa_cs_configcheck(struct pcmcia_device *p_dev, void *priv_data)
|
||||
{
|
||||
int j;
|
||||
|
||||
p_dev->io_lines = 3;
|
||||
p_dev->resource[0]->end = 8;
|
||||
p_dev->resource[0]->flags &= IO_DATA_PATH_WIDTH;
|
||||
p_dev->resource[0]->flags |= IO_DATA_PATH_WIDTH_AUTO;
|
||||
|
||||
if ((cf->io.nwin > 0) && cf->io.win[0].base) {
|
||||
if ((p_dev->resource[0]->end) && p_dev->resource[0]->start) {
|
||||
printk(KERN_INFO "(elsa_cs: looks like the 96 model)\n");
|
||||
p_dev->resource[0]->start = cf->io.win[0].base;
|
||||
if (!pcmcia_request_io(p_dev))
|
||||
return 0;
|
||||
} else {
|
||||
|
|
@ -194,6 +183,8 @@ static int __devinit elsa_cs_config(struct pcmcia_device *link)
|
|||
dev_dbg(&link->dev, "elsa_config(0x%p)\n", link);
|
||||
dev = link->priv;
|
||||
|
||||
link->config_flags |= CONF_ENABLE_IRQ | CONF_AUTO_SET_IO;
|
||||
|
||||
i = pcmcia_loop_config(link, elsa_cs_configcheck, NULL);
|
||||
if (i != 0)
|
||||
goto failed;
|
||||
|
|
|
|||
|
|
@ -128,8 +128,6 @@ static int __devinit sedlbauer_probe(struct pcmcia_device *link)
|
|||
/* from old sedl_cs
|
||||
*/
|
||||
/* The io structure describes IO port mapping */
|
||||
link->resource[0]->end = 8;
|
||||
link->resource[0]->flags |= IO_DATA_PATH_WIDTH_8;
|
||||
|
||||
return sedlbauer_config(link);
|
||||
} /* sedlbauer_attach */
|
||||
|
|
@ -161,35 +159,13 @@ static void __devexit sedlbauer_detach(struct pcmcia_device *link)
|
|||
device available to the system.
|
||||
|
||||
======================================================================*/
|
||||
static int sedlbauer_config_check(struct pcmcia_device *p_dev,
|
||||
cistpl_cftable_entry_t *cfg,
|
||||
cistpl_cftable_entry_t *dflt,
|
||||
void *priv_data)
|
||||
static int sedlbauer_config_check(struct pcmcia_device *p_dev, void *priv_data)
|
||||
{
|
||||
if (cfg->index == 0)
|
||||
return -ENODEV;
|
||||
if (p_dev->config_index == 0)
|
||||
return -EINVAL;
|
||||
|
||||
/* IO window settings */
|
||||
p_dev->resource[0]->end = p_dev->resource[1]->end = 0;
|
||||
if ((cfg->io.nwin > 0) || (dflt->io.nwin > 0)) {
|
||||
cistpl_io_t *io = (cfg->io.nwin) ? &cfg->io : &dflt->io;
|
||||
p_dev->resource[0]->start = io->win[0].base;
|
||||
p_dev->resource[0]->end = io->win[0].len;
|
||||
p_dev->resource[0]->flags &= ~IO_DATA_PATH_WIDTH;
|
||||
p_dev->resource[0]->flags |=
|
||||
pcmcia_io_cfg_data_width(io->flags);
|
||||
if (io->nwin > 1) {
|
||||
p_dev->resource[1]->flags = p_dev->resource[0]->flags;
|
||||
p_dev->resource[1]->start = io->win[1].base;
|
||||
p_dev->resource[1]->end = io->win[1].len;
|
||||
}
|
||||
/* This reserves IO space but doesn't actually enable it */
|
||||
p_dev->io_lines = 3;
|
||||
if (pcmcia_request_io(p_dev) != 0)
|
||||
return -ENODEV;
|
||||
}
|
||||
|
||||
return 0;
|
||||
p_dev->io_lines = 3;
|
||||
return pcmcia_request_io(p_dev);
|
||||
}
|
||||
|
||||
|
||||
|
|
@ -202,7 +178,7 @@ static int __devinit sedlbauer_config(struct pcmcia_device *link)
|
|||
dev_dbg(&link->dev, "sedlbauer_config(0x%p)\n", link);
|
||||
|
||||
link->config_flags |= CONF_ENABLE_IRQ | CONF_AUTO_CHECK_VCC |
|
||||
CONF_AUTO_SET_VPP | CONF_AUTO_AUDIO;
|
||||
CONF_AUTO_SET_VPP | CONF_AUTO_AUDIO | CONF_AUTO_SET_IO;
|
||||
|
||||
/*
|
||||
In this loop, we scan the CIS for configuration table entries,
|
||||
|
|
|
|||
|
|
@ -105,10 +105,7 @@ static int __devinit teles_probe(struct pcmcia_device *link)
|
|||
and attributes of IO windows) are fixed by the nature of the
|
||||
device, and can be hard-wired here.
|
||||
*/
|
||||
link->resource[0]->end = 96;
|
||||
link->resource[0]->flags |= IO_DATA_PATH_WIDTH_AUTO;
|
||||
|
||||
link->config_flags |= CONF_ENABLE_IRQ;
|
||||
link->config_flags |= CONF_ENABLE_IRQ | CONF_AUTO_SET_IO;
|
||||
|
||||
return teles_cs_config(link);
|
||||
} /* teles_attach */
|
||||
|
|
@ -142,18 +139,17 @@ static void __devexit teles_detach(struct pcmcia_device *link)
|
|||
|
||||
======================================================================*/
|
||||
|
||||
static int teles_cs_configcheck(struct pcmcia_device *p_dev,
|
||||
cistpl_cftable_entry_t *cf,
|
||||
cistpl_cftable_entry_t *dflt,
|
||||
void *priv_data)
|
||||
static int teles_cs_configcheck(struct pcmcia_device *p_dev, void *priv_data)
|
||||
{
|
||||
int j;
|
||||
|
||||
p_dev->io_lines = 5;
|
||||
p_dev->resource[0]->end = 96;
|
||||
p_dev->resource[0]->flags &= IO_DATA_PATH_WIDTH;
|
||||
p_dev->resource[0]->flags |= IO_DATA_PATH_WIDTH_AUTO;
|
||||
|
||||
if ((cf->io.nwin > 0) && cf->io.win[0].base) {
|
||||
if ((p_dev->resource[0]->end) && p_dev->resource[0]->start) {
|
||||
printk(KERN_INFO "(teles_cs: looks like the 96 model)\n");
|
||||
p_dev->resource[0]->start = cf->io.win[0].base;
|
||||
if (!pcmcia_request_io(p_dev))
|
||||
return 0;
|
||||
} else {
|
||||
|
|
|
|||
Loading…
Reference in a new issue