Fedora kernel-2.6.17-1.2142_FC4 patched with stable patch-2.6.17.4-vs2.0.2-rc26.diff
[linux-2.6.git] / drivers / pcmcia / soc_common.c
index 6d393e7..ea7d9ca 100644 (file)
 
 #include "soc_common.h"
 
+/* FIXME: platform dependent resource declaration has to move out of this file */
+#ifdef CONFIG_ARCH_PXA
+#include <asm/arch/pxa-regs.h>
+#endif
+
 #ifdef DEBUG
 
 static int pc_debug;
@@ -61,7 +66,7 @@ void soc_pcmcia_debug(struct soc_pcmcia_socket *skt, const char *func,
        if (pc_debug > lvl) {
                printk(KERN_DEBUG "skt%u: %s: ", skt->nr, func);
                va_start(args, fmt);
-               printk(fmt, args);
+               vprintk(fmt, args);
                va_end(args);
        }
 }
@@ -192,18 +197,15 @@ static int soc_common_pcmcia_sock_init(struct pcmcia_socket *sock)
 static int soc_common_pcmcia_suspend(struct pcmcia_socket *sock)
 {
        struct soc_pcmcia_socket *skt = to_soc_pcmcia_socket(sock);
-       int ret;
 
        debug(skt, 2, "suspending socket\n");
 
-       ret = soc_common_pcmcia_config_skt(skt, &dead_socket);
-       if (ret == 0)
-               skt->ops->socket_suspend(skt);
+       skt->ops->socket_suspend(skt);
 
-       return ret;
+       return 0;
 }
 
-static spinlock_t status_lock = SPIN_LOCK_UNLOCKED;
+static DEFINE_SPINLOCK(status_lock);
 
 static void soc_common_check_status(struct soc_pcmcia_socket *skt)
 {
@@ -294,33 +296,12 @@ soc_common_pcmcia_get_status(struct pcmcia_socket *sock, unsigned int *status)
 }
 
 
-/*
- * Implements the get_socket() operation for the in-kernel PCMCIA
- * service (formerly SS_GetSocket in Card Services). Not a very
- * exciting routine.
- *
- * Returns: 0
- */
-static int
-soc_common_pcmcia_get_socket(struct pcmcia_socket *sock, socket_state_t *state)
-{
-       struct soc_pcmcia_socket *skt = to_soc_pcmcia_socket(sock);
-
-       debug(skt, 2, "\n");
-
-       *state = skt->cs_state;
-
-       return 0;
-}
-
 /*
  * Implements the set_socket() operation for the in-kernel PCMCIA
  * service (formerly SS_SetSocket in Card Services). We more or
  * less punt all of this work and let the kernel handle the details
  * of power configuration, reset, &c. We also record the value of
  * `state' in order to regurgitate it to the PCMCIA core later.
- *
- * Returns: 0
  */
 static int
 soc_common_pcmcia_set_socket(struct pcmcia_socket *sock, socket_state_t *state)
@@ -392,8 +373,8 @@ soc_common_pcmcia_set_io_map(struct pcmcia_socket *sock, struct pccard_io_map *m
                map->stop = PAGE_SIZE-1;
 
        map->stop -= map->start;
-       map->stop += (unsigned long)skt->virt_io;
-       map->start = (unsigned long)skt->virt_io;
+       map->stop += skt->socket.io_offset;
+       map->start = skt->socket.io_offset;
 
        return 0;
 }
@@ -405,7 +386,7 @@ soc_common_pcmcia_set_io_map(struct pcmcia_socket *sock, struct pccard_io_map *m
  * the map speed as requested, but override the address ranges
  * supplied by Card Services.
  *
- * Returns: 0 on success, -1 on error
+ * Returns: 0 on success, -ERRNO on error
  */
 static int
 soc_common_pcmcia_set_mem_map(struct pcmcia_socket *sock, struct pccard_mem_map *map)
@@ -448,9 +429,7 @@ soc_common_pcmcia_set_mem_map(struct pcmcia_socket *sock, struct pccard_mem_map
 
        skt->ops->set_timing(skt);
 
-       map->sys_stop -= map->sys_start;
-       map->sys_stop += res->start + map->card_start;
-       map->sys_start = res->start + map->card_start;
+       map->static_start = res->start + map->card_start;
 
        return 0;
 }
@@ -530,7 +509,6 @@ static struct pccard_operations soc_common_pcmcia_operations = {
        .init                   = soc_common_pcmcia_sock_init,
        .suspend                = soc_common_pcmcia_suspend,
        .get_status             = soc_common_pcmcia_get_status,
-       .get_socket             = soc_common_pcmcia_get_socket,
        .set_socket             = soc_common_pcmcia_set_socket,
        .set_io_map             = soc_common_pcmcia_set_io_map,
        .set_mem_map            = soc_common_pcmcia_set_mem_map,
@@ -655,31 +633,31 @@ static void soc_pcmcia_cpufreq_unregister(void)
 }
 
 #else
-#define soc_pcmcia_cpufreq_register()
-#define soc_pcmcia_cpufreq_unregister()
+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, int first, int nr)
 {
        struct skt_dev_info *sinfo;
+       struct soc_pcmcia_socket *skt;
        int ret, i;
 
        down(&soc_pcmcia_sockets_lock);
 
-       sinfo = kmalloc(SKT_DEV_INFO_SIZE(nr), GFP_KERNEL);
+       sinfo = kzalloc(SKT_DEV_INFO_SIZE(nr), GFP_KERNEL);
        if (!sinfo) {
                ret = -ENOMEM;
                goto out;
        }
 
-       memset(sinfo, 0, SKT_DEV_INFO_SIZE(nr));
        sinfo->nskt = nr;
 
        /*
         * Initialise the per-socket structure.
         */
        for (i = 0; i < nr; i++) {
-               struct soc_pcmcia_socket *skt = &sinfo->skt[i];
+               skt = &sinfo->skt[i];
 
                skt->socket.ops = &soc_common_pcmcia_operations;
                skt->socket.owner = ops->owner;
@@ -737,7 +715,7 @@ int soc_common_drv_pcmcia_probe(struct device *dev, struct pcmcia_low_level *ops
                        goto out_err_5;
                }
 
-               if ( list_empty(&soc_pcmcia_sockets) )
+               if (list_empty(&soc_pcmcia_sockets))
                        soc_pcmcia_cpufreq_register();
 
                list_add(&skt->node, &soc_pcmcia_sockets);
@@ -754,6 +732,7 @@ int soc_common_drv_pcmcia_probe(struct device *dev, struct pcmcia_low_level *ops
                        goto out_err_6;
 
                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;
@@ -777,7 +756,7 @@ int soc_common_drv_pcmcia_probe(struct device *dev, struct pcmcia_low_level *ops
        goto out;
 
        do {
-               struct soc_pcmcia_socket *skt = &sinfo->skt[i];
+               skt = &sinfo->skt[i];
 
                del_timer_sync(&skt->poll_timer);
                pcmcia_unregister_socket(&skt->socket);
@@ -837,7 +816,7 @@ int soc_common_drv_pcmcia_remove(struct device *dev)
                release_resource(&skt->res_io);
                release_resource(&skt->res_skt);
        }
-       if ( list_empty(&soc_pcmcia_sockets) )
+       if (list_empty(&soc_pcmcia_sockets))
                soc_pcmcia_cpufreq_unregister();
 
        up(&soc_pcmcia_sockets_lock);