Commit da4f0073 authored by Russell King - ARM Linux's avatar Russell King - ARM Linux Committed by Dominik Brodowski

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: default avatarRussell King <rmk+kernel@arm.linux.org.uk>
Signed-off-by: default avatarDominik Brodowski <linux@dominikbrodowski.net>
parent be85458e
...@@ -228,31 +228,8 @@ static const char *skt_names[] = { ...@@ -228,31 +228,8 @@ 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))
int __pxa2xx_drv_pcmcia_probe(struct device *dev) static int pxa2xx_drv_pcmcia_add_one(struct soc_pcmcia_socket *skt)
{ {
int i, ret;
struct pcmcia_low_level *ops;
struct skt_dev_info *sinfo;
struct soc_pcmcia_socket *skt;
if (!dev || !dev->platform_data)
return -ENODEV;
ops = (struct pcmcia_low_level *)dev->platform_data;
sinfo = kzalloc(SKT_DEV_INFO_SIZE(ops->nr), GFP_KERNEL);
if (!sinfo)
return -ENOMEM;
sinfo->nskt = ops->nr;
/* Initialize processor specific parameters */
for (i = 0; i < ops->nr; i++) {
skt = &sinfo->skt[i];
skt->nr = ops->first + i;
skt->irq = NO_IRQ;
skt->res_skt.start = _PCMCIA(skt->nr); skt->res_skt.start = _PCMCIA(skt->nr);
skt->res_skt.end = _PCMCIA(skt->nr) + PCMCIASp - 1; skt->res_skt.end = _PCMCIA(skt->nr) + PCMCIASp - 1;
skt->res_skt.name = skt_names[skt->nr]; skt->res_skt.name = skt_names[skt->nr];
...@@ -272,7 +249,21 @@ int __pxa2xx_drv_pcmcia_probe(struct device *dev) ...@@ -272,7 +249,21 @@ int __pxa2xx_drv_pcmcia_probe(struct device *dev)
skt->res_attr.end = _PCMCIAAttr(skt->nr) + PCMCIAAttrSp - 1; skt->res_attr.end = _PCMCIAAttr(skt->nr) + PCMCIAAttrSp - 1;
skt->res_attr.name = "attribute"; skt->res_attr.name = "attribute";
skt->res_attr.flags = IORESOURCE_MEM; skt->res_attr.flags = IORESOURCE_MEM;
}
return soc_pcmcia_add_one(skt);
}
int __pxa2xx_drv_pcmcia_probe(struct device *dev)
{
int i, ret;
struct pcmcia_low_level *ops;
struct skt_dev_info *sinfo;
struct soc_pcmcia_socket *skt;
if (!dev || !dev->platform_data)
return -ENODEV;
ops = (struct pcmcia_low_level *)dev->platform_data;
/* Provide our PXA2xx specific timing routines. */ /* Provide our PXA2xx specific timing routines. */
ops->set_timing = pxa2xx_pcmcia_set_timing; ops->set_timing = pxa2xx_pcmcia_set_timing;
...@@ -280,10 +271,36 @@ int __pxa2xx_drv_pcmcia_probe(struct device *dev) ...@@ -280,10 +271,36 @@ int __pxa2xx_drv_pcmcia_probe(struct device *dev)
ops->frequency_change = pxa2xx_pcmcia_frequency_change; ops->frequency_change = pxa2xx_pcmcia_frequency_change;
#endif #endif
ret = soc_common_drv_pcmcia_probe(dev, ops, sinfo); sinfo = kzalloc(SKT_DEV_INFO_SIZE(ops->nr), GFP_KERNEL);
if (!sinfo)
return -ENOMEM;
sinfo->nskt = ops->nr;
/* Initialize processor specific parameters */
for (i = 0; i < ops->nr; i++) {
skt = &sinfo->skt[i];
skt->nr = ops->first + i;
skt->irq = NO_IRQ;
skt->dev = dev;
skt->ops = ops;
skt->socket.owner = ops->owner;
skt->socket.dev.parent = dev;
ret = pxa2xx_drv_pcmcia_add_one(skt);
if (ret)
break;
}
if (!ret) if (ret) {
while (--i >= 0)
soc_pcmcia_remove_one(&sinfo->skt[i]);
kfree(sinfo);
} else {
pxa2xx_configure_sockets(dev); pxa2xx_configure_sockets(dev);
dev_set_drvdata(dev, sinfo);
}
return ret; return ret;
} }
......
...@@ -171,26 +171,8 @@ static const char *skt_names[] = { ...@@ -171,26 +171,8 @@ 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))
int sa11xx_drv_pcmcia_probe(struct device *dev, struct pcmcia_low_level *ops, static int sa11xx_drv_pcmcia_add_one(struct soc_pcmcia_socket *skt)
int first, int nr)
{ {
struct skt_dev_info *sinfo;
struct soc_pcmcia_socket *skt;
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.start = _PCMCIA(skt->nr);
skt->res_skt.end = _PCMCIA(skt->nr) + PCMCIASp - 1; skt->res_skt.end = _PCMCIA(skt->nr) + PCMCIASp - 1;
skt->res_skt.name = skt_names[skt->nr]; skt->res_skt.name = skt_names[skt->nr];
...@@ -210,7 +192,16 @@ int sa11xx_drv_pcmcia_probe(struct device *dev, struct pcmcia_low_level *ops, ...@@ -210,7 +192,16 @@ int sa11xx_drv_pcmcia_probe(struct device *dev, struct pcmcia_low_level *ops,
skt->res_attr.end = _PCMCIAAttr(skt->nr) + PCMCIAAttrSp - 1; skt->res_attr.end = _PCMCIAAttr(skt->nr) + PCMCIAAttrSp - 1;
skt->res_attr.name = "attribute"; skt->res_attr.name = "attribute";
skt->res_attr.flags = IORESOURCE_MEM; 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 first, int nr)
{
struct skt_dev_info *sinfo;
struct soc_pcmcia_socket *skt;
int i;
/* /*
* set default MECR calculation if the board specific * set default MECR calculation if the board specific
...@@ -226,7 +217,37 @@ int sa11xx_drv_pcmcia_probe(struct device *dev, struct pcmcia_low_level *ops, ...@@ -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) ...@@ -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_ ...@@ -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
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment