Re: [RFC PATCH 00/10] PCMCIA soc_common re-factorization

2009-10-27 Thread Russell King - ARM Linux
On Tue, Oct 27, 2009 at 11:18:49PM +, Russell King - ARM Linux wrote:
> This is a re-post of the previous patch series, but rebased forward
> earlier on this month.  Review comments would be nice to have, or
> alternatively acks.
> 
> Lastly, is there an active PCMCIA maintainer who should take these?

Oh, and sorry for the stupid dates; next time I'll remember to delete
the Date: header from the git format-patch output.

___
Linux PCMCIA reimplementation list
http://lists.infradead.org/mailman/listinfo/linux-pcmcia


Re: [RFC PATCH 00/10] PCMCIA soc_common re-factorization

2009-10-27 Thread Russell King - ARM Linux
This is a re-post of the previous patch series, but rebased forward
earlier on this month.  Review comments would be nice to have, or
alternatively acks.

Lastly, is there an active PCMCIA maintainer who should take these?

___
Linux PCMCIA reimplementation list
http://lists.infradead.org/mailman/listinfo/linux-pcmcia


[RFC PATCH 10/10] PCMCIA: stop duplicating pci_irq in soc_pcmcia_socket

2009-10-27 Thread Russell King - ARM Linux
skt->irq is a mere duplication of pcmcia_socket's pci_irq member.
Get rid of it.

Signed-off-by: Russell King 
---
 drivers/pcmcia/pxa2xx_base.c  |2 +-
 drivers/pcmcia/pxa2xx_cm_x255.c   |2 +-
 drivers/pcmcia/pxa2xx_cm_x270.c   |2 +-
 drivers/pcmcia/pxa2xx_e740.c  |2 +-
 drivers/pcmcia/pxa2xx_mainstone.c |2 +-
 drivers/pcmcia/pxa2xx_palmld.c|2 +-
 drivers/pcmcia/pxa2xx_palmtx.c|2 +-
 drivers/pcmcia/pxa2xx_sharpsl.c   |2 +-
 drivers/pcmcia/pxa2xx_trizeps4.c  |4 ++--
 drivers/pcmcia/pxa2xx_viper.c |2 +-
 drivers/pcmcia/sa1100_assabet.c   |2 +-
 drivers/pcmcia/sa1100_cerf.c  |2 +-
 drivers/pcmcia/sa1100_h3600.c |4 ++--
 drivers/pcmcia/sa1100_shannon.c   |2 +-
 drivers/pcmcia/sa1100_simpad.c|2 +-
 drivers/pcmcia/sa_generic.c   |2 +-
 drivers/pcmcia/sa11xx_base.c  |2 +-
 drivers/pcmcia/soc_common.c   |8 
 drivers/pcmcia/soc_common.h   |1 -
 19 files changed, 23 insertions(+), 24 deletions(-)

diff --git a/drivers/pcmcia/pxa2xx_base.c b/drivers/pcmcia/pxa2xx_base.c
index 7f61b62..84dde77 100644
--- a/drivers/pcmcia/pxa2xx_base.c
+++ b/drivers/pcmcia/pxa2xx_base.c
@@ -287,10 +287,10 @@ int __pxa2xx_drv_pcmcia_probe(struct device *dev)
skt = &sinfo->skt[i];
 
skt->nr = ops->first + i;
-   skt->irq = NO_IRQ;
skt->ops = ops;
skt->socket.owner = ops->owner;
skt->socket.dev.parent = dev;
+   skt->socket.pci_irq = NO_IRQ;
 
ret = pxa2xx_drv_pcmcia_add_one(skt);
if (ret)
diff --git a/drivers/pcmcia/pxa2xx_cm_x255.c b/drivers/pcmcia/pxa2xx_cm_x255.c
index 5143a76..05913d0 100644
--- a/drivers/pcmcia/pxa2xx_cm_x255.c
+++ b/drivers/pcmcia/pxa2xx_cm_x255.c
@@ -44,7 +44,7 @@ static int cmx255_pcmcia_hw_init(struct soc_pcmcia_socket 
*skt)
return ret;
gpio_direction_output(GPIO_PCMCIA_RESET, 0);
 
-   skt->irq = skt->nr == 0 ? PCMCIA_S0_RDYINT : PCMCIA_S1_RDYINT;
+   skt->socket.pci_irq = skt->nr == 0 ? PCMCIA_S0_RDYINT : 
PCMCIA_S1_RDYINT;
ret = soc_pcmcia_request_irqs(skt, irqs, ARRAY_SIZE(irqs));
if (!ret)
gpio_free(GPIO_PCMCIA_RESET);
diff --git a/drivers/pcmcia/pxa2xx_cm_x270.c b/drivers/pcmcia/pxa2xx_cm_x270.c
index a7b943d..5662646 100644
--- a/drivers/pcmcia/pxa2xx_cm_x270.c
+++ b/drivers/pcmcia/pxa2xx_cm_x270.c
@@ -38,7 +38,7 @@ static int cmx270_pcmcia_hw_init(struct soc_pcmcia_socket 
*skt)
return ret;
gpio_direction_output(GPIO_PCMCIA_RESET, 0);
 
-   skt->irq = PCMCIA_S0_RDYINT;
+   skt->socket.pci_irq = PCMCIA_S0_RDYINT;
ret = soc_pcmcia_request_irqs(skt, irqs, ARRAY_SIZE(irqs));
if (!ret)
gpio_free(GPIO_PCMCIA_RESET);
diff --git a/drivers/pcmcia/pxa2xx_e740.c b/drivers/pcmcia/pxa2xx_e740.c
index d09c0dc..8bfbd4d 100644
--- a/drivers/pcmcia/pxa2xx_e740.c
+++ b/drivers/pcmcia/pxa2xx_e740.c
@@ -38,7 +38,7 @@ static struct pcmcia_irqs cd_irqs[] = {
 
 static int e740_pcmcia_hw_init(struct soc_pcmcia_socket *skt)
 {
-   skt->irq = skt->nr == 0 ? IRQ_GPIO(GPIO_E740_PCMCIA_RDY0) :
+   skt->socket.pci_irq = skt->nr == 0 ? IRQ_GPIO(GPIO_E740_PCMCIA_RDY0) :
IRQ_GPIO(GPIO_E740_PCMCIA_RDY1);
 
return soc_pcmcia_request_irqs(skt, &cd_irqs[skt->nr], 1);
diff --git a/drivers/pcmcia/pxa2xx_mainstone.c 
b/drivers/pcmcia/pxa2xx_mainstone.c
index 1138551..92016fe 100644
--- a/drivers/pcmcia/pxa2xx_mainstone.c
+++ b/drivers/pcmcia/pxa2xx_mainstone.c
@@ -44,7 +44,7 @@ static int mst_pcmcia_hw_init(struct soc_pcmcia_socket *skt)
 * before we enable them as outputs.
 */
 
-   skt->irq = (skt->nr == 0) ? MAINSTONE_S0_IRQ : MAINSTONE_S1_IRQ;
+   skt->socket.pci_irq = (skt->nr == 0) ? MAINSTONE_S0_IRQ : 
MAINSTONE_S1_IRQ;
return soc_pcmcia_request_irqs(skt, irqs, ARRAY_SIZE(irqs));
 }
 
diff --git a/drivers/pcmcia/pxa2xx_palmld.c b/drivers/pcmcia/pxa2xx_palmld.c
index 5ba9b36..6fb6f7f 100644
--- a/drivers/pcmcia/pxa2xx_palmld.c
+++ b/drivers/pcmcia/pxa2xx_palmld.c
@@ -45,7 +45,7 @@ static int palmld_pcmcia_hw_init(struct soc_pcmcia_socket 
*skt)
if (ret)
goto err4;
 
-   skt->irq = IRQ_GPIO(GPIO_NR_PALMLD_PCMCIA_READY);
+   skt->socket.pci_irq = IRQ_GPIO(GPIO_NR_PALMLD_PCMCIA_READY);
return 0;
 
 err4:
diff --git a/drivers/pcmcia/pxa2xx_palmtx.c b/drivers/pcmcia/pxa2xx_palmtx.c
index e07b5c5..b07b247 100644
--- a/drivers/pcmcia/pxa2xx_palmtx.c
+++ b/drivers/pcmcia/pxa2xx_palmtx.c
@@ -53,7 +53,7 @@ static int palmtx_pcmcia_hw_init(struct soc_pcmcia_socket 
*skt)
if (ret)
goto err5;
 
-   skt->irq = gpio_to_irq(GPIO_NR_PALMTX_PCMCIA_READY);
+   skt->socket.pci_irq = gpio_to_irq(GPIO_NR_PALMTX_PCMCIA_READY);
return 0;
 
 err5:
diff --git a/drivers/pcmcia/pxa2xx_sharpsl.c b/drivers/pcmcia/pxa2xx

[RFC PATCH 09/10] PCMCIA: ss: allow PCI IRQs > 255

2009-10-27 Thread Russell King - ARM Linux
Signed-off-by: Russell King 
---
 include/pcmcia/ss.h |2 +-
 1 files changed, 1 insertions(+), 1 deletions(-)

diff --git a/include/pcmcia/ss.h b/include/pcmcia/ss.h
index d696a69..753da9b 100644
--- a/include/pcmcia/ss.h
+++ b/include/pcmcia/ss.h
@@ -172,7 +172,7 @@ struct pcmcia_socket {
u_int   irq_mask;
u_int   map_size;
u_int   io_offset;
-   u_char  pci_irq;
+   u_int   pci_irq;
struct pci_dev *cb_dev;
 
 
-- 
1.6.2.5


___
Linux PCMCIA reimplementation list
http://lists.infradead.org/mailman/listinfo/linux-pcmcia


[RFC PATCH 08/10] PCMCIA: soc_common: remove 'dev' member from soc_pcmcia_socket

2009-10-27 Thread Russell King - ARM Linux
The 'dev' member is now only ever written, so we can safely remove it.

Signed-off-by: Russell King 
---
 drivers/pcmcia/pxa2xx_base.c |1 -
 drivers/pcmcia/sa11xx_base.c |1 -
 drivers/pcmcia/soc_common.h  |1 -
 3 files changed, 0 insertions(+), 3 deletions(-)

diff --git a/drivers/pcmcia/pxa2xx_base.c b/drivers/pcmcia/pxa2xx_base.c
index c9c104b..7f61b62 100644
--- a/drivers/pcmcia/pxa2xx_base.c
+++ b/drivers/pcmcia/pxa2xx_base.c
@@ -288,7 +288,6 @@ int __pxa2xx_drv_pcmcia_probe(struct device *dev)
 
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;
diff --git a/drivers/pcmcia/sa11xx_base.c b/drivers/pcmcia/sa11xx_base.c
index 4db8149..ac99872 100644
--- a/drivers/pcmcia/sa11xx_base.c
+++ b/drivers/pcmcia/sa11xx_base.c
@@ -236,7 +236,6 @@ int sa11xx_drv_pcmcia_probe(struct device *dev, struct 
pcmcia_low_level *ops,
 
skt->nr = first + i;
skt->irq = NO_IRQ;
-   skt->dev = dev;
skt->ops = ops;
skt->socket.owner = ops->owner;
skt->socket.dev.parent = dev;
diff --git a/drivers/pcmcia/soc_common.h b/drivers/pcmcia/soc_common.h
index f7533dc..4fb06f7 100644
--- a/drivers/pcmcia/soc_common.h
+++ b/drivers/pcmcia/soc_common.h
@@ -30,7 +30,6 @@ struct soc_pcmcia_socket {
/*
 * Info from low level handler
 */
-   struct device   *dev;
unsigned intnr;
unsigned intirq;
 
-- 
1.6.2.5


___
Linux PCMCIA reimplementation list
http://lists.infradead.org/mailman/listinfo/linux-pcmcia


[RFC PATCH 07/10] PCMCIA: soc_common: constify soc_pcmcia_socket ops member

2009-10-27 Thread Russell King - ARM Linux
No one should modify the ops structure supplied to soc_pcmcia_socket
so make it const.

Signed-off-by: Russell King 
---
 drivers/pcmcia/soc_common.h |2 +-
 1 files changed, 1 insertions(+), 1 deletions(-)

diff --git a/drivers/pcmcia/soc_common.h b/drivers/pcmcia/soc_common.h
index 8a755c1..f7533dc 100644
--- a/drivers/pcmcia/soc_common.h
+++ b/drivers/pcmcia/soc_common.h
@@ -37,7 +37,7 @@ struct soc_pcmcia_socket {
/*
 * Core PCMCIA state
 */
-   struct pcmcia_low_level *ops;
+   const struct pcmcia_low_level *ops;
 
unsigned intstatus;
socket_state_t  cs_state;
-- 
1.6.2.5


___
Linux PCMCIA reimplementation list
http://lists.infradead.org/mailman/listinfo/linux-pcmcia


[RFC PATCH 06/10] PCMCIA: sa1111: remove duplicated initializers

2009-10-27 Thread Russell King - ARM Linux
Signed-off-by: Russell King 
---
 drivers/pcmcia/pxa2xx_lubbock.c|4 
 drivers/pcmcia/sa1100_badge4.c |6 --
 drivers/pcmcia/sa1100_jornada720.c |   32 +---
 drivers/pcmcia/sa1100_neponset.c   |4 
 drivers/pcmcia/sa_generic.c|   11 ---
 drivers/pcmcia/sa_generic.h|3 ---
 6 files changed, 17 insertions(+), 43 deletions(-)

diff --git a/drivers/pcmcia/pxa2xx_lubbock.c b/drivers/pcmcia/pxa2xx_lubbock.c
index 35d5280..b9f8c8f 100644
--- a/drivers/pcmcia/pxa2xx_lubbock.c
+++ b/drivers/pcmcia/pxa2xx_lubbock.c
@@ -201,12 +201,8 @@ lubbock_pcmcia_configure_socket(struct soc_pcmcia_socket 
*skt,
 
 static struct pcmcia_low_level lubbock_pcmcia_ops = {
.owner  = THIS_MODULE,
-   .hw_init= sa_pcmcia_hw_init,
-   .hw_shutdown= sa_pcmcia_hw_shutdown,
-   .socket_state   = sa_pcmcia_socket_state,
.configure_socket   = lubbock_pcmcia_configure_socket,
.socket_init= sa_pcmcia_socket_init,
-   .socket_suspend = sa_pcmcia_socket_suspend,
.first  = 0,
.nr = 2,
 };
diff --git a/drivers/pcmcia/sa1100_badge4.c b/drivers/pcmcia/sa1100_badge4.c
index 6399314..1ce53f4 100644
--- a/drivers/pcmcia/sa1100_badge4.c
+++ b/drivers/pcmcia/sa1100_badge4.c
@@ -127,14 +127,8 @@ badge4_pcmcia_configure_socket(struct soc_pcmcia_socket 
*skt, const socket_state
 
 static struct pcmcia_low_level badge4_pcmcia_ops = {
.owner  = THIS_MODULE,
-   .hw_init= sa_pcmcia_hw_init,
-   .hw_shutdown= sa_pcmcia_hw_shutdown,
-   .socket_state   = sa_pcmcia_socket_state,
.configure_socket   = badge4_pcmcia_configure_socket,
-
.socket_init= sa_pcmcia_socket_init,
-   .socket_suspend = sa_pcmcia_socket_suspend,
-
.first  = 0,
.nr = 2,
 };
diff --git a/drivers/pcmcia/sa1100_jornada720.c 
b/drivers/pcmcia/sa1100_jornada720.c
index 4a32f4f..6bcabee 100644
--- a/drivers/pcmcia/sa1100_jornada720.c
+++ b/drivers/pcmcia/sa1100_jornada720.c
@@ -22,23 +22,6 @@
 #define SOCKET1_POWER  (GPIO_GPIO1 | GPIO_GPIO3)
 #define SOCKET1_3V GPIO_GPIO3
 
-static int jornada720_pcmcia_hw_init(struct soc_pcmcia_socket *skt)
-{
-   struct sa_pcmcia_socket *s = to_skt(skt);
-   unsigned int pin = GPIO_A0 | GPIO_A1 | GPIO_A2 | GPIO_A3;
-
-   /*
-   * What is all this crap for?
-   */
-   GRER |= 0x0002;
-   /* Set GPIO_A<3:1> to be outputs for PCMCIA/CF power controller: */
-   sa_set_io_dir(s->dev, pin, 0, 0);
-   sa_set_io(s->dev, pin, 0);
-   sa_set_sleep_io(s->dev, pin, 0);
-
-   return sa_pcmcia_hw_init(skt);
-}
-
 static int
 jornada720_pcmcia_configure_socket(struct soc_pcmcia_socket *skt, const 
socket_state_t *state)
 {
@@ -108,14 +91,8 @@ jornada720_pcmcia_configure_socket(struct soc_pcmcia_socket 
*skt, const socket_s
 
 static struct pcmcia_low_level jornada720_pcmcia_ops = {
.owner  = THIS_MODULE,
-   .hw_init= jornada720_pcmcia_hw_init,
-   .hw_shutdown= sa_pcmcia_hw_shutdown,
-   .socket_state   = sa_pcmcia_socket_state,
.configure_socket   = jornada720_pcmcia_configure_socket,
-
.socket_init= sa_pcmcia_socket_init,
-   .socket_suspend = sa_pcmcia_socket_suspend,
-
.first  = 0,
.nr = 2,
 };
@@ -125,6 +102,15 @@ int __devinit pcmcia_jornada720_init(struct device *dev)
int ret = -ENODEV;
 
if (machine_is_jornada720()) {
+   unsigned int pin = GPIO_A0 | GPIO_A1 | GPIO_A2 | GPIO_A3;
+
+   GRER |= 0x0002;
+
+   /* Set GPIO_A<3:1> to be outputs for PCMCIA/CF power 
controller: */
+   sa_set_io_dir(dev, pin, 0, 0);
+   sa_set_io(dev, pin, 0);
+   sa_set_sleep_io(dev, pin, 0);
+
sa11xx_drv_pcmcia_ops(&jornada720_pcmcia_ops);
ret = sa_pcmcia_add(dev, &jornada720_pcmcia_ops,
sa11xx_drv_pcmcia_add_one);
diff --git a/drivers/pcmcia/sa1100_neponset.c b/drivers/pcmcia/sa1100_neponset.c
index e39c65a..c95639b 100644
--- a/drivers/pcmcia/sa1100_neponset.c
+++ b/drivers/pcmcia/sa1100_neponset.c
@@ -116,12 +116,8 @@ static void neponset_pcmcia_socket_init(struct 
soc_pcmcia_socket *skt)
 
 static struct pcmcia_low_level neponset_pcmcia_ops = {
.owner  = THIS_MODULE,
-   .hw_init= sa_pcmcia_hw_init,
-   .hw_shutdown= sa_pcmcia_hw_shutdown,
-   .socket_state   = sa_pcmcia_socket_state,
.configure_socket   = neponset_pcmcia_c

[RFC PATCH 05/10] PCMCIA: sa1111: wrap soc_pcmcia_socket to contain sa1111 specific data

2009-10-27 Thread Russell King - ARM Linux
Signed-off-by: Russell King 
---
 drivers/pcmcia/pxa2xx_base.c   |   19 +++
 drivers/pcmcia/pxa2xx_base.h   |3 ++
 drivers/pcmcia/pxa2xx_lubbock.c|   10 --
 drivers/pcmcia/sa1100_badge4.c |7 -
 drivers/pcmcia/sa1100_jornada720.c |   20 
 drivers/pcmcia/sa1100_neponset.c   |9 -
 drivers/pcmcia/sa_generic.c|   58 
 drivers/pcmcia/sa_generic.h|   14 
 drivers/pcmcia/sa11xx_base.c   |   21 
 drivers/pcmcia/sa11xx_base.h   |2 +
 10 files changed, 123 insertions(+), 40 deletions(-)

diff --git a/drivers/pcmcia/pxa2xx_base.c b/drivers/pcmcia/pxa2xx_base.c
index 3cb4fd2..c9c104b 100644
--- a/drivers/pcmcia/pxa2xx_base.c
+++ b/drivers/pcmcia/pxa2xx_base.c
@@ -228,7 +228,7 @@ static const char *skt_names[] = {
 #define SKT_DEV_INFO_SIZE(n) \
(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.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);
 }
 
+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 i, ret;
+   int i, ret = 0;
struct pcmcia_low_level *ops;
struct skt_dev_info *sinfo;
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;
 
-   /* 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
+   pxa2xx_drv_pcmcia_ops(ops);
 
sinfo = kzalloc(SKT_DEV_INFO_SIZE(ops->nr), GFP_KERNEL);
if (!sinfo)
diff --git a/drivers/pcmcia/pxa2xx_base.h b/drivers/pcmcia/pxa2xx_base.h
index 235d681..cb5efae 100644
--- a/drivers/pcmcia/pxa2xx_base.h
+++ b/drivers/pcmcia/pxa2xx_base.h
@@ -1,3 +1,6 @@
 /* temporary measure */
 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);
+
diff --git a/drivers/pcmcia/pxa2xx_lubbock.c b/drivers/pcmcia/pxa2xx_lubbock.c
index 6cbb1b1..35d5280 100644
--- a/drivers/pcmcia/pxa2xx_lubbock.c
+++ b/drivers/pcmcia/pxa2xx_lubbock.c
@@ -32,6 +32,7 @@ static int
 lubbock_pcmcia_configure_socket(struct soc_pcmcia_socket *skt,
const socket_state_t *state)
 {
+   struct sa_pcmcia_socket *s = to_skt(skt);
unsigned int pa_dwr_mask, pa_dwr_set, misc_mask, misc_set;
int ret = 0;
 
@@ -149,7 +150,7 @@ lubbock_pcmcia_configure_socket(struct soc_pcmcia_socket 
*skt,
 
if (ret == 0) {
lubbock_set_misc_wr(misc_mask, misc_set);
-   sa_set_io(SA_DEV(skt->dev), pa_dwr_mask, pa_dwr_set);
+   sa_set_io(s->dev, pa_dwr_mask, pa_dwr_set);
}
 
 #if 1
@@ -175,7 +176,7 @@ lubbock_pcmcia_configure_socket(struct soc_pcmcia_socket 
*skt,
 * Switch to 5V,  Configure socket with 5V voltage
 */
lubbock_set_misc_wr(misc_mask, 0);
-   sa_set_io(SA_DEV(skt->dev), pa_dwr_mask, 0);
+   sa_set_io(s->dev, pa_dwr_mask, 0);
 
/*
 * It takes about 100ms to turn off Vcc.
@@ -228,8 +229,9 @@ int pcmcia_lubbock_init(struct sa_dev *sadev)
/* Set CF Socket 1 power to standby mode. */
lubbock_set_misc_wr((1 << 15) | (1 << 14), 0);
 
-   sadev->dev.platform_data = &lubbock_pcmcia_ops;
-   ret = __pxa2xx_drv_pcmcia_probe(&sadev->dev);
+   pxa2xx_drv_pcmcia_ops(&lubbock_pcmcia_ops);
+   ret = sa_pcmcia_add(sadev, &lubbock_pcmcia_ops,
+   pxa2xx_drv_pcmcia_add_one);
}
 
return ret;
diff --git a/drivers/pcmcia/sa1100_badge4.c b/drivers/pcmcia/sa1100_badge4.c
index 1ca9737..6399314 100644
--- a/drivers/pcmcia/sa1100_badge4.c
+++ b/drivers/pcmcia/sa1100_badge4.c
@@ -134,6 +134,9 @@ static struct pcmcia_low_level badge4_pcmcia_ops = {
 
.socket_init= sa_pcmcia_socket_init,
.socket_suspend = sa_pcmcia_socket_suspend,
+
+   .first  = 0,
+   .nr = 2,
 };
 
 int pcmci

[RFC PATCH 04/10] PCMCIA: soc_common: push socket probe down into SoC specific support

2009-10-27 Thread Russell King - ARM Linux
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: Russell King 
---
 drivers/pcmcia/pxa2xx_base.c |   77 +--
 drivers/pcmcia/sa11xx_base.c |   91 ++
 drivers/pcmcia/soc_common.c  |   37 -
 drivers/pcmcia/soc_common.h  |2 -
 4 files changed, 103 insertions(+), 104 deletions(-)

diff --git a/drivers/pcmcia/pxa2xx_base.c b/drivers/pcmcia/pxa2xx_base.c
index 8a91106..3cb4fd2 100644
--- a/drivers/pcmcia/pxa2xx_base.c
+++ b/drivers/pcmcia/pxa2xx_base.c
@@ -228,6 +228,31 @@ static const char *skt_names[] = {
 #define SKT_DEV_INFO_SIZE(n) \
(sizeof(struct skt_dev_info) + (n)*sizeof(struct soc_pcmcia_socket))
 
+static int pxa2xx_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 __pxa2xx_drv_pcmcia_probe(struct device *dev)
 {
int i, ret;
@@ -240,6 +265,12 @@ int __pxa2xx_drv_pcmcia_probe(struct device *dev)
 
ops = (struct pcmcia_low_level *)dev->platform_data;
 
+   /* 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
+
sinfo = kzalloc(SKT_DEV_INFO_SIZE(ops->nr), GFP_KERNEL);
if (!sinfo)
return -ENOMEM;
@@ -250,40 +281,26 @@ int __pxa2xx_drv_pcmcia_probe(struct device *dev)
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.end= _PCMCIA(skt->nr) + PCMCIASp - 1;
-   skt->res_skt.name   = skt_names[skt->nr];
-   skt->res_skt.flags  = IORESOURCE_MEM;
+   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;
 
-   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;
+   ret = pxa2xx_drv_pcmcia_add_one(skt);
+   if (ret)
+   break;
}
 
-   /* 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
-
-   ret = soc_common_drv_pcmcia_probe(dev, ops, sinfo);
-
-   if (!ret)
+   if (ret) {
+   while (--i >= 0)
+   soc_pcmcia_remove_one(&sinfo->skt[i]);
+   kfree(sinfo);
+   } else {
pxa2xx_configure_sockets(dev);
+   dev_set_drvdata(dev, sinfo);
+   }
 
return ret;
 }
diff --git a/drivers/pcmcia/sa11xx_base.c b/drivers/pcmcia/sa11xx_base.c
index e15d59f..92a4348 100644
--- a/drivers/pcmcia/sa11xx_base.c
+++ b/drivers/pcmcia/sa11xx_base.c
@@ -171,6 +171,31 @@ static const char *skt_names[] = {
 #define SKT_DEV_INFO_SIZE(n) \
(sizeof(struct skt_dev_info) + (n)*sizeof(struct soc_pcmcia_socket))
 
+static int sa11xx_drv_pcmcia_add_one(struct soc_pcmcia_so

[RFC PATCH 03/10] PCMCIA: soc_common: push socket removal down to SoC specific support

2009-10-27 Thread Russell King - ARM Linux
Mechanically transplant the removal code from soc_common into each
SoC specific base support file, thereby allowing
soc_common_drv_pcmcia_remove to be removed.  No other changes.

Signed-off-by: Russell King 
---
 drivers/pcmcia/pxa2xx_base.c|   11 ++-
 drivers/pcmcia/sa1100_generic.c |   11 ++-
 drivers/pcmcia/sa_generic.c |   10 +-
 drivers/pcmcia/soc_common.c |   16 
 drivers/pcmcia/soc_common.h |1 -
 5 files changed, 29 insertions(+), 20 deletions(-)

diff --git a/drivers/pcmcia/pxa2xx_base.c b/drivers/pcmcia/pxa2xx_base.c
index 0e35acb..8a91106 100644
--- a/drivers/pcmcia/pxa2xx_base.c
+++ b/drivers/pcmcia/pxa2xx_base.c
@@ -297,7 +297,16 @@ static int pxa2xx_drv_pcmcia_probe(struct platform_device 
*dev)
 
 static int pxa2xx_drv_pcmcia_remove(struct platform_device *dev)
 {
-   return soc_common_drv_pcmcia_remove(&dev->dev);
+   struct skt_dev_info *sinfo = platform_get_drvdata(dev);
+   int i;
+
+   platform_set_drvdata(dev, NULL);
+
+   for (i = 0; i < sinfo->nskt; i++)
+   soc_pcmcia_remove_one(&sinfo->skt[i]);
+
+   kfree(sinfo);
+   return 0;
 }
 
 static int pxa2xx_drv_pcmcia_suspend(struct device *dev)
diff --git a/drivers/pcmcia/sa1100_generic.c b/drivers/pcmcia/sa1100_generic.c
index 2d0e997..11cc3ba 100644
--- a/drivers/pcmcia/sa1100_generic.c
+++ b/drivers/pcmcia/sa1100_generic.c
@@ -83,7 +83,16 @@ static int sa11x0_drv_pcmcia_probe(struct platform_device 
*dev)
 
 static int sa11x0_drv_pcmcia_remove(struct platform_device *dev)
 {
-   return soc_common_drv_pcmcia_remove(&dev->dev);
+   struct skt_dev_info *sinfo = platform_get_drvdata(dev);
+   int i;
+
+   platform_set_drvdata(dev, NULL);
+
+   for (i = 0; i < sinfo->nskt; i++)
+   soc_pcmcia_remove_one(&sinfo->skt[i]);
+
+   kfree(sinfo);
+   return 0;
 }
 
 static int sa11x0_drv_pcmcia_suspend(struct platform_device *dev,
diff --git a/drivers/pcmcia/sa_generic.c b/drivers/pcmcia/sa_generic.c
index 4be4e17..a6793e3 100644
--- a/drivers/pcmcia/sa_generic.c
+++ b/drivers/pcmcia/sa_generic.c
@@ -152,7 +152,15 @@ static int pcmcia_probe(struct sa_dev *dev)
 
 static int __devexit pcmcia_remove(struct sa_dev *dev)
 {
-   soc_common_drv_pcmcia_remove(&dev->dev);
+   struct skt_dev_info *sinfo = dev_get_drvdata(&dev->dev);
+   int i;
+
+   dev_set_drvdata(&dev->dev, NULL);
+
+   for (i = 0; i < sinfo->nskt; i++)
+   soc_pcmcia_remove_one(&sinfo->skt[i]);
+
+   kfree(sinfo);
release_mem_region(dev->res.start, 512);
return 0;
 }
diff --git a/drivers/pcmcia/soc_common.c b/drivers/pcmcia/soc_common.c
index 8938608..c42b651 100644
--- a/drivers/pcmcia/soc_common.c
+++ b/drivers/pcmcia/soc_common.c
@@ -777,22 +777,6 @@ int soc_common_drv_pcmcia_probe(struct device *dev, struct 
pcmcia_low_level *ops
 }
 EXPORT_SYMBOL(soc_common_drv_pcmcia_probe);
 
-int soc_common_drv_pcmcia_remove(struct device *dev)
-{
-   struct skt_dev_info *sinfo = dev_get_drvdata(dev);
-   int i;
-
-   dev_set_drvdata(dev, NULL);
-
-   for (i = 0; i < sinfo->nskt; i++)
-   soc_pcmcia_remove_one(&sinfo->skt[i]);
-
-   kfree(sinfo);
-
-   return 0;
-}
-EXPORT_SYMBOL(soc_common_drv_pcmcia_remove);
-
 MODULE_AUTHOR("John Dorsey ");
 MODULE_DESCRIPTION("Linux PCMCIA Card Services: Common SoC support");
 MODULE_LICENSE("Dual MPL/GPL");
diff --git a/drivers/pcmcia/soc_common.h b/drivers/pcmcia/soc_common.h
index 51c72ba..c33b8c3 100644
--- a/drivers/pcmcia/soc_common.h
+++ b/drivers/pcmcia/soc_common.h
@@ -139,7 +139,6 @@ void soc_pcmcia_remove_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);
-extern int soc_common_drv_pcmcia_remove(struct device *dev);
 
 
 #ifdef CONFIG_PCMCIA_DEBUG
-- 
1.6.2.5


___
Linux PCMCIA reimplementation list
http://lists.infradead.org/mailman/listinfo/linux-pcmcia


[RFC PATCH 02/10] PCMCIA: soc_common: provide single socket add/remove functionality

2009-10-27 Thread Russell King - ARM Linux
Factor out the functionality for adding and removing a single
socket, thereby allowing SoCs to individually register each
socket.  The advantage of this approach is that SoCs can then
extend soc_pcmcia_socket as they wish.

Signed-off-by: Russell King 
---
 drivers/pcmcia/soc_common.c |  230 +++
 drivers/pcmcia/soc_common.h |3 +-
 2 files changed, 125 insertions(+), 108 deletions(-)

diff --git a/drivers/pcmcia/soc_common.c b/drivers/pcmcia/soc_common.c
index 38c5484..8938608 100644
--- a/drivers/pcmcia/soc_common.c
+++ b/drivers/pcmcia/soc_common.c
@@ -573,7 +573,7 @@ void soc_pcmcia_enable_irqs(struct soc_pcmcia_socket *skt,
 EXPORT_SYMBOL(soc_pcmcia_enable_irqs);
 
 
-LIST_HEAD(soc_pcmcia_sockets);
+static LIST_HEAD(soc_pcmcia_sockets);
 static DEFINE_MUTEX(soc_pcmcia_sockets_lock);
 
 #ifdef CONFIG_CPU_FREQ
@@ -618,158 +618,174 @@ module_exit(soc_pcmcia_cpufreq_unregister);
 
 #endif
 
-int soc_common_drv_pcmcia_probe(struct device *dev, struct pcmcia_low_level 
*ops,
-   struct skt_dev_info *sinfo)
+void soc_pcmcia_remove_one(struct soc_pcmcia_socket *skt)
 {
-   struct soc_pcmcia_socket *skt;
-   int ret, i;
-
mutex_lock(&soc_pcmcia_sockets_lock);
+   del_timer_sync(&skt->poll_timer);
 
-   /*
-* Initialise the per-socket structure.
-*/
-   for (i = 0; i < sinfo->nskt; i++) {
-   skt = &sinfo->skt[i];
+   pcmcia_unregister_socket(&skt->socket);
 
-   skt->socket.ops = &soc_common_pcmcia_operations;
-   skt->socket.owner = ops->owner;
-   skt->socket.dev.parent = dev;
+   flush_scheduled_work();
 
-   init_timer(&skt->poll_timer);
-   skt->poll_timer.function = soc_common_pcmcia_poll_event;
-   skt->poll_timer.data = (unsigned long)skt;
-   skt->poll_timer.expires = jiffies + SOC_PCMCIA_POLL_PERIOD;
+   skt->ops->hw_shutdown(skt);
 
-   skt->dev= dev;
-   skt->ops= ops;
+   soc_common_pcmcia_config_skt(skt, &dead_socket);
 
-   ret = request_resource(&iomem_resource, &skt->res_skt);
-   if (ret)
-   goto out_err_1;
+   list_del(&skt->node);
+   mutex_unlock(&soc_pcmcia_sockets_lock);
 
-   ret = request_resource(&skt->res_skt, &skt->res_io);
-   if (ret)
-   goto out_err_2;
+   iounmap(skt->virt_io);
+   skt->virt_io = NULL;
+   release_resource(&skt->res_attr);
+   release_resource(&skt->res_mem);
+   release_resource(&skt->res_io);
+   release_resource(&skt->res_skt);
+}
+EXPORT_SYMBOL(soc_pcmcia_remove_one);
 
-   ret = request_resource(&skt->res_skt, &skt->res_mem);
-   if (ret)
-   goto out_err_3;
+int soc_pcmcia_add_one(struct soc_pcmcia_socket *skt)
+{
+   int ret;
 
-   ret = request_resource(&skt->res_skt, &skt->res_attr);
-   if (ret)
-   goto out_err_4;
+   init_timer(&skt->poll_timer);
+   skt->poll_timer.function = soc_common_pcmcia_poll_event;
+   skt->poll_timer.data = (unsigned long)skt;
+   skt->poll_timer.expires = jiffies + SOC_PCMCIA_POLL_PERIOD;
 
-   skt->virt_io = ioremap(skt->res_io.start, 0x1);
-   if (skt->virt_io == NULL) {
-   ret = -ENOMEM;
-   goto out_err_5;
-   }
+   ret = request_resource(&iomem_resource, &skt->res_skt);
+   if (ret)
+   goto out_err_1;
 
-   list_add(&skt->node, &soc_pcmcia_sockets);
+   ret = request_resource(&skt->res_skt, &skt->res_io);
+   if (ret)
+   goto out_err_2;
 
-   /*
-* We initialize default socket timing here, because
-* we are not guaranteed to see a SetIOMap operation at
-* runtime.
-*/
-   ops->set_timing(skt);
+   ret = request_resource(&skt->res_skt, &skt->res_mem);
+   if (ret)
+   goto out_err_3;
 
-   ret = ops->hw_init(skt);
-   if (ret)
-   goto out_err_6;
+   ret = request_resource(&skt->res_skt, &skt->res_attr);
+   if (ret)
+   goto out_err_4;
 
-   skt->socket.features = SS_CAP_STATIC_MAP|SS_CAP_PCCARD;
-   skt->socket.resource_ops = &pccard_static_ops;
-   skt->socket.irq_mask = 0;
-   skt->socket.map_size = PAGE_SIZE;
-   skt->socket.pci_irq = skt->irq;
-   skt->socket.io_offset = (unsigned long)skt->virt_io;
+   skt->virt_io = ioremap(skt->res_io.start, 0x1);
+   if (skt->virt_io == NULL) {
+   ret = -ENOMEM;
+   goto out_err_5;
+   }
 
-   skt->status = soc_common_pcmcia_skt_state(skt);
+   mutex_lock(&soc_pc

[RFC PATCH 01/10] PCMCIA: soc_common: convert to a stand alone module

2009-10-27 Thread Russell King - ARM Linux
Convert soc_common.c to be a stand alone module, rather than wrapping
it up into the individual SoC specific base modules.  In doing this,
we need to add init/exit functions for soc_common to register/remove
the cpufreq notifier.

Signed-off-by: Russell King 
---
 drivers/pcmcia/Kconfig  |6 ++
 drivers/pcmcia/Makefile |   10 --
 drivers/pcmcia/soc_common.c |   16 +++-
 3 files changed, 17 insertions(+), 15 deletions(-)

diff --git a/drivers/pcmcia/Kconfig b/drivers/pcmcia/Kconfig
index 17f38a7..0b82493 100644
--- a/drivers/pcmcia/Kconfig
+++ b/drivers/pcmcia/Kconfig
@@ -196,9 +196,13 @@ config PCMCIA_BCM63XX
tristate "bcm63xx pcmcia support"
depends on BCM63XX && PCMCIA
 
+config PCMCIA_SOC_COMMON
+   bool
+
 config PCMCIA_SA1100
tristate "SA1100 support"
depends on ARM && ARCH_SA1100 && PCMCIA
+   select PCMCIA_SOC_COMMON
help
  Say Y here to include support for SA11x0-based PCMCIA or CF
  sockets, found on HP iPAQs, Yopy, and other StrongARM(R)/
@@ -209,6 +213,7 @@ config PCMCIA_SA1100
 config PCMCIA_SA
tristate "SA support"
depends on ARM && ARCH_SA1100 && SA && PCMCIA
+   select PCMCIA_SOC_COMMON
help
  Say Y  here to include support for SA-based PCMCIA or CF
  sockets, found on the Jornada 720, Graphicsmaster and other
@@ -222,6 +227,7 @@ config PCMCIA_PXA2XX
depends on (ARCH_LUBBOCK || MACH_MAINSTONE || PXA_SHARPSL \
|| MACH_ARMCORE || ARCH_PXA_PALM || TRIZEPS_PCMCIA \
|| ARCH_VIPER || ARCH_PXA_ESERIES || MACH_STARGATE2)
+   select PCMCIA_SOC_COMMON
help
  Say Y here to include support for the PXA2xx PCMCIA controller
 
diff --git a/drivers/pcmcia/Makefile b/drivers/pcmcia/Makefile
index a03a38a..3829383 100644
--- a/drivers/pcmcia/Makefile
+++ b/drivers/pcmcia/Makefile
@@ -22,8 +22,9 @@ obj-$(CONFIG_I82365)  += i82365.o
 obj-$(CONFIG_I82092)   += i82092.o
 obj-$(CONFIG_TCIC) += tcic.o
 obj-$(CONFIG_PCMCIA_M8XX)  += m8xx_pcmcia.o
-obj-$(CONFIG_PCMCIA_SA1100)+= sa11xx_core.o sa1100_cs.o
-obj-$(CONFIG_PCMCIA_SA)+= sa11xx_core.o sa_cs.o
+obj-$(CONFIG_PCMCIA_SOC_COMMON)+= soc_common.o
+obj-$(CONFIG_PCMCIA_SA1100)+= sa11xx_base.o sa1100_cs.o
+obj-$(CONFIG_PCMCIA_SA)+= sa11xx_base.o sa_cs.o
 obj-$(CONFIG_M32R_PCC) += m32r_pcc.o
 obj-$(CONFIG_M32R_CFC) += m32r_cfc.o
 obj-$(CONFIG_PCMCIA_AU1X00)+= au1x00_ss.o
@@ -35,9 +36,6 @@ obj-$(CONFIG_BFIN_CFPCMCIA)   += 
bfin_cf_pcmcia.o
 obj-$(CONFIG_AT91_CF)  += at91_cf.o
 obj-$(CONFIG_ELECTRA_CF)   += electra_cf.o
 
-sa11xx_core-y  += soc_common.o sa11xx_base.o
-pxa2xx_core-y  += soc_common.o pxa2xx_base.o
-
 au1x00_ss-y+= au1000_generic.o
 au1x00_ss-$(CONFIG_MIPS_PB1000)+= au1000_pb1x00.o
 au1x00_ss-$(CONFIG_MIPS_PB1100)+= au1000_pb1x00.o
@@ -77,4 +75,4 @@ pxa2xx-obj-$(CONFIG_MACH_PALMLD)  += 
pxa2xx_palmld.o
 pxa2xx-obj-$(CONFIG_MACH_E740) += pxa2xx_e740.o
 pxa2xx-obj-$(CONFIG_MACH_STARGATE2)+= pxa2xx_stargate2.o
 
-obj-$(CONFIG_PCMCIA_PXA2XX)+= pxa2xx_core.o $(pxa2xx-obj-y)
+obj-$(CONFIG_PCMCIA_PXA2XX)+= pxa2xx_base.o $(pxa2xx-obj-y)
diff --git a/drivers/pcmcia/soc_common.c b/drivers/pcmcia/soc_common.c
index 163cf98..38c5484 100644
--- a/drivers/pcmcia/soc_common.c
+++ b/drivers/pcmcia/soc_common.c
@@ -608,15 +608,14 @@ static int soc_pcmcia_cpufreq_register(void)
"notifier for PCMCIA (%d)\n", ret);
return ret;
 }
+fs_initcall(soc_pcmcia_cpufreq_register);
 
 static void soc_pcmcia_cpufreq_unregister(void)
 {
cpufreq_unregister_notifier(&soc_pcmcia_notifier_block, 
CPUFREQ_TRANSITION_NOTIFIER);
 }
+module_exit(soc_pcmcia_cpufreq_unregister);
 
-#else
-static int soc_pcmcia_cpufreq_register(void) { return 0; }
-static void soc_pcmcia_cpufreq_unregister(void) {}
 #endif
 
 int soc_common_drv_pcmcia_probe(struct device *dev, struct pcmcia_low_level 
*ops,
@@ -667,9 +666,6 @@ int soc_common_drv_pcmcia_probe(struct device *dev, struct 
pcmcia_low_level *ops
goto out_err_5;
}
 
-   if (list_empty(&soc_pcmcia_sockets))
-   soc_pcmcia_cpufreq_register();
-
list_add(&skt->node, &soc_pcmcia_sockets);
 
/*
@@ -742,6 +738,7 @@ int soc_common_drv_pcmcia_probe(struct device *dev, struct 
pcmcia_low_level *ops
mutex_unlock(&soc_pcmcia_

Re: [PATCH 3/9] pcmcia: use pcmcia_loop_config in misc pcmcia drivers

2009-10-27 Thread John W. Linville
On Mon, Oct 19, 2009 at 01:07:29AM +0200, Dominik Brodowski wrote:
> Use pcmcia_loop_config() in a few drivers missed during the first
> round. On fmvj18x_cs.c it -- strangely -- only requries us to set
> conf.ConfigIndex, which is done by the core, so include an empty
> loop function which returns 0 unconditionally.
> 
> CC: David S. Miller 
> CC: John W. Linville 
> CC: Jiri Kosina 
> CC: David Sterba 
> CC: net...@vger.kernel.org
> CC: linux-wirel...@vger.kernel.org
> Signed-off-by: Dominik Brodowski 

Acked-by: John W. Linville 

-- 
John W. LinvilleSomeday the world will need a hero, and you
linvi...@tuxdriver.com  might be all we have.  Be ready.

___
Linux PCMCIA reimplementation list
http://lists.infradead.org/mailman/listinfo/linux-pcmcia


Re: [PATCH 2/9] pcmcia: use pre-determined values

2009-10-27 Thread John W. Linville
On Mon, Oct 19, 2009 at 01:07:28AM +0200, Dominik Brodowski wrote:
> A few PCMCIA network drivers can make use of values provided by the pcmcia
> core, instead of tedious, independent CIS parsing.
> 
> xirc32ps_cs.c: manf_id
> 
> hostap_cs.c: multifunction count
> 
> b43/pcmcia.c: ConfigBase address and "Present"
> 
> smc91c92_cs.c:  By default, mhz_setup() can use VERS_1 as it is stored
> in struct pcmcia_device. Only some cards require workarounds, such as
> reading out VERS_1 twice.
> 
> CC: David S. Miller 
> CC: John W. Linville 
> CC: net...@vger.kernel.org
> CC: linux-wirel...@vger.kernel.org
> Signed-off-by: Dominik Brodowski 

Acked-by: John W. Linville 

-- 
John W. LinvilleSomeday the world will need a hero, and you
linvi...@tuxdriver.com  might be all we have.  Be ready.

___
Linux PCMCIA reimplementation list
http://lists.infradead.org/mailman/listinfo/linux-pcmcia


Re: [PATCH 7/9] pcmcia: convert ssb pcmcia driver to use new CIS helpers

2009-10-27 Thread John W. Linville
On Mon, Oct 19, 2009 at 01:07:33AM +0200, Dominik Brodowski wrote:
> SSB is a prime example of how to make use of the new CIS helpers.
> 
> CC: Michael Buesch 
> CC: John W. Linville 
> Signed-off-by: Dominik Brodowski 

Acked-by: John W. Linville 

-- 
John W. LinvilleSomeday the world will need a hero, and you
linvi...@tuxdriver.com  might be all we have.  Be ready.

___
Linux PCMCIA reimplementation list
http://lists.infradead.org/mailman/listinfo/linux-pcmcia


[RFC PATCH 1/2] PCMCIA: Add soc_common support for banked SoC drivers.

2009-10-27 Thread Martin Fuzzey
Some SoCs (like freescale MXC) require configuring a device register
to set the bank mapped into the memory window.

Also allow interrupt flags to be configured (to support shared interrupts).

Signed-off-by: Martin Fuzzey 

---

 drivers/pcmcia/soc_common.c |   21 +++--
 drivers/pcmcia/soc_common.h |7 +++
 2 files changed, 22 insertions(+), 6 deletions(-)

diff --git a/drivers/pcmcia/soc_common.c b/drivers/pcmcia/soc_common.c
index 163cf98..c06440c 100644
--- a/drivers/pcmcia/soc_common.c
+++ b/drivers/pcmcia/soc_common.c
@@ -257,7 +257,8 @@ static irqreturn_t soc_common_pcmcia_interrupt(int irq, 
void *dev)
struct soc_pcmcia_socket *skt = dev;
 
debug(skt, 3, "servicing IRQ %d\n", irq);
-
+   if (skt->ops->ack_interrupt)
+   skt->ops->ack_interrupt(skt);
soc_common_check_status(skt);
 
return IRQ_HANDLED;
@@ -335,6 +336,7 @@ soc_common_pcmcia_set_io_map(struct pcmcia_socket *sock, 
struct pccard_io_map *m
 {
struct soc_pcmcia_socket *skt = to_soc_pcmcia_socket(sock);
unsigned short speed = map->speed;
+   int ret = 0;
 
debug(skt, 2, "map %u  speed %u start 0x%08x stop 0x%08x\n",
map->map, map->speed, map->start, map->stop);
@@ -367,11 +369,14 @@ soc_common_pcmcia_set_io_map(struct pcmcia_socket *sock, 
struct pccard_io_map *m
if (map->stop == 1)
map->stop = PAGE_SIZE-1;
 
+   if (skt->ops->set_io_map)
+   ret = skt->ops->set_io_map(skt, map);
+
map->stop -= map->start;
map->stop += skt->socket.io_offset;
map->start = skt->socket.io_offset;
 
-   return 0;
+   return ret;
 }
 
 
@@ -389,6 +394,7 @@ soc_common_pcmcia_set_mem_map(struct pcmcia_socket *sock, 
struct pccard_mem_map
struct soc_pcmcia_socket *skt = to_soc_pcmcia_socket(sock);
struct resource *res;
unsigned short speed = map->speed;
+   int ret = 0;
 
debug(skt, 2, "map %u speed %u card_start %08x\n",
map->map, map->speed, map->card_start);
@@ -423,10 +429,12 @@ soc_common_pcmcia_set_mem_map(struct pcmcia_socket *sock, 
struct pccard_mem_map
}
 
skt->ops->set_timing(skt);
+   if (skt->ops->set_mem_map)
+   ret = skt->ops->set_mem_map(skt, map);
+   else
+   map->static_start = res->start + map->card_start;
 
-   map->static_start = res->start + map->card_start;
-
-   return 0;
+   return ret;
 }
 
 struct bittbl {
@@ -519,7 +527,8 @@ int soc_pcmcia_request_irqs(struct soc_pcmcia_socket *skt,
if (irqs[i].sock != skt->nr)
continue;
res = request_irq(irqs[i].irq, soc_common_pcmcia_interrupt,
- IRQF_DISABLED, irqs[i].str, skt);
+ IRQF_DISABLED | irqs[i].flags,
+ irqs[i].str, skt);
if (res)
break;
set_irq_type(irqs[i].irq, IRQ_TYPE_NONE);
diff --git a/drivers/pcmcia/soc_common.h b/drivers/pcmcia/soc_common.h
index 290e143..9076003 100644
--- a/drivers/pcmcia/soc_common.h
+++ b/drivers/pcmcia/soc_common.h
@@ -113,6 +113,12 @@ struct pcmcia_low_level {
 */
int (*frequency_change)(struct soc_pcmcia_socket *, unsigned long, 
struct cpufreq_freqs *);
 #endif
+   void (*ack_interrupt)(struct soc_pcmcia_socket *);
+
+   /* Hardware specific mapping */
+   int (*set_mem_map)(struct soc_pcmcia_socket *, struct pccard_mem_map *);
+   int (*set_io_map)(struct soc_pcmcia_socket *, struct pccard_io_map 
*map);
+
 };
 
 
@@ -120,6 +126,7 @@ struct pcmcia_irqs {
int sock;
int irq;
const char *str;
+   unsigned long flags;
 };
 
 struct soc_pcmcia_timing {


___
Linux PCMCIA reimplementation list
http://lists.infradead.org/mailman/listinfo/linux-pcmcia


[RFC PATCH 2/2] MXC: add pcmcia support

2009-10-27 Thread Martin Fuzzey


Signed-off-by: Martin Fuzzey 

---

 arch/arm/mach-mx2/clock_imx21.c |1 
 arch/arm/mach-mx2/clock_imx27.c |1 
 arch/arm/mach-mx2/devices.c |   21 +
 arch/arm/mach-mx2/devices.h |1 
 arch/arm/mach-mx3/clock.c   |1 
 drivers/pcmcia/Kconfig  |6 
 drivers/pcmcia/Makefile |3 
 drivers/pcmcia/mxc_generic.c|  711 +++
 8 files changed, 745 insertions(+), 0 deletions(-)
 create mode 100644 drivers/pcmcia/mxc_generic.c

diff --git a/arch/arm/mach-mx2/clock_imx21.c b/arch/arm/mach-mx2/clock_imx21.c
index 801e9d2..e131312 100644
--- a/arch/arm/mach-mx2/clock_imx21.c
+++ b/arch/arm/mach-mx2/clock_imx21.c
@@ -960,6 +960,7 @@ static struct clk_lookup lookups[] = {
_REGISTER_CLOCK("mxc-keypad", NULL, kpp_clk)
_REGISTER_CLOCK(NULL, "owire", owire_clk)
_REGISTER_CLOCK(NULL, "rtc", rtc_clk)
+   _REGISTER_CLOCK("mxc-pcmcia", NULL, hclk_clk)
 };
 
 /*
diff --git a/arch/arm/mach-mx2/clock_imx27.c b/arch/arm/mach-mx2/clock_imx27.c
index a3a76cf..ed2fb96 100644
--- a/arch/arm/mach-mx2/clock_imx27.c
+++ b/arch/arm/mach-mx2/clock_imx27.c
@@ -674,6 +674,7 @@ static struct clk_lookup lookups[] = {
_REGISTER_CLOCK("mxc_w1.0", NULL, owire_clk)
_REGISTER_CLOCK(NULL, "rtc", rtc_clk)
_REGISTER_CLOCK(NULL, "scc", scc_clk)
+   _REGISTER_CLOCK("mxc-pcmcia", NULL, ahb_clk)
 };
 
 /* Adjust the clock path for TO2 and later */
diff --git a/arch/arm/mach-mx2/devices.c b/arch/arm/mach-mx2/devices.c
index 50199af..906ccb2 100644
--- a/arch/arm/mach-mx2/devices.c
+++ b/arch/arm/mach-mx2/devices.c
@@ -564,3 +564,24 @@ int __init mxc_register_gpios(void)
 {
return mxc_gpio_init(imx_gpio_ports, ARRAY_SIZE(imx_gpio_ports));
 }
+
+static struct resource mxc_resource_pcmcia[] = {
+   [0] = {
+   .start  = PCMCIA_CTL_BASE_ADDR,
+   .end= PCMCIA_CTL_BASE_ADDR + 0x67,
+   .flags  = IORESOURCE_MEM,
+   },
+   [1] = {
+   .start  = MXC_INT_PCMCIA,
+   .end= MXC_INT_PCMCIA,
+   .flags  = IORESOURCE_IRQ,
+   },
+};
+
+struct platform_device mxc_device_pcmcia = {
+   .name   = "mxc-pcmcia",
+   .id = -1,
+   .resource   = mxc_resource_pcmcia,
+   .num_resources  = ARRAY_SIZE(mxc_resource_pcmcia),
+};
+
diff --git a/arch/arm/mach-mx2/devices.h b/arch/arm/mach-mx2/devices.h
index d315406..9eff953 100644
--- a/arch/arm/mach-mx2/devices.h
+++ b/arch/arm/mach-mx2/devices.h
@@ -26,4 +26,5 @@ extern struct platform_device mxc_usbh2;
 extern struct platform_device mxc_spi_device0;
 extern struct platform_device mxc_spi_device1;
 extern struct platform_device mxc_spi_device2;
+extern struct platform_device mxc_device_pcmcia;
 
diff --git a/arch/arm/mach-mx3/clock.c b/arch/arm/mach-mx3/clock.c
index da4a59f..7663010 100644
--- a/arch/arm/mach-mx3/clock.c
+++ b/arch/arm/mach-mx3/clock.c
@@ -573,6 +573,7 @@ static struct clk_lookup lookups[] = {
_REGISTER_CLOCK(NULL, "mpeg4", mpeg4_clk)
_REGISTER_CLOCK(NULL, "mbx", mbx_clk)
_REGISTER_CLOCK("mxc_rtc", NULL, ckil_clk)
+   _REGISTER_CLOCK("mxc-pcmcia", NULL, ahb_clk)
 };
 
 int __init mx31_clocks_init(unsigned long fref)
diff --git a/drivers/pcmcia/Kconfig b/drivers/pcmcia/Kconfig
index 17f38a7..9bddf2f 100644
--- a/drivers/pcmcia/Kconfig
+++ b/drivers/pcmcia/Kconfig
@@ -292,4 +292,10 @@ config PCCARD_NONSTATIC
 config PCCARD_IODYN
bool
 
+config PCMCIA_MXC
+   tristate "Freescale MXC PCMCIA Driver"
+   depends on PCMCIA && ARCH_MXC
+   help
+ Say Y here to support the integrated PCMCIA in the freescale MXC SoCs.
+
 endif  # PCCARD
diff --git a/drivers/pcmcia/Makefile b/drivers/pcmcia/Makefile
index a03a38a..024fb9c 100644
--- a/drivers/pcmcia/Makefile
+++ b/drivers/pcmcia/Makefile
@@ -34,6 +34,8 @@ obj-$(CONFIG_OMAP_CF) += omap_cf.o
 obj-$(CONFIG_BFIN_CFPCMCIA)+= bfin_cf_pcmcia.o
 obj-$(CONFIG_AT91_CF)  += at91_cf.o
 obj-$(CONFIG_ELECTRA_CF)   += electra_cf.o
+obj-$(CONFIG_PCMCIA_MXC)   +=  mxc_pcmcia.o
+mxc_pcmcia-objs+= soc_common.o 
mxc_generic.o
 
 sa11xx_core-y  += soc_common.o sa11xx_base.o
 pxa2xx_core-y  += soc_common.o pxa2xx_base.o
@@ -78,3 +80,4 @@ pxa2xx-obj-$(CONFIG_MACH_E740)+= 
pxa2xx_e740.o
 pxa2xx-obj-$(CONFIG_MACH_STARGATE2)+= pxa2xx_stargate2.o
 
 obj-$(CONFIG_PCMCIA_PXA2XX)+= pxa2xx_core.o $(pxa2xx-obj-y)
+
diff --git a/drivers/pcmcia/mxc_generic.c b/drivers/pcmcia/mxc_generic.c
new file mode 100644
index 000..4151ae4
--- /dev/null
+++ b/drivers/pcmcia/mxc_generic.c
@@ -0,0 +1,711 @@
+/*
+ * drivers/pcmcia/mxc_pcmica.c
+ *
+ * Driver for the PCMCIA control functionality of i.MX SoC family
+ *
+ *

[RFC PATCH 0/2] MXC PCMCIA Support

2009-10-27 Thread Martin Fuzzey
This patch series adds support for the MXC PCMCIA / CF controller.

It has been tested on MX21 (with CF card and ide-cs) and
compile only tested for MX27, MX31



___
Linux PCMCIA reimplementation list
http://lists.infradead.org/mailman/listinfo/linux-pcmcia


Re: [PATCH 9/9] pcmcia: remove pcmcia_get_{first,next}_tuple()

2009-10-27 Thread Greg KH
On Tue, Oct 27, 2009 at 06:12:24AM +0100, Dominik Brodowski wrote:
> Randy,
> 
> On Mon, Oct 26, 2009 at 03:19:58PM -0700, Randy Dunlap wrote:
> > > Remove the pcmcia_get_{first,next}_tuple() calls no longer needed by
> > > (current) pcmcia device drivers.
> > 
> > linux-next 20091026:
> > 
> > drivers/staging/comedi/drivers/cb_das16_cs.c:155: error: implicit 
> > declaration of function 'pcmcia_get_first_tuple'
> > drivers/staging/comedi/drivers/cb_das16_cs.c:156: error: implicit 
> > declaration of function 'pcmcia_get_tuple_data'
> > drivers/staging/comedi/drivers/cb_das16_cs.c:883: error: implicit 
> > declaration of function 'pcmcia_get_next_tuple'
> > 
> > There are also other comedi/ drivers that this randconfig didn't attempt
> > to build that are still using these same interfaces.
> 
> What are the current rules on drivers in staging/ ? Do they need to be
> updated as well on API changes?

You don't have to do it, no.  I'll be glad to do so as long as I get a
hint as to what needs to be done :)

thanks,

greg k-h

___
Linux PCMCIA reimplementation list
http://lists.infradead.org/mailman/listinfo/linux-pcmcia


Re: [PATCH 16/16] pcmcia: use dev_dbg and dev_print in pd6729.c

2009-10-27 Thread Wolfram Sang
> Well, one can use dev_* here. So, next try:
> 
> 
> From: Dominik Brodowski 
> Date: Sat, 24 Oct 2009 18:07:16 +0200
> Subject: [PATCH 16/16] pcmcia: use dev_dbg and dev_print in pd6729.c
> 
> As suggested by Wolfram Sang , use dev_dbg(),
> and dev_{err,warn,info}() in pd6729.c, and add some "\n" suggested by
> Komuro . In the ISR, use pr_devel() and
> dev_vdbg() as they are only compiled if DEBUG (or, for dev_vdbg(),
> VERBOSE_DEBUG) are set explicitly.
> 
> CC: Wolfram Sang 
> CC: Komuro 
> Signed-off-by: Dominik Brodowski 

Acked-by: Wolfram Sang  

-- 
Pengutronix e.K.   | Wolfram Sang|
Industrial Linux Solutions | http://www.pengutronix.de/  |
Peiner Str. 6-8, 31137 Hildesheim, Germany | Phone: +49-5121-206917-5064 |
Amtsgericht Hildesheim, HRA 2686   | Fax:   +49-5121-206917- |


signature.asc
Description: Digital signature
___
Linux PCMCIA reimplementation list
http://lists.infradead.org/mailman/listinfo/linux-pcmcia