mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2024-11-26 05:34:13 +08:00
PCMCIA: soc_common: push socket probe down into SoC specific support
Move the individual socket probing and initialization down into the SoC specific support files, thereby allowing soc_common_drv_pcmcia_probe to be eliminated. soc_common.c now no longer deals with distinct groups of sockets. Signed-off-by: Russell King <rmk+kernel@arm.linux.org.uk> Signed-off-by: Dominik Brodowski <linux@dominikbrodowski.net>
This commit is contained in:
parent
be85458edc
commit
da4f007375
@ -228,6 +228,31 @@ static const char *skt_names[] = {
|
|||||||
#define SKT_DEV_INFO_SIZE(n) \
|
#define SKT_DEV_INFO_SIZE(n) \
|
||||||
(sizeof(struct skt_dev_info) + (n)*sizeof(struct soc_pcmcia_socket))
|
(sizeof(struct skt_dev_info) + (n)*sizeof(struct soc_pcmcia_socket))
|
||||||
|
|
||||||
|
static int pxa2xx_drv_pcmcia_add_one(struct soc_pcmcia_socket *skt)
|
||||||
|
{
|
||||||
|
skt->res_skt.start = _PCMCIA(skt->nr);
|
||||||
|
skt->res_skt.end = _PCMCIA(skt->nr) + PCMCIASp - 1;
|
||||||
|
skt->res_skt.name = skt_names[skt->nr];
|
||||||
|
skt->res_skt.flags = IORESOURCE_MEM;
|
||||||
|
|
||||||
|
skt->res_io.start = _PCMCIAIO(skt->nr);
|
||||||
|
skt->res_io.end = _PCMCIAIO(skt->nr) + PCMCIAIOSp - 1;
|
||||||
|
skt->res_io.name = "io";
|
||||||
|
skt->res_io.flags = IORESOURCE_MEM | IORESOURCE_BUSY;
|
||||||
|
|
||||||
|
skt->res_mem.start = _PCMCIAMem(skt->nr);
|
||||||
|
skt->res_mem.end = _PCMCIAMem(skt->nr) + PCMCIAMemSp - 1;
|
||||||
|
skt->res_mem.name = "memory";
|
||||||
|
skt->res_mem.flags = IORESOURCE_MEM;
|
||||||
|
|
||||||
|
skt->res_attr.start = _PCMCIAAttr(skt->nr);
|
||||||
|
skt->res_attr.end = _PCMCIAAttr(skt->nr) + PCMCIAAttrSp - 1;
|
||||||
|
skt->res_attr.name = "attribute";
|
||||||
|
skt->res_attr.flags = IORESOURCE_MEM;
|
||||||
|
|
||||||
|
return soc_pcmcia_add_one(skt);
|
||||||
|
}
|
||||||
|
|
||||||
int __pxa2xx_drv_pcmcia_probe(struct device *dev)
|
int __pxa2xx_drv_pcmcia_probe(struct device *dev)
|
||||||
{
|
{
|
||||||
int i, ret;
|
int i, ret;
|
||||||
@ -240,6 +265,12 @@ int __pxa2xx_drv_pcmcia_probe(struct device *dev)
|
|||||||
|
|
||||||
ops = (struct pcmcia_low_level *)dev->platform_data;
|
ops = (struct pcmcia_low_level *)dev->platform_data;
|
||||||
|
|
||||||
|
/* Provide our PXA2xx specific timing routines. */
|
||||||
|
ops->set_timing = pxa2xx_pcmcia_set_timing;
|
||||||
|
#ifdef CONFIG_CPU_FREQ
|
||||||
|
ops->frequency_change = pxa2xx_pcmcia_frequency_change;
|
||||||
|
#endif
|
||||||
|
|
||||||
sinfo = kzalloc(SKT_DEV_INFO_SIZE(ops->nr), GFP_KERNEL);
|
sinfo = kzalloc(SKT_DEV_INFO_SIZE(ops->nr), GFP_KERNEL);
|
||||||
if (!sinfo)
|
if (!sinfo)
|
||||||
return -ENOMEM;
|
return -ENOMEM;
|
||||||
@ -250,40 +281,26 @@ int __pxa2xx_drv_pcmcia_probe(struct device *dev)
|
|||||||
for (i = 0; i < ops->nr; i++) {
|
for (i = 0; i < ops->nr; i++) {
|
||||||
skt = &sinfo->skt[i];
|
skt = &sinfo->skt[i];
|
||||||
|
|
||||||
skt->nr = ops->first + i;
|
skt->nr = ops->first + i;
|
||||||
skt->irq = NO_IRQ;
|
skt->irq = NO_IRQ;
|
||||||
|
skt->dev = dev;
|
||||||
|
skt->ops = ops;
|
||||||
|
skt->socket.owner = ops->owner;
|
||||||
|
skt->socket.dev.parent = dev;
|
||||||
|
|
||||||
skt->res_skt.start = _PCMCIA(skt->nr);
|
ret = pxa2xx_drv_pcmcia_add_one(skt);
|
||||||
skt->res_skt.end = _PCMCIA(skt->nr) + PCMCIASp - 1;
|
if (ret)
|
||||||
skt->res_skt.name = skt_names[skt->nr];
|
break;
|
||||||
skt->res_skt.flags = IORESOURCE_MEM;
|
|
||||||
|
|
||||||
skt->res_io.start = _PCMCIAIO(skt->nr);
|
|
||||||
skt->res_io.end = _PCMCIAIO(skt->nr) + PCMCIAIOSp - 1;
|
|
||||||
skt->res_io.name = "io";
|
|
||||||
skt->res_io.flags = IORESOURCE_MEM | IORESOURCE_BUSY;
|
|
||||||
|
|
||||||
skt->res_mem.start = _PCMCIAMem(skt->nr);
|
|
||||||
skt->res_mem.end = _PCMCIAMem(skt->nr) + PCMCIAMemSp - 1;
|
|
||||||
skt->res_mem.name = "memory";
|
|
||||||
skt->res_mem.flags = IORESOURCE_MEM;
|
|
||||||
|
|
||||||
skt->res_attr.start = _PCMCIAAttr(skt->nr);
|
|
||||||
skt->res_attr.end = _PCMCIAAttr(skt->nr) + PCMCIAAttrSp - 1;
|
|
||||||
skt->res_attr.name = "attribute";
|
|
||||||
skt->res_attr.flags = IORESOURCE_MEM;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Provide our PXA2xx specific timing routines. */
|
if (ret) {
|
||||||
ops->set_timing = pxa2xx_pcmcia_set_timing;
|
while (--i >= 0)
|
||||||
#ifdef CONFIG_CPU_FREQ
|
soc_pcmcia_remove_one(&sinfo->skt[i]);
|
||||||
ops->frequency_change = pxa2xx_pcmcia_frequency_change;
|
kfree(sinfo);
|
||||||
#endif
|
} else {
|
||||||
|
|
||||||
ret = soc_common_drv_pcmcia_probe(dev, ops, sinfo);
|
|
||||||
|
|
||||||
if (!ret)
|
|
||||||
pxa2xx_configure_sockets(dev);
|
pxa2xx_configure_sockets(dev);
|
||||||
|
dev_set_drvdata(dev, sinfo);
|
||||||
|
}
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
@ -171,6 +171,31 @@ static const char *skt_names[] = {
|
|||||||
#define SKT_DEV_INFO_SIZE(n) \
|
#define SKT_DEV_INFO_SIZE(n) \
|
||||||
(sizeof(struct skt_dev_info) + (n)*sizeof(struct soc_pcmcia_socket))
|
(sizeof(struct skt_dev_info) + (n)*sizeof(struct soc_pcmcia_socket))
|
||||||
|
|
||||||
|
static int sa11xx_drv_pcmcia_add_one(struct soc_pcmcia_socket *skt)
|
||||||
|
{
|
||||||
|
skt->res_skt.start = _PCMCIA(skt->nr);
|
||||||
|
skt->res_skt.end = _PCMCIA(skt->nr) + PCMCIASp - 1;
|
||||||
|
skt->res_skt.name = skt_names[skt->nr];
|
||||||
|
skt->res_skt.flags = IORESOURCE_MEM;
|
||||||
|
|
||||||
|
skt->res_io.start = _PCMCIAIO(skt->nr);
|
||||||
|
skt->res_io.end = _PCMCIAIO(skt->nr) + PCMCIAIOSp - 1;
|
||||||
|
skt->res_io.name = "io";
|
||||||
|
skt->res_io.flags = IORESOURCE_MEM | IORESOURCE_BUSY;
|
||||||
|
|
||||||
|
skt->res_mem.start = _PCMCIAMem(skt->nr);
|
||||||
|
skt->res_mem.end = _PCMCIAMem(skt->nr) + PCMCIAMemSp - 1;
|
||||||
|
skt->res_mem.name = "memory";
|
||||||
|
skt->res_mem.flags = IORESOURCE_MEM;
|
||||||
|
|
||||||
|
skt->res_attr.start = _PCMCIAAttr(skt->nr);
|
||||||
|
skt->res_attr.end = _PCMCIAAttr(skt->nr) + PCMCIAAttrSp - 1;
|
||||||
|
skt->res_attr.name = "attribute";
|
||||||
|
skt->res_attr.flags = IORESOURCE_MEM;
|
||||||
|
|
||||||
|
return soc_pcmcia_add_one(skt);
|
||||||
|
}
|
||||||
|
|
||||||
int sa11xx_drv_pcmcia_probe(struct device *dev, struct pcmcia_low_level *ops,
|
int sa11xx_drv_pcmcia_probe(struct device *dev, struct pcmcia_low_level *ops,
|
||||||
int first, int nr)
|
int first, int nr)
|
||||||
{
|
{
|
||||||
@ -178,40 +203,6 @@ int sa11xx_drv_pcmcia_probe(struct device *dev, struct pcmcia_low_level *ops,
|
|||||||
struct soc_pcmcia_socket *skt;
|
struct soc_pcmcia_socket *skt;
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
sinfo = kzalloc(SKT_DEV_INFO_SIZE(nr), GFP_KERNEL);
|
|
||||||
if (!sinfo)
|
|
||||||
return -ENOMEM;
|
|
||||||
|
|
||||||
sinfo->nskt = nr;
|
|
||||||
|
|
||||||
/* Initiliaze processor specific parameters */
|
|
||||||
for (i = 0; i < nr; i++) {
|
|
||||||
skt = &sinfo->skt[i];
|
|
||||||
|
|
||||||
skt->nr = first + i;
|
|
||||||
skt->irq = NO_IRQ;
|
|
||||||
|
|
||||||
skt->res_skt.start = _PCMCIA(skt->nr);
|
|
||||||
skt->res_skt.end = _PCMCIA(skt->nr) + PCMCIASp - 1;
|
|
||||||
skt->res_skt.name = skt_names[skt->nr];
|
|
||||||
skt->res_skt.flags = IORESOURCE_MEM;
|
|
||||||
|
|
||||||
skt->res_io.start = _PCMCIAIO(skt->nr);
|
|
||||||
skt->res_io.end = _PCMCIAIO(skt->nr) + PCMCIAIOSp - 1;
|
|
||||||
skt->res_io.name = "io";
|
|
||||||
skt->res_io.flags = IORESOURCE_MEM | IORESOURCE_BUSY;
|
|
||||||
|
|
||||||
skt->res_mem.start = _PCMCIAMem(skt->nr);
|
|
||||||
skt->res_mem.end = _PCMCIAMem(skt->nr) + PCMCIAMemSp - 1;
|
|
||||||
skt->res_mem.name = "memory";
|
|
||||||
skt->res_mem.flags = IORESOURCE_MEM;
|
|
||||||
|
|
||||||
skt->res_attr.start = _PCMCIAAttr(skt->nr);
|
|
||||||
skt->res_attr.end = _PCMCIAAttr(skt->nr) + PCMCIAAttrSp - 1;
|
|
||||||
skt->res_attr.name = "attribute";
|
|
||||||
skt->res_attr.flags = IORESOURCE_MEM;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* set default MECR calculation if the board specific
|
* set default MECR calculation if the board specific
|
||||||
* code did not specify one...
|
* code did not specify one...
|
||||||
@ -226,7 +217,37 @@ int sa11xx_drv_pcmcia_probe(struct device *dev, struct pcmcia_low_level *ops,
|
|||||||
ops->frequency_change = sa1100_pcmcia_frequency_change;
|
ops->frequency_change = sa1100_pcmcia_frequency_change;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
return soc_common_drv_pcmcia_probe(dev, ops, sinfo);
|
sinfo = kzalloc(SKT_DEV_INFO_SIZE(nr), GFP_KERNEL);
|
||||||
|
if (!sinfo)
|
||||||
|
return -ENOMEM;
|
||||||
|
|
||||||
|
sinfo->nskt = nr;
|
||||||
|
|
||||||
|
/* Initiliaze processor specific parameters */
|
||||||
|
for (i = 0; i < nr; i++) {
|
||||||
|
skt = &sinfo->skt[i];
|
||||||
|
|
||||||
|
skt->nr = first + i;
|
||||||
|
skt->irq = NO_IRQ;
|
||||||
|
skt->dev = dev;
|
||||||
|
skt->ops = ops;
|
||||||
|
skt->socket.owner = ops->owner;
|
||||||
|
skt->socket.dev.parent = dev;
|
||||||
|
|
||||||
|
ret = sa11xx_drv_pcmcia_add_one(skt);
|
||||||
|
if (ret)
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (ret) {
|
||||||
|
while (--i >= 0)
|
||||||
|
soc_pcmcia_remove_one(&sinfo->skt[i]);
|
||||||
|
kfree(sinfo);
|
||||||
|
} else {
|
||||||
|
dev_set_drvdata(dev, sinfo);
|
||||||
|
}
|
||||||
|
|
||||||
|
return ret;
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL(sa11xx_drv_pcmcia_probe);
|
EXPORT_SYMBOL(sa11xx_drv_pcmcia_probe);
|
||||||
|
|
||||||
|
@ -741,43 +741,6 @@ int soc_pcmcia_add_one(struct soc_pcmcia_socket *skt)
|
|||||||
}
|
}
|
||||||
EXPORT_SYMBOL(soc_pcmcia_add_one);
|
EXPORT_SYMBOL(soc_pcmcia_add_one);
|
||||||
|
|
||||||
int soc_common_drv_pcmcia_probe(struct device *dev, struct pcmcia_low_level *ops,
|
|
||||||
struct skt_dev_info *sinfo)
|
|
||||||
{
|
|
||||||
struct soc_pcmcia_socket *skt;
|
|
||||||
int ret, i;
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Initialise the per-socket structure.
|
|
||||||
*/
|
|
||||||
for (i = ret = 0; i < sinfo->nskt; i++) {
|
|
||||||
skt = &sinfo->skt[i];
|
|
||||||
|
|
||||||
skt->socket.owner = ops->owner;
|
|
||||||
skt->socket.dev.parent = dev;
|
|
||||||
|
|
||||||
skt->dev = dev;
|
|
||||||
skt->ops = ops;
|
|
||||||
|
|
||||||
ret = soc_pcmcia_add_one(skt);
|
|
||||||
if (ret)
|
|
||||||
break;
|
|
||||||
|
|
||||||
WARN_ON(skt->socket.sock != i);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (ret) {
|
|
||||||
while (--i >= 0)
|
|
||||||
soc_pcmcia_remove_one(&sinfo->skt[i]);
|
|
||||||
kfree(sinfo);
|
|
||||||
} else {
|
|
||||||
dev_set_drvdata(dev, sinfo);
|
|
||||||
}
|
|
||||||
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
EXPORT_SYMBOL(soc_common_drv_pcmcia_probe);
|
|
||||||
|
|
||||||
MODULE_AUTHOR("John Dorsey <john+@cs.cmu.edu>");
|
MODULE_AUTHOR("John Dorsey <john+@cs.cmu.edu>");
|
||||||
MODULE_DESCRIPTION("Linux PCMCIA Card Services: Common SoC support");
|
MODULE_DESCRIPTION("Linux PCMCIA Card Services: Common SoC support");
|
||||||
MODULE_LICENSE("Dual MPL/GPL");
|
MODULE_LICENSE("Dual MPL/GPL");
|
||||||
|
@ -138,8 +138,6 @@ extern void soc_common_pcmcia_get_timing(struct soc_pcmcia_socket *, struct soc_
|
|||||||
void soc_pcmcia_remove_one(struct soc_pcmcia_socket *skt);
|
void soc_pcmcia_remove_one(struct soc_pcmcia_socket *skt);
|
||||||
int soc_pcmcia_add_one(struct soc_pcmcia_socket *skt);
|
int soc_pcmcia_add_one(struct soc_pcmcia_socket *skt);
|
||||||
|
|
||||||
extern int soc_common_drv_pcmcia_probe(struct device *dev, struct pcmcia_low_level *ops, struct skt_dev_info *sinfo);
|
|
||||||
|
|
||||||
|
|
||||||
#ifdef CONFIG_PCMCIA_DEBUG
|
#ifdef CONFIG_PCMCIA_DEBUG
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user