|
@@ -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);
|
|
|
|
|