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

Commit 3f8df892 authored by Russell King's avatar Russell King
Browse files

pcmcia: sa1111: fix propagation of lowlevel board init return code



When testing Lubbock, it was noticed that the sa1111 pcmcia driver bound
but was not functional due to no sockets being registered.  This is
because the return code from the lowlevel board initialisation was not
being propagated out of the probe function.  Fix this.

Tested-by: default avatarRobert Jarzmik <robert.jarzmik@free.fr>
Signed-off-by: default avatarRussell King <rmk+kernel@armlinux.org.uk>
parent a466ebd2
Loading
Loading
Loading
Loading
+8 −14
Original line number Diff line number Diff line
@@ -134,22 +134,16 @@ static struct pcmcia_low_level badge4_pcmcia_ops = {

int pcmcia_badge4_init(struct sa1111_dev *dev)
{
	int ret = -ENODEV;

	if (machine_is_badge4()) {
	printk(KERN_INFO
	       "%s: badge4_pcmvcc=%d, badge4_pcmvpp=%d, badge4_cfvcc=%d\n",
	       __func__,
	       badge4_pcmvcc, badge4_pcmvpp, badge4_cfvcc);

	sa11xx_drv_pcmcia_ops(&badge4_pcmcia_ops);
		ret = sa1111_pcmcia_add(dev, &badge4_pcmcia_ops,
	return sa1111_pcmcia_add(dev, &badge4_pcmcia_ops,
				 sa11xx_drv_pcmcia_add_one);
}

	return ret;
}

static int __init pcmv_setup(char *s)
{
	int v[4];
+17 −5
Original line number Diff line number Diff line
@@ -18,6 +18,7 @@

#include <mach/hardware.h>
#include <asm/hardware/sa1111.h>
#include <asm/mach-types.h>
#include <asm/irq.h>

#include "sa1111_generic.h"
@@ -203,19 +204,30 @@ static int pcmcia_probe(struct sa1111_dev *dev)
	sa1111_writel(PCSSR_S0_SLEEP | PCSSR_S1_SLEEP, base + PCSSR);
	sa1111_writel(PCCR_S0_FLT | PCCR_S1_FLT, base + PCCR);

	ret = -ENODEV;
#ifdef CONFIG_SA1100_BADGE4
	pcmcia_badge4_init(dev);
	if (machine_is_badge4())
		ret = pcmcia_badge4_init(dev);
#endif
#ifdef CONFIG_SA1100_JORNADA720
	pcmcia_jornada720_init(dev);
	if (machine_is_jornada720())
		ret = pcmcia_jornada720_init(dev);
#endif
#ifdef CONFIG_ARCH_LUBBOCK
	pcmcia_lubbock_init(dev);
	if (machine_is_lubbock())
		ret = pcmcia_lubbock_init(dev);
#endif
#ifdef CONFIG_ASSABET_NEPONSET
	pcmcia_neponset_init(dev);
	if (machine_is_assabet())
		ret = pcmcia_neponset_init(dev);
#endif
	return 0;

	if (ret) {
		release_mem_region(dev->res.start, 512);
		sa1111_disable_device(dev);
	}

	return ret;
}

static int pcmcia_remove(struct sa1111_dev *dev)
+10 −15
Original line number Diff line number Diff line
@@ -94,11 +94,9 @@ static struct pcmcia_low_level jornada720_pcmcia_ops = {

int pcmcia_jornada720_init(struct sa1111_dev *sadev)
{
	int ret = -ENODEV;

	if (machine_is_jornada720()) {
	unsigned int pin = GPIO_A0 | GPIO_A1 | GPIO_A2 | GPIO_A3;

	/* Fixme: why messing around with SA11x0's GPIO1? */
	GRER |= 0x00000002;

	/* Set GPIO_A<3:1> to be outputs for PCMCIA/CF power controller: */
@@ -107,9 +105,6 @@ int pcmcia_jornada720_init(struct sa1111_dev *sadev)
	sa1111_set_sleep_io(sadev, pin, 0);

	sa11xx_drv_pcmcia_ops(&jornada720_pcmcia_ops);
		ret = sa1111_pcmcia_add(sadev, &jornada720_pcmcia_ops,
	return sa1111_pcmcia_add(sadev, &jornada720_pcmcia_ops,
				 sa11xx_drv_pcmcia_add_one);
}

	return ret;
}
+13 −19
Original line number Diff line number Diff line
@@ -210,9 +210,6 @@ static struct pcmcia_low_level lubbock_pcmcia_ops = {

int pcmcia_lubbock_init(struct sa1111_dev *sadev)
{
	int ret = -ENODEV;

	if (machine_is_lubbock()) {
	/*
	 * Set GPIO_A<3:0> to be outputs for the MAX1600,
	 * and switch to standby mode.
@@ -226,11 +223,8 @@ int pcmcia_lubbock_init(struct sa1111_dev *sadev)

	pxa2xx_drv_pcmcia_ops(&lubbock_pcmcia_ops);
	pxa2xx_configure_sockets(&sadev->dev);
		ret = sa1111_pcmcia_add(sadev, &lubbock_pcmcia_ops,
	return sa1111_pcmcia_add(sadev, &lubbock_pcmcia_ops,
				 pxa2xx_drv_pcmcia_add_one);
}

	return ret;
}

MODULE_LICENSE("GPL");
+10 −16
Original line number Diff line number Diff line
@@ -110,9 +110,6 @@ static struct pcmcia_low_level neponset_pcmcia_ops = {

int pcmcia_neponset_init(struct sa1111_dev *sadev)
{
	int ret = -ENODEV;

	if (machine_is_assabet()) {
	/*
	 * Set GPIO_A<3:0> to be outputs for the MAX1600,
	 * and switch to standby mode.
@@ -121,9 +118,6 @@ int pcmcia_neponset_init(struct sa1111_dev *sadev)
	sa1111_set_io(sadev, GPIO_A0|GPIO_A1|GPIO_A2|GPIO_A3, 0);
	sa1111_set_sleep_io(sadev, GPIO_A0|GPIO_A1|GPIO_A2|GPIO_A3, 0);
	sa11xx_drv_pcmcia_ops(&neponset_pcmcia_ops);
		ret = sa1111_pcmcia_add(sadev, &neponset_pcmcia_ops,
	return sa1111_pcmcia_add(sadev, &neponset_pcmcia_ops,
				 sa11xx_drv_pcmcia_add_one);
}

	return ret;
}