[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 rmk+ker...@arm.linux.org.uk
---
 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_pcmcia_sockets_lock);
 
-   ret = 

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

2009-10-04 Thread Russell King
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 rmk+ker...@arm.linux.org.uk
---
 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_pcmcia_sockets_lock);
 
-   ret =