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

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

PCMCIA: sa1111: wrap soc_pcmcia_socket to contain sa1111 specific data

parent da4f0073
Loading
Loading
Loading
Loading
+12 −7
Original line number Original line Diff line number Diff line
@@ -228,7 +228,7 @@ 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)
int pxa2xx_drv_pcmcia_add_one(struct soc_pcmcia_socket *skt)
{
{
	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;
@@ -253,9 +253,18 @@ static int pxa2xx_drv_pcmcia_add_one(struct soc_pcmcia_socket *skt)
	return soc_pcmcia_add_one(skt);
	return soc_pcmcia_add_one(skt);
}
}


void pxa2xx_drv_pcmcia_ops(struct pcmcia_low_level *ops)
{
	/* 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
}

int __pxa2xx_drv_pcmcia_probe(struct device *dev)
int __pxa2xx_drv_pcmcia_probe(struct device *dev)
{
{
	int i, ret;
	int i, ret = 0;
	struct pcmcia_low_level *ops;
	struct pcmcia_low_level *ops;
	struct skt_dev_info *sinfo;
	struct skt_dev_info *sinfo;
	struct soc_pcmcia_socket *skt;
	struct soc_pcmcia_socket *skt;
@@ -265,11 +274,7 @@ 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. */
	pxa2xx_drv_pcmcia_ops(ops);
	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)
+3 −0
Original line number Original line Diff line number Diff line
/* temporary measure */
/* temporary measure */
extern int __pxa2xx_drv_pcmcia_probe(struct device *);
extern int __pxa2xx_drv_pcmcia_probe(struct device *);


int pxa2xx_drv_pcmcia_add_one(struct soc_pcmcia_socket *skt);
void pxa2xx_drv_pcmcia_ops(struct pcmcia_low_level *ops);
+6 −4
Original line number Original line Diff line number Diff line
@@ -32,6 +32,7 @@ static int
lubbock_pcmcia_configure_socket(struct soc_pcmcia_socket *skt,
lubbock_pcmcia_configure_socket(struct soc_pcmcia_socket *skt,
				const socket_state_t *state)
				const socket_state_t *state)
{
{
	struct sa1111_pcmcia_socket *s = to_skt(skt);
	unsigned int pa_dwr_mask, pa_dwr_set, misc_mask, misc_set;
	unsigned int pa_dwr_mask, pa_dwr_set, misc_mask, misc_set;
	int ret = 0;
	int ret = 0;


@@ -149,7 +150,7 @@ lubbock_pcmcia_configure_socket(struct soc_pcmcia_socket *skt,


	if (ret == 0) {
	if (ret == 0) {
		lubbock_set_misc_wr(misc_mask, misc_set);
		lubbock_set_misc_wr(misc_mask, misc_set);
		sa1111_set_io(SA1111_DEV(skt->dev), pa_dwr_mask, pa_dwr_set);
		sa1111_set_io(s->dev, pa_dwr_mask, pa_dwr_set);
	}
	}


#if 1
#if 1
@@ -175,7 +176,7 @@ lubbock_pcmcia_configure_socket(struct soc_pcmcia_socket *skt,
			 * Switch to 5V,  Configure socket with 5V voltage
			 * Switch to 5V,  Configure socket with 5V voltage
			 */
			 */
			lubbock_set_misc_wr(misc_mask, 0);
			lubbock_set_misc_wr(misc_mask, 0);
			sa1111_set_io(SA1111_DEV(skt->dev), pa_dwr_mask, 0);
			sa1111_set_io(s->dev, pa_dwr_mask, 0);


			/*
			/*
			 * It takes about 100ms to turn off Vcc.
			 * It takes about 100ms to turn off Vcc.
@@ -228,8 +229,9 @@ int pcmcia_lubbock_init(struct sa1111_dev *sadev)
		/* Set CF Socket 1 power to standby mode. */
		/* Set CF Socket 1 power to standby mode. */
		lubbock_set_misc_wr((1 << 15) | (1 << 14), 0);
		lubbock_set_misc_wr((1 << 15) | (1 << 14), 0);


		sadev->dev.platform_data = &lubbock_pcmcia_ops;
		pxa2xx_drv_pcmcia_ops(&lubbock_pcmcia_ops);
		ret = __pxa2xx_drv_pcmcia_probe(&sadev->dev);
		ret = sa1111_pcmcia_add(sadev, &lubbock_pcmcia_ops,
				pxa2xx_drv_pcmcia_add_one);
	}
	}


	return ret;
	return ret;
+6 −1
Original line number Original line Diff line number Diff line
@@ -134,6 +134,9 @@ static struct pcmcia_low_level badge4_pcmcia_ops = {


	.socket_init		= sa1111_pcmcia_socket_init,
	.socket_init		= sa1111_pcmcia_socket_init,
	.socket_suspend		= sa1111_pcmcia_socket_suspend,
	.socket_suspend		= sa1111_pcmcia_socket_suspend,

	.first			= 0,
	.nr			= 2,
};
};


int pcmcia_badge4_init(struct device *dev)
int pcmcia_badge4_init(struct device *dev)
@@ -146,7 +149,9 @@ int pcmcia_badge4_init(struct device *dev)
		       __func__,
		       __func__,
		       badge4_pcmvcc, badge4_pcmvpp, badge4_cfvcc);
		       badge4_pcmvcc, badge4_pcmvpp, badge4_cfvcc);


		ret = sa11xx_drv_pcmcia_probe(dev, &badge4_pcmcia_ops, 0, 2);
		sa11xx_drv_pcmcia_ops(&badge4_pcmcia_ops);
		ret = sa1111_pcmcia_add(dev, &badge4_pcmcia_ops,
				sa11xx_drv_pcmcia_add_one);
	}
	}


	return ret;
	return ret;
+14 −6
Original line number Original line Diff line number Diff line
@@ -24,6 +24,7 @@


static int jornada720_pcmcia_hw_init(struct soc_pcmcia_socket *skt)
static int jornada720_pcmcia_hw_init(struct soc_pcmcia_socket *skt)
{
{
	struct sa1111_pcmcia_socket *s = to_skt(skt);
	unsigned int pin = GPIO_A0 | GPIO_A1 | GPIO_A2 | GPIO_A3;
	unsigned int pin = GPIO_A0 | GPIO_A1 | GPIO_A2 | GPIO_A3;


	/*
	/*
@@ -31,9 +32,9 @@ static int jornada720_pcmcia_hw_init(struct soc_pcmcia_socket *skt)
	*/
	*/
	GRER |= 0x00000002;
	GRER |= 0x00000002;
	/* Set GPIO_A<3:1> to be outputs for PCMCIA/CF power controller: */
	/* Set GPIO_A<3:1> to be outputs for PCMCIA/CF power controller: */
	sa1111_set_io_dir(SA1111_DEV(skt->dev), pin, 0, 0);
	sa1111_set_io_dir(s->dev, pin, 0, 0);
	sa1111_set_io(SA1111_DEV(skt->dev), pin, 0);
	sa1111_set_io(s->dev, pin, 0);
	sa1111_set_sleep_io(SA1111_DEV(skt->dev), pin, 0);
	sa1111_set_sleep_io(s->dev, pin, 0);


	return sa1111_pcmcia_hw_init(skt);
	return sa1111_pcmcia_hw_init(skt);
}
}
@@ -41,6 +42,7 @@ static int jornada720_pcmcia_hw_init(struct soc_pcmcia_socket *skt)
static int
static int
jornada720_pcmcia_configure_socket(struct soc_pcmcia_socket *skt, const socket_state_t *state)
jornada720_pcmcia_configure_socket(struct soc_pcmcia_socket *skt, const socket_state_t *state)
{
{
	struct sa1111_pcmcia_socket *s = to_skt(skt);
	unsigned int pa_dwr_mask, pa_dwr_set;
	unsigned int pa_dwr_mask, pa_dwr_set;
	int ret;
	int ret;


@@ -97,7 +99,7 @@ jornada720_pcmcia_configure_socket(struct soc_pcmcia_socket *skt, const socket_s
		unsigned long flags;
		unsigned long flags;


		local_irq_save(flags);
		local_irq_save(flags);
		sa1111_set_io(SA1111_DEV(skt->dev), pa_dwr_mask, pa_dwr_set);
		sa1111_set_io(s->dev, pa_dwr_mask, pa_dwr_set);
		local_irq_restore(flags);
		local_irq_restore(flags);
	}
	}


@@ -113,14 +115,20 @@ static struct pcmcia_low_level jornada720_pcmcia_ops = {


	.socket_init		= sa1111_pcmcia_socket_init,
	.socket_init		= sa1111_pcmcia_socket_init,
	.socket_suspend		= sa1111_pcmcia_socket_suspend,
	.socket_suspend		= sa1111_pcmcia_socket_suspend,

	.first			= 0,
	.nr			= 2,
};
};


int __devinit pcmcia_jornada720_init(struct device *dev)
int __devinit pcmcia_jornada720_init(struct device *dev)
{
{
	int ret = -ENODEV;
	int ret = -ENODEV;


	if (machine_is_jornada720())
	if (machine_is_jornada720()) {
		ret = sa11xx_drv_pcmcia_probe(dev, &jornada720_pcmcia_ops, 0, 2);
		sa11xx_drv_pcmcia_ops(&jornada720_pcmcia_ops);
		ret = sa1111_pcmcia_add(dev, &jornada720_pcmcia_ops,
				sa11xx_drv_pcmcia_add_one);
	}


	return ret;
	return ret;
}
}
Loading