]> git.hungrycats.org Git - linux/commitdiff
[ARM] SA11x0 PCMCIA 3
authorRussell King <rmk@flint.arm.linux.org.uk>
Sun, 2 Mar 2003 19:51:33 +0000 (19:51 +0000)
committerRussell King <rmk@flint.arm.linux.org.uk>
Sun, 2 Mar 2003 19:51:33 +0000 (19:51 +0000)
Make low level socket_status() method take the socket index as an
argument in the same way that our other methods do.  socket_status()
now only returns the status of the requested socket, not all sockets.

16 files changed:
drivers/pcmcia/sa1100_assabet.c
drivers/pcmcia/sa1100_cerf.c
drivers/pcmcia/sa1100_flexanet.c
drivers/pcmcia/sa1100_freebird.c
drivers/pcmcia/sa1100_generic.c
drivers/pcmcia/sa1100_generic.h
drivers/pcmcia/sa1100_h3600.c
drivers/pcmcia/sa1100_pangolin.c
drivers/pcmcia/sa1100_shannon.c
drivers/pcmcia/sa1100_simpad.c
drivers/pcmcia/sa1100_stork.c
drivers/pcmcia/sa1100_system3.c
drivers/pcmcia/sa1100_trizeps.c
drivers/pcmcia/sa1100_yopy.c
drivers/pcmcia/sa1111_generic.c
drivers/pcmcia/sa1111_generic.h

index e1b4e2bb7a99cea910572425c5bb46942f54c743..6566f6e0caa8718ec4c83c85c5bdfcabcb383eb6 100644 (file)
@@ -69,25 +69,20 @@ static int assabet_pcmcia_shutdown(void)
        return 0;
 }
 
-static int
-assabet_pcmcia_socket_state(struct pcmcia_state_array *state_array)
+static void
+assabet_pcmcia_socket_state(int sock, struct pcmcia_state *state)
 {
-       unsigned long levels;
-
-       if (state_array->size < 2)
-               return -1;
-
-       levels = GPLR;
+       unsigned long levels = GPLR;
 
-       state_array->state[1].detect = (levels & ASSABET_GPIO_CF_CD) ? 0 : 1;
-       state_array->state[1].ready  = (levels & ASSABET_GPIO_CF_IRQ) ? 1 : 0;
-       state_array->state[1].bvd1   = (levels & ASSABET_GPIO_CF_BVD1) ? 1 : 0;
-       state_array->state[1].bvd2   = (levels & ASSABET_GPIO_CF_BVD2) ? 1 : 0;
-       state_array->state[1].wrprot = 0; /* Not available on Assabet. */
-       state_array->state[1].vs_3v  = 1; /* Can only apply 3.3V on Assabet. */
-       state_array->state[1].vs_Xv  = 0;
-
-       return 1;
+       if (sock == 1) {
+               state->detect = (levels & ASSABET_GPIO_CF_CD) ? 0 : 1;
+               state->ready  = (levels & ASSABET_GPIO_CF_IRQ) ? 1 : 0;
+               state->bvd1   = (levels & ASSABET_GPIO_CF_BVD1) ? 1 : 0;
+               state->bvd2   = (levels & ASSABET_GPIO_CF_BVD2) ? 1 : 0;
+               state->wrprot = 0; /* Not available on Assabet. */
+               state->vs_3v  = 1; /* Can only apply 3.3V on Assabet. */
+               state->vs_Xv  = 0;
+       }
 }
 
 static int assabet_pcmcia_get_irq_info(struct pcmcia_irq_info *info)
index c3e4c99c72047d9338ca20b8b9bb9381d6eab038..0d7b0b4fcc3c46b336381c9af937acdeeedc83e0 100644 (file)
@@ -66,24 +66,19 @@ static int cerf_pcmcia_shutdown(void)
   return 0;
 }
 
-static int cerf_pcmcia_socket_state(struct pcmcia_state_array
-                                      *state_array){
-  unsigned long levels;
-  int i = CERF_SOCKET;
-
-  if(state_array->size<2) return -1;
-
-  levels=GPLR;
-
-  state_array->state[i].detect=((levels & GPIO_CF_CD)==0)?1:0;
-  state_array->state[i].ready=(levels & GPIO_CF_IRQ)?1:0;
-  state_array->state[i].bvd1=(levels & GPIO_CF_BVD1)?1:0;
-  state_array->state[i].bvd2=(levels & GPIO_CF_BVD2)?1:0;
-  state_array->state[i].wrprot=0;
-  state_array->state[i].vs_3v=1;
-  state_array->state[i].vs_Xv=0;
-
-  return 1;
+static void cerf_pcmcia_socket_state(int sock, struct pcmcia_state *state)
+{
+  unsigned long levels=GPLR;
+
+  if (sock == CERF_SOCKET) {
+    state->detect=((levels & GPIO_CF_CD)==0)?1:0;
+    state->ready=(levels & GPIO_CF_IRQ)?1:0;
+    state->bvd1=(levels & GPIO_CF_BVD1)?1:0;
+    state->bvd2=(levels & GPIO_CF_BVD2)?1:0;
+    state->wrprot=0;
+    state->vs_3v=1;
+    state->vs_Xv=0;
+  }
 }
 
 static int cerf_pcmcia_get_irq_info(struct pcmcia_irq_info *info){
index 57bf3aca774db3da352f549b6692c492081fbd85..8a4f07e9fc4712ff681a56b0379662b2a16d72bc 100644 (file)
@@ -88,35 +88,31 @@ static int flexanet_pcmcia_shutdown(void)
  *  Sockets in Flexanet are 3.3V only, without BVD2.
  *
  */
-static int flexanet_pcmcia_socket_state(struct pcmcia_state_array
-                                      *state_array){
-  unsigned long levels;
-
-  if (state_array->size < 2)
-    return -1;
-
-  /* Sense the GPIOs, asynchronously */
-  levels = GPLR;
-
-  /* Socket 0 */
-  state_array->state[0].detect = ((levels & GPIO_CF1_NCD)==0)?1:0;
-  state_array->state[0].ready  = (levels & GPIO_CF1_IRQ)?1:0;
-  state_array->state[0].bvd1   = (levels & GPIO_CF1_BVD1)?1:0;
-  state_array->state[0].bvd2   = 1;
-  state_array->state[0].wrprot = 0;
-  state_array->state[0].vs_3v  = 1;
-  state_array->state[0].vs_Xv  = 0;
-
-  /* Socket 1 */
-  state_array->state[1].detect = ((levels & GPIO_CF2_NCD)==0)?1:0;
-  state_array->state[1].ready  = (levels & GPIO_CF2_IRQ)?1:0;
-  state_array->state[1].bvd1   = (levels & GPIO_CF2_BVD1)?1:0;
-  state_array->state[1].bvd2   = 1;
-  state_array->state[1].wrprot = 0;
-  state_array->state[1].vs_3v  = 1;
-  state_array->state[1].vs_Xv  = 0;
-
-  return 1;
+static void flexanet_pcmcia_socket_state(int sock, struct pcmcia_state *state)
+{
+  unsigned long levels = GPLR; /* Sense the GPIOs, asynchronously */
+
+  switch (sock) {
+  case 0: /* Socket 0 */
+    state->detect = ((levels & GPIO_CF1_NCD)==0)?1:0;
+    state->ready  = (levels & GPIO_CF1_IRQ)?1:0;
+    state->bvd1   = (levels & GPIO_CF1_BVD1)?1:0;
+    state->bvd2   = 1;
+    state->wrprot = 0;
+    state->vs_3v  = 1;
+    state->vs_Xv  = 0;
+    break;
+
+  case 1: /* Socket 1 */
+    state->detect = ((levels & GPIO_CF2_NCD)==0)?1:0;
+    state->ready  = (levels & GPIO_CF2_IRQ)?1:0;
+    state->bvd1   = (levels & GPIO_CF2_BVD1)?1:0;
+    state->bvd2   = 1;
+    state->wrprot = 0;
+    state->vs_3v  = 1;
+    state->vs_Xv  = 0;
+    break;
+  }
 }
 
 
index 05cb5498ac46a6e9528ae3a18eb5a64a8a73198d..50d34e429bc47582417277b5b18f8d1c25da90ef 100644 (file)
@@ -75,34 +75,20 @@ static int freebird_pcmcia_shutdown(void)
   return 0;
 }
 
-static int freebird_pcmcia_socket_state(struct pcmcia_state_array
-                                      *state_array){
-  unsigned long levels;
-
-  if(state_array->size<2) return -1;
-
-  memset(state_array->state, 0,
-        (state_array->size)*sizeof(struct pcmcia_state));
-
-  levels = LINKUP_PRS;
+static void freebird_pcmcia_socket_state(int sock, struct pcmcia_state *state)
+{
+  unsigned long levels = LINKUP_PRS;
 //printk("LINKUP_PRS=%x\n",levels);
 
-  state_array->state[0].detect=
-    ((levels & (LINKUP_CD1 | LINKUP_CD2))==0)?1:0;
-
-  state_array->state[0].ready=(levels & LINKUP_RDY)?1:0;
-
-  state_array->state[0].bvd1=(levels & LINKUP_BVD1)?1:0;
-
-  state_array->state[0].bvd2=(levels & LINKUP_BVD2)?1:0;
-
-  state_array->state[0].wrprot=0; /* Not available on Assabet. */
-
-  state_array->state[0].vs_3v=1;  /* Can only apply 3.3V on Assabet. */
-
-  state_array->state[0].vs_Xv=0;
-
-  return 1;
+  if (sock == 0) {
+    state->detect = ((levels & (LINKUP_CD1 | LINKUP_CD2))==0)?1:0;
+    state->ready  = (levels & LINKUP_RDY)?1:0;
+    state->bvd1   = (levels & LINKUP_BVD1)?1:0;
+    state->bvd2   = (levels & LINKUP_BVD2)?1:0;
+    state->wrprot = 0; /* Not available on Assabet. */
+    state->vs_3v  = 1;  /* Can only apply 3.3V on Assabet. */
+    state->vs_Xv  = 0;
+  }
 }
 
 static int freebird_pcmcia_get_irq_info(struct pcmcia_irq_info *info){
index 1f8c6abbe63320331dfd54f09110960b72949aec..bc32508335c8be15e1e0b39946d7be4d3c2115a3 100644 (file)
@@ -292,40 +292,33 @@ sa1100_pcmcia_events(struct pcmcia_state *state,
  */
 static void sa1100_pcmcia_task_handler(void *data)
 {
-  struct pcmcia_state state[SA1100_PCMCIA_MAX_SOCK];
-  struct pcmcia_state_array state_array;
+  struct pcmcia_state state;
   unsigned int all_events;
 
   DEBUG(4, "%s(): entering PCMCIA monitoring thread\n", __FUNCTION__);
 
-  state_array.size = sa1100_pcmcia_socket_count;
-  state_array.state = state;
-
   do {
     unsigned int events;
-    int ret, i;
-
-    memset(state, 0, sizeof(state));
+    int i;
 
     DEBUG(4, "%s(): interrogating low-level PCMCIA service\n", __FUNCTION__);
 
-    ret = pcmcia_low_level->socket_state(&state_array);
-    if (ret < 0) {
-      printk(KERN_ERR "sa1100_pcmcia: unable to read socket status\n");
-      break;
-    }
-
     all_events = 0;
 
-    for (i = 0; i < state_array.size; i++, all_events |= events) {
+    for (i = 0; i < sa1100_pcmcia_socket_count; i++) {
       struct sa1100_pcmcia_socket *skt = PCMCIA_SOCKET(i);
 
-      events = sa1100_pcmcia_events(&state[i], &skt->k_state,
+      memset(&state, 0, sizeof(state));
+
+      skt->ops->socket_state(skt->nr, &state);
+
+      events = sa1100_pcmcia_events(&state, &skt->k_state,
                                    skt->cs_state.csc_mask,
                                    skt->cs_state.flags);
 
-      if (events && sa1100_pcmcia_socket[i].handler != NULL)
+      if (events && skt->handler != NULL)
        skt->handler(skt->handler_info, events);
+      all_events |= events;
     }
   } while(all_events);
 }  /* sa1100_pcmcia_task_handler() */
@@ -469,28 +462,20 @@ static int
 sa1100_pcmcia_get_status(unsigned int sock, unsigned int *status)
 {
   struct sa1100_pcmcia_socket *skt = PCMCIA_SOCKET(sock);
-  struct pcmcia_state state[SA1100_PCMCIA_MAX_SOCK];
-  struct pcmcia_state_array state_array;
+  struct pcmcia_state state;
   unsigned int stat;
 
   DEBUG(2, "%s() for sock %u\n", __FUNCTION__, skt->nr);
 
-  state_array.size = sa1100_pcmcia_socket_count;
-  state_array.state = state;
-
-  memset(state, 0, sizeof(state));
+  memset(&state, 0, sizeof(state));
 
-  if ((pcmcia_low_level->socket_state(&state_array)) < 0) {
-    printk(KERN_ERR "sa1100_pcmcia: unable to get socket status\n");
-    return -1;
-  }
+  skt->ops->socket_state(skt->nr, &state);
+  skt->k_state = state;
 
-  skt->k_state = state[sock];
-
-  stat = state[sock].detect ? SS_DETECT : 0;
-  stat |= state[sock].ready ? SS_READY  : 0;
-  stat |= state[sock].vs_3v ? SS_3VCARD : 0;
-  stat |= state[sock].vs_Xv ? SS_XVCARD : 0;
+  stat = state.detect ? SS_DETECT : 0;
+  stat |= state.ready ? SS_READY  : 0;
+  stat |= state.vs_3v ? SS_3VCARD : 0;
+  stat |= state.vs_Xv ? SS_XVCARD : 0;
 
   /* The power status of individual sockets is not available
    * explicitly from the hardware, so we just remember the state
@@ -499,11 +484,11 @@ sa1100_pcmcia_get_status(unsigned int sock, unsigned int *status)
   stat |= skt->cs_state.Vcc ? SS_POWERON : 0;
 
   if (skt->cs_state.flags & SS_IOCARD)
-    stat |= state[sock].bvd1 ? SS_STSCHG : 0;
+    stat |= state.bvd1 ? SS_STSCHG : 0;
   else {
-    if (state[sock].bvd1 == 0)
+    if (state.bvd1 == 0)
       stat |= SS_BATDEAD;
-    else if (state[sock].bvd2 == 0)
+    else if (state.bvd2 == 0)
       stat |= SS_BATWARN;
   }
 
@@ -960,24 +945,11 @@ int sa1100_register_pcmcia(struct pcmcia_low_level *ops)
        ret = ops->init(&pcmcia_init);
        if (ret < 0) {
                printk(KERN_ERR "Unable to initialize kernel PCMCIA service (%d).\n", ret);
-               if (ret == -1)
-                       ret = -EIO;
                goto out;
        }
 
        sa1100_pcmcia_socket_count = ret;
 
-       state_array.size  = ret;
-       state_array.state = state;
-
-       memset(state, 0, sizeof(state));
-
-       if (ops->socket_state(&state_array) < 0) {
-               printk(KERN_ERR "Unable to get PCMCIA status driver.\n");
-               ret = -EIO;
-               goto shutdown;
-       }
-
        cpu_clock = cpufreq_get(0);
 
        /*
@@ -1002,7 +974,6 @@ int sa1100_register_pcmcia(struct pcmcia_low_level *ops)
                skt->nr         = i;
                skt->ops        = ops;
                skt->irq        = irq_info.irq;
-               skt->k_state    = state[i];
                skt->speed_io   = SA1100_PCMCIA_IO_ACCESS;
                skt->speed_attr = SA1100_PCMCIA_5V_MEM_ACCESS;
                skt->speed_mem  = SA1100_PCMCIA_5V_MEM_ACCESS;
@@ -1015,6 +986,7 @@ int sa1100_register_pcmcia(struct pcmcia_low_level *ops)
                        goto out_err;
                }
 
+               ops->socket_state(skt->nr, &skt->k_state);
                sa1100_pcmcia_set_mecr(skt, cpu_clock);
        }
 
index d4b771b9c593af199dd8e930ca6d6d813efab7e5..45ba6c539b05e152d25215429a78066622083617 100644 (file)
@@ -31,11 +31,6 @@ struct pcmcia_state {
             vs_Xv: 1;
 };
 
-struct pcmcia_state_array {
-  unsigned int size;
-  struct pcmcia_state *state;
-};
-
 struct pcmcia_configure {
   unsigned  vcc: 8,
             vpp: 8,
@@ -53,7 +48,7 @@ struct pcmcia_irq_info {
 struct pcmcia_low_level {
   int (*init)(struct pcmcia_init *);
   int (*shutdown)(void);
-  int (*socket_state)(struct pcmcia_state_array *);
+  void (*socket_state)(int sock, struct pcmcia_state *);
   int (*get_irq_info)(struct pcmcia_irq_info *);
   int (*configure_socket)(int sock, const struct pcmcia_configure *);
 
index 918152a85767e83893cec0a4b409ea15ee9d3f4a..386e58d6e566f08e93118838a554c953908b6382 100644 (file)
@@ -72,33 +72,31 @@ static int h3600_pcmcia_shutdown(void)
        return 0;
 }
 
-static int
-h3600_pcmcia_socket_state(struct pcmcia_state_array *state)
+static void h3600_pcmcia_socket_state(int sock, struct pcmcia_state *state)
 {
-       unsigned long levels;
+       unsigned long levels = GPLR;
 
-       if (state->size < 2)
-               return -1;
+       switch (sock) {
+       case 0:
+               state->detect = levels & GPIO_H3600_PCMCIA_CD0 ? 0 : 1;
+               state->ready = levels & GPIO_H3600_PCMCIA_IRQ0 ? 1 : 0;
+               state->bvd1 = 0;
+               state->bvd2 = 0;
+               state->wrprot = 0; /* Not available on H3600. */
+               state->vs_3v = 0;
+               state->vs_Xv = 0;
+               break;
 
-       levels = GPLR;
-
-       state->state[0].detect = levels & GPIO_H3600_PCMCIA_CD0 ? 0 : 1;
-       state->state[0].ready = levels & GPIO_H3600_PCMCIA_IRQ0 ? 1 : 0;
-       state->state[0].bvd1 = 0;
-       state->state[0].bvd2 = 0;
-       state->state[0].wrprot = 0; /* Not available on H3600. */
-       state->state[0].vs_3v = 0;
-       state->state[0].vs_Xv = 0;
-
-       state->state[1].detect = levels & GPIO_H3600_PCMCIA_CD1 ? 0 : 1;
-       state->state[1].ready = levels & GPIO_H3600_PCMCIA_IRQ1 ? 1 : 0;
-       state->state[1].bvd1 = 0;
-       state->state[1].bvd2 = 0;
-       state->state[1].wrprot = 0; /* Not available on H3600. */
-       state->state[1].vs_3v = 0;
-       state->state[1].vs_Xv = 0;
-
-       return 1;
+       case 1:
+               state->detect = levels & GPIO_H3600_PCMCIA_CD1 ? 0 : 1;
+               state->ready = levels & GPIO_H3600_PCMCIA_IRQ1 ? 1 : 0;
+               state->bvd1 = 0;
+               state->bvd2 = 0;
+               state->wrprot = 0; /* Not available on H3600. */
+               state->vs_3v = 0;
+               state->vs_Xv = 0;
+               break;
+       }
 }
 
 static int h3600_pcmcia_get_irq_info(struct pcmcia_irq_info *info)
index 2127c81e62cc70ea773f5403c7e2e5a737a2c0f0..396f9581935f59623cc8438089b39211e66ecfd3 100644 (file)
@@ -57,34 +57,19 @@ static int pangolin_pcmcia_shutdown(void)
   return 0;
 }
 
-static int pangolin_pcmcia_socket_state(struct pcmcia_state_array
-                                      *state_array){
-  unsigned long levels;
-
-  if(state_array->size<2) return -1;
-
-  memset(state_array->state, 0, 
-        (state_array->size)*sizeof(struct pcmcia_state));
-
-  levels=GPLR;
-#ifndef CONFIG_SA1100_PANGOLIN_PCMCIA_IDE
-  state_array->state[1].detect=((levels & GPIO_PCMCIA_CD)==0)?1:0;
-  state_array->state[1].ready=(levels & GPIO_PCMCIA_IRQ)?1:0;
-  state_array->state[1].bvd1=1; /* Not available on Pangolin. */
-  state_array->state[1].bvd2=1; /* Not available on Pangolin. */
-  state_array->state[1].wrprot=0; /* Not available on Pangolin. */
-  state_array->state[1].vs_3v=1;  /* Can only apply 3.3V on Pangolin. */
-  state_array->state[1].vs_Xv=0;
-#else
-  state_array->state[0].detect=((levels & GPIO_PCMCIA_CD)==0)?1:0;
-  state_array->state[0].ready=(levels & GPIO_PCMCIA_IRQ)?1:0;
-  state_array->state[0].bvd1=1; /* Not available on Pangolin. */
-  state_array->state[0].bvd2=1; /* Not available on Pangolin. */
-  state_array->state[0].wrprot=0; /* Not available on Pangolin. */
-  state_array->state[0].vs_3v=0;  /* voltage level is determined by jumper setting */
-  state_array->state[0].vs_Xv=0;
-#endif
-  return 1;
+static void pangolin_pcmcia_socket_state(int sock, struct pcmcia_state *state)
+{
+  unsigned long levels = GPLR;;
+
+  if (sock == PANGOLIN_SOCK) {
+    state->detect=((levels & GPIO_PCMCIA_CD)==0)?1:0;
+    state->ready=(levels & GPIO_PCMCIA_IRQ)?1:0;
+    state->bvd1=1; /* Not available on Pangolin. */
+    state->bvd2=1; /* Not available on Pangolin. */
+    state->wrprot=0; /* Not available on Pangolin. */
+    state->vs_3v=1;  /* Can only apply 3.3V on Pangolin. */
+    state->vs_Xv=0;
+  }
 }
 
 static int pangolin_pcmcia_get_irq_info(struct pcmcia_irq_info *info){
index 226ba1d0fb5e1087a2ec7942d937058a469d5e81..7559b19dd3987b5ebc7aa8d0c6617e431fd457fd 100644 (file)
@@ -68,32 +68,31 @@ static int shannon_pcmcia_shutdown(void)
        return 0;
 }
 
-static int shannon_pcmcia_socket_state(struct pcmcia_state_array *state_array)
+static void shannon_pcmcia_socket_state(int sock, struct pcmcia_state *state)
 {
-       unsigned long levels;
-
-       memset(state_array->state, 0,
-              state_array->size * sizeof(struct pcmcia_state));
-
-       levels = GPLR;
-
-       state_array->state[0].detect = (levels & SHANNON_GPIO_EJECT_0) ? 0 : 1;
-       state_array->state[0].ready  = (levels & SHANNON_GPIO_RDY_0) ? 1 : 0;
-       state_array->state[0].wrprot = 0; /* Not available on Shannon. */
-       state_array->state[0].bvd1 = 1; 
-       state_array->state[0].bvd2 = 1; 
-       state_array->state[0].vs_3v  = 1; /* FIXME Can only apply 3.3V on Shannon. */
-       state_array->state[0].vs_Xv  = 0;
-
-       state_array->state[1].detect = (levels & SHANNON_GPIO_EJECT_1) ? 0 : 1;
-       state_array->state[1].ready  = (levels & SHANNON_GPIO_RDY_1) ? 1 : 0;
-       state_array->state[1].wrprot = 0; /* Not available on Shannon. */
-       state_array->state[1].bvd1 = 1; 
-       state_array->state[1].bvd2 = 1; 
-       state_array->state[1].vs_3v  = 1; /* FIXME Can only apply 3.3V on Shannon. */
-       state_array->state[1].vs_Xv  = 0;
-
-       return 1;
+       unsigned long levels = GPLR;
+
+       switch (sock) {
+       case 0:
+               state->detect = (levels & SHANNON_GPIO_EJECT_0) ? 0 : 1;
+               state->ready  = (levels & SHANNON_GPIO_RDY_0) ? 1 : 0;
+               state->wrprot = 0; /* Not available on Shannon. */
+               state->bvd1   = 1; 
+               state->bvd2   = 1; 
+               state->vs_3v  = 1; /* FIXME Can only apply 3.3V on Shannon. */
+               state->vs_Xv  = 0;
+               break;
+
+       case 1:
+               state->detect = (levels & SHANNON_GPIO_EJECT_1) ? 0 : 1;
+               state->ready  = (levels & SHANNON_GPIO_RDY_1) ? 1 : 0;
+               state->wrprot = 0; /* Not available on Shannon. */
+               state->bvd1   = 1; 
+               state->bvd2   = 1; 
+               state->vs_3v  = 1; /* FIXME Can only apply 3.3V on Shannon. */
+               state->vs_Xv  = 0;
+               break;
+       }
 }
 
 static int shannon_pcmcia_get_irq_info(struct pcmcia_irq_info *info)
index 060cbad125cbf236dd3b738a81e6d7bae8f073b3..92ca8f46f4774db5288a05ed501b1064a23189d0 100644 (file)
@@ -58,39 +58,26 @@ static int simpad_pcmcia_shutdown(void)
   return 0;
 }
 
-static int simpad_pcmcia_socket_state(struct pcmcia_state_array
-                                      *state_array)
+static void simpad_pcmcia_socket_state(int sock, struct pcmcia_state *state)
 {
-  unsigned long levels;
-  unsigned long *cs3reg = CS3_BASE;
-
-  if(state_array->size<2) return -1;
-
-  memset(state_array->state, 0, 
-        (state_array->size)*sizeof(struct pcmcia_state));
-
-  levels=GPLR;
-
-  state_array->state[1].detect=((levels & GPIO_CF_CD)==0)?1:0;
-
-  state_array->state[1].ready=(levels & GPIO_CF_IRQ)?1:0;
-
-  state_array->state[1].bvd1=1; /* Not available on Simpad. */
-
-  state_array->state[1].bvd2=1; /* Not available on Simpad. */
-
-  state_array->state[1].wrprot=0; /* Not available on Simpad. */
-
+  if (sock == 1) {
+    unsigned long levels = GPLR;
+    unsigned long *cs3reg = CS3_BASE;
+
+    state->detect=((levels & GPIO_CF_CD)==0)?1:0;
+    state->ready=(levels & GPIO_CF_IRQ)?1:0;
+    state->bvd1=1; /* Not available on Simpad. */
+    state->bvd2=1; /* Not available on Simpad. */
+    state->wrprot=0; /* Not available on Simpad. */
   
-  if((*cs3reg & 0x0c) == 0x0c) {
-    state_array->state[1].vs_3v=0;
-    state_array->state[1].vs_Xv=0;
-  } else
-  {
-    state_array->state[1].vs_3v=1;
-    state_array->state[1].vs_Xv=0;
+    if((*cs3reg & 0x0c) == 0x0c) {
+      state->vs_3v=0;
+      state->vs_Xv=0;
+    } else {
+      state->vs_3v=1;
+      state->vs_Xv=0;
+    }
   }
-  return 1;
 }
 
 static int simpad_pcmcia_get_irq_info(struct pcmcia_irq_info *info){
index e3fa3c328a12cb5bd522814b54047538435c03b2..1dea8cbccbfa6b43e3ee7fee5663bc05161ae394 100644 (file)
@@ -87,36 +87,35 @@ static int stork_pcmcia_shutdown(void)
         return 0;
 }
 
-static int stork_pcmcia_socket_state(struct pcmcia_state_array *state_array)
+static void stork_pcmcia_socket_state(int sock, struct pcmcia_state *state)
 {
-        unsigned long levels;
+        unsigned long levels = GPLR;
 
-        if(state_array->size<2) return -1;
-
-        memset(state_array->state, 0, 
-               (state_array->size)*sizeof(struct pcmcia_state));
+       if (debug > 1)
+               printk(__FUNCTION__ " GPLR=%x IRQ[1:0]=%x\n", levels,
+                       (levels & (GPIO_STORK_PCMCIA_A_RDY|GPIO_STORK_PCMCIA_B_RDY)));
 
-        levels=GPLR;
+       switch (sock) {
+       case 0:
+               state->detect=((levels & GPIO_STORK_PCMCIA_A_CARD_DETECT)==0)?1:0;
+               state->ready=(levels & GPIO_STORK_PCMCIA_A_RDY)?1:0;
+               state->bvd1= 1;
+               state->bvd2= 1;
+               state->wrprot=0;
+               state->vs_3v=1;
+               state->vs_Xv=0;
+               break;
 
-       if (debug > 1)
-               printk(__FUNCTION__ " GPLR=%x IRQ[1:0]=%x\n", GPLR, (GPLR & (GPIO_STORK_PCMCIA_A_RDY|GPIO_STORK_PCMCIA_B_RDY)));
-       state_array->state[0].detect=((levels & GPIO_STORK_PCMCIA_A_CARD_DETECT)==0)?1:0;
-       state_array->state[0].ready=(levels & GPIO_STORK_PCMCIA_A_RDY)?1:0;
-       state_array->state[0].bvd1= 1;
-       state_array->state[0].bvd2= 1;
-       state_array->state[0].wrprot=0;
-       state_array->state[0].vs_3v=1;
-       state_array->state[0].vs_Xv=0;
-
-       state_array->state[1].detect=((levels & GPIO_STORK_PCMCIA_B_CARD_DETECT)==0)?1:0;
-       state_array->state[1].ready=(levels & GPIO_STORK_PCMCIA_B_RDY)?1:0;
-       state_array->state[1].bvd1=1;
-       state_array->state[1].bvd2=1;
-       state_array->state[1].wrprot=0;
-       state_array->state[1].vs_3v=1;
-       state_array->state[1].vs_Xv=0;
-
-        return 1;
+       case 1:
+               state->detect=((levels & GPIO_STORK_PCMCIA_B_CARD_DETECT)==0)?1:0;
+               state->ready=(levels & GPIO_STORK_PCMCIA_B_RDY)?1:0;
+               state->bvd1=1;
+               state->bvd2=1;
+               state->wrprot=0;
+               state->vs_3v=1;
+               state->vs_Xv=0;
+               break;
+       }
 }
 
 static int stork_pcmcia_get_irq_info(struct pcmcia_irq_info *info)
index d2a4dd7099b64c419a1e92d008a25b66cf0ba7ee..3ed835b6e789b58c5c60780aa2f5cfb272fe0972 100644 (file)
@@ -66,40 +66,36 @@ int system3_pcmcia_configure_socket(int sock, const struct pcmcia_configure *con
        return sa1111_pcmcia_configure_socket(sock, conf);
 }
 
-static int system3_pcmcia_socket_state(struct pcmcia_state_array
-               *state)
+static void system3_pcmcia_socket_state(int sock, struct pcmcia_state *state)
 {
-       unsigned long   status          = 0;
-
-       if(state->size<2) return -1;
-
-       memset(state->state, 0,
-                       (state->size)*sizeof(struct pcmcia_state));
-
-       status=PCSR;
+       unsigned long status = PCSR;
 
+       switch (sock) {
 #if 0 /* PCMCIA socket not yet connected */
-       state->state[0].detect = status & PCSR_S0_DETECT ? 0 : 1;
-       state->state[0].ready  = status & PCSR_S0_READY  ? 1 : 0;
-       state->state[0].bvd1   = status & PCSR_S0_BVD1   ? 1 : 0;
-       state->state[0].bvd2   = 1;
-       state->state[0].wrprot = status & PCSR_S0_WP     ? 1 : 0;
-       state->state[0].vs_3v  = 1;
-       state->state[0].vs_Xv  = 0;
+       case 0:
+               state->detect = status & PCSR_S0_DETECT ? 0 : 1;
+               state->ready  = status & PCSR_S0_READY  ? 1 : 0;
+               state->bvd1   = status & PCSR_S0_BVD1   ? 1 : 0;
+               state->bvd2   = 1;
+               state->wrprot = status & PCSR_S0_WP     ? 1 : 0;
+               state->vs_3v  = 1;
+               state->vs_Xv  = 0;
+               break;
 #endif
 
-       state->state[1].detect = status & PCSR_S1_DETECT ? 0 : 1;
-       state->state[1].ready  = status & PCSR_S1_READY  ? 1 : 0;
-       state->state[1].bvd1   = status & PCSR_S1_BVD1   ? 1 : 0;
-       state->state[1].bvd2   = 1;
-       state->state[1].wrprot = status & PCSR_S1_WP     ? 1 : 0;
-       state->state[1].vs_3v  = 1;
-       state->state[1].vs_Xv  = 0;
-
-       DPRINTK( "PCSR=0x%08lx, S1_RDY_nIREQ=%d\n", status,
-                       state->state[1].ready );
-
-       return 1;
+       case 1:
+               state->detect = status & PCSR_S1_DETECT ? 0 : 1;
+               state->ready  = status & PCSR_S1_READY  ? 1 : 0;
+               state->bvd1   = status & PCSR_S1_BVD1   ? 1 : 0;
+               state->bvd2   = 1;
+               state->wrprot = status & PCSR_S1_WP     ? 1 : 0;
+               state->vs_3v  = 1;
+               state->vs_Xv  = 0;
+               break;
+       }
+
+       DPRINTK("Sock %d PCSR=0x%08lx, Sx_RDY_nIREQ=%d\n",
+               sock, status, state->ready);
 }
 
 struct pcmcia_low_level system3_pcmcia_ops = {
index 7bc836ba579451921cceedc4af9aea5afb67d1f8..84c3947928c9051823f4b16d0250484a8453ad28 100644 (file)
@@ -79,26 +79,19 @@ static int trizeps_pcmcia_shutdown(void)
  *
 
  ******************************************************/
-static int trizeps_pcmcia_socket_state(struct pcmcia_state_array
-                                      *state_array){
-       unsigned long levels;
-
-       if (state_array->size < NUMBER_OF_TRIZEPS_PCMCIA_SLOTS) return -1;
-
-       memset(state_array->state, 0,
-              (state_array->size)*sizeof(struct pcmcia_state));
-
-       levels = GPLR;
-
-       state_array->state[0].detect = ((levels & GPIO_GPIO(TRIZEPS_GPIO_PCMCIA_CD0)) == 0) ? 1 : 0;
-       state_array->state[0].ready  = ((levels & GPIO_GPIO(TRIZEPS_GPIO_PCMCIA_IRQ0)) != 0) ? 1 : 0;
-       state_array->state[0].bvd1   = ((TRIZEPS_BCR1 & TRIZEPS_PCM_BVD1) !=0 ) ? 1 : 0;
-       state_array->state[0].bvd2   = ((TRIZEPS_BCR1 & TRIZEPS_PCM_BVD2) != 0) ? 1 : 0;
-       state_array->state[0].wrprot = 0; // not write protected
-       state_array->state[0].vs_3v  = ((TRIZEPS_BCR1 & TRIZEPS_nPCM_VS1) == 0) ? 1 : 0; //VS1=0 -> vs_3v=1
-       state_array->state[0].vs_Xv  = ((TRIZEPS_BCR1 & TRIZEPS_nPCM_VS2) == 0) ? 1 : 0; //VS2=0 -> vs_Xv=1
-
-       return 1;  // success
+static void trizeps_pcmcia_socket_state(int sock, struct pcmcia_state *state_array)
+{
+       unsigned long levels = GPLR;
+
+       if (sock == 0) {
+               state->detect = ((levels & GPIO_GPIO(TRIZEPS_GPIO_PCMCIA_CD0)) == 0) ? 1 : 0;
+               state->ready  = ((levels & GPIO_GPIO(TRIZEPS_GPIO_PCMCIA_IRQ0)) != 0) ? 1 : 0;
+               state->bvd1   = ((TRIZEPS_BCR1 & TRIZEPS_PCM_BVD1) !=0 ) ? 1 : 0;
+               state->bvd2   = ((TRIZEPS_BCR1 & TRIZEPS_PCM_BVD2) != 0) ? 1 : 0;
+               state->wrprot = 0; // not write protected
+               state->vs_3v  = ((TRIZEPS_BCR1 & TRIZEPS_nPCM_VS1) == 0) ? 1 : 0; //VS1=0 -> vs_3v=1
+               state->vs_Xv  = ((TRIZEPS_BCR1 & TRIZEPS_nPCM_VS2) == 0) ? 1 : 0; //VS2=0 -> vs_Xv=1
+       }
 }
 
 /**
index 4cca5952188ebfcbeedcb0ac1571b7a01728fa1f..d8dfa6bb56362fccd1af9a5eac4f2b5d2fff25e0 100644 (file)
@@ -80,27 +80,19 @@ static int yopy_pcmcia_shutdown(void)
        return 0;
 }
 
-static int yopy_pcmcia_socket_state(struct pcmcia_state_array *state_array)
+static void yopy_pcmcia_socket_state(int sock, struct pcmcia_state_array *state)
 {
-       unsigned long levels;
-
-       if (state_array->size != 1)
-               return -1;
-
-       memset(state_array->state, 0,
-              state_array->size * sizeof(struct pcmcia_state));
-
-       levels = GPLR;
-
-       state_array->state[0].detect = (levels & GPIO_CF_CD)    ? 0 : 1;
-       state_array->state[0].ready  = (levels & GPIO_CF_READY) ? 1 : 0;
-       state_array->state[0].bvd1   = (levels & GPIO_CF_BVD1)  ? 1 : 0;
-       state_array->state[0].bvd2   = (levels & GPIO_CF_BVD2)  ? 1 : 0;
-       state_array->state[0].wrprot = 0; /* Not available on Yopy. */
-       state_array->state[0].vs_3v  = 0; /* FIXME Can only apply 3.3V on Yopy. */
-       state_array->state[0].vs_Xv  = 0;
-
-       return 1;
+       unsigned long levels = GPLR;
+
+       if (sock == 0) {
+               state->detect = (levels & GPIO_CF_CD)    ? 0 : 1;
+               state->ready  = (levels & GPIO_CF_READY) ? 1 : 0;
+               state->bvd1   = (levels & GPIO_CF_BVD1)  ? 1 : 0;
+               state->bvd2   = (levels & GPIO_CF_BVD2)  ? 1 : 0;
+               state->wrprot = 0; /* Not available on Yopy. */
+               state->vs_3v  = 0; /* FIXME Can only apply 3.3V on Yopy. */
+               state->vs_Xv  = 0;
+       }
 }
 
 static int yopy_pcmcia_get_irq_info(struct pcmcia_irq_info *info)
index ab95d450441b70f58d498d4526229ac378d400d6..3202ee37d27665c738e4b371858ff8b50ebb570e 100644 (file)
@@ -63,32 +63,31 @@ int sa1111_pcmcia_shutdown(void)
        return 0;
 }
 
-int sa1111_pcmcia_socket_state(struct pcmcia_state_array *state)
+void sa1111_pcmcia_socket_state(int sock, struct pcmcia_state *state)
 {
-       unsigned long status;
+       unsigned long status = sa1111_readl(pcmcia->mapbase + SA1111_PCSR);
 
-       if (state->size < 2)
-               return -1;
+       switch (sock) {
+       case 0:
+               state->detect = status & PCSR_S0_DETECT ? 0 : 1;
+               state->ready  = status & PCSR_S0_READY  ? 1 : 0;
+               state->bvd1   = status & PCSR_S0_BVD1   ? 1 : 0;
+               state->bvd2   = status & PCSR_S0_BVD2   ? 1 : 0;
+               state->wrprot = status & PCSR_S0_WP     ? 1 : 0;
+               state->vs_3v  = status & PCSR_S0_VS1    ? 0 : 1;
+               state->vs_Xv  = status & PCSR_S0_VS2    ? 0 : 1;
+               break;
 
-       status = sa1111_readl(pcmcia->mapbase + SA1111_PCSR);
-
-       state->state[0].detect = status & PCSR_S0_DETECT ? 0 : 1;
-       state->state[0].ready  = status & PCSR_S0_READY  ? 1 : 0;
-       state->state[0].bvd1   = status & PCSR_S0_BVD1   ? 1 : 0;
-       state->state[0].bvd2   = status & PCSR_S0_BVD2   ? 1 : 0;
-       state->state[0].wrprot = status & PCSR_S0_WP     ? 1 : 0;
-       state->state[0].vs_3v  = status & PCSR_S0_VS1    ? 0 : 1;
-       state->state[0].vs_Xv  = status & PCSR_S0_VS2    ? 0 : 1;
-
-       state->state[1].detect = status & PCSR_S1_DETECT ? 0 : 1;
-       state->state[1].ready  = status & PCSR_S1_READY  ? 1 : 0;
-       state->state[1].bvd1   = status & PCSR_S1_BVD1   ? 1 : 0;
-       state->state[1].bvd2   = status & PCSR_S1_BVD2   ? 1 : 0;
-       state->state[1].wrprot = status & PCSR_S1_WP     ? 1 : 0;
-       state->state[1].vs_3v  = status & PCSR_S1_VS1    ? 0 : 1;
-       state->state[1].vs_Xv  = status & PCSR_S1_VS2    ? 0 : 1;
-
-       return 1;
+       case 1:
+               state->detect = status & PCSR_S1_DETECT ? 0 : 1;
+               state->ready  = status & PCSR_S1_READY  ? 1 : 0;
+               state->bvd1   = status & PCSR_S1_BVD1   ? 1 : 0;
+               state->bvd2   = status & PCSR_S1_BVD2   ? 1 : 0;
+               state->wrprot = status & PCSR_S1_WP     ? 1 : 0;
+               state->vs_3v  = status & PCSR_S1_VS1    ? 0 : 1;
+               state->vs_Xv  = status & PCSR_S1_VS2    ? 0 : 1;
+               break;
+       }
 }
 
 int sa1111_pcmcia_get_irq_info(struct pcmcia_irq_info *info)
index 359978214675b782b8302fb42bfa29352125495e..f93c7f068cac24de5e66b0dd42ecbe440c103310 100644 (file)
@@ -1,6 +1,6 @@
 extern int sa1111_pcmcia_init(struct pcmcia_init *);
 extern int sa1111_pcmcia_shutdown(void);
-extern int sa1111_pcmcia_socket_state(struct pcmcia_state_array *);
+extern void sa1111_pcmcia_socket_state(int sock, struct pcmcia_state *);
 extern int sa1111_pcmcia_get_irq_info(struct pcmcia_irq_info *);
 extern int sa1111_pcmcia_configure_socket(int sock, const struct pcmcia_configure *);
 extern int sa1111_pcmcia_socket_init(int);