Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

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

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
Loading
Loading
Loading
Loading
+47 −30
Original line number Original line Diff line number Diff line
@@ -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,18 +249,58 @@ 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;
#ifdef CONFIG_CPU_FREQ
#ifdef CONFIG_CPU_FREQ
	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;


	if (!ret)
	/* 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) {
		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;
}
}
+56 −35
Original line number Original line Diff line number Diff line
@@ -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,8 +192,17 @@ 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
	 * 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);


+0 −37
Original line number Original line Diff line number Diff line
@@ -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");
+0 −2
Original line number Original line Diff line number Diff line
@@ -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