From 0960a1f6727c1999b46da2c30172106e801507d8 Mon Sep 17 00:00:00 2001 From: Russell King Date: Sun, 2 Mar 2003 19:51:33 +0000 Subject: [PATCH] [ARM] SA11x0 PCMCIA 3 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. --- drivers/pcmcia/sa1100_assabet.c | 29 ++++++------- drivers/pcmcia/sa1100_cerf.c | 31 ++++++-------- drivers/pcmcia/sa1100_flexanet.c | 54 +++++++++++------------- drivers/pcmcia/sa1100_freebird.c | 38 ++++++----------- drivers/pcmcia/sa1100_generic.c | 72 ++++++++++---------------------- drivers/pcmcia/sa1100_generic.h | 7 +--- drivers/pcmcia/sa1100_h3600.c | 46 ++++++++++---------- drivers/pcmcia/sa1100_pangolin.c | 41 ++++++------------ drivers/pcmcia/sa1100_shannon.c | 49 +++++++++++----------- drivers/pcmcia/sa1100_simpad.c | 47 ++++++++------------- drivers/pcmcia/sa1100_stork.c | 51 +++++++++++----------- drivers/pcmcia/sa1100_system3.c | 54 +++++++++++------------- drivers/pcmcia/sa1100_trizeps.c | 33 ++++++--------- drivers/pcmcia/sa1100_yopy.c | 32 ++++++-------- drivers/pcmcia/sa1111_generic.c | 45 ++++++++++---------- drivers/pcmcia/sa1111_generic.h | 2 +- 16 files changed, 259 insertions(+), 372 deletions(-) diff --git a/drivers/pcmcia/sa1100_assabet.c b/drivers/pcmcia/sa1100_assabet.c index e1b4e2bb7a99c..6566f6e0caa87 100644 --- a/drivers/pcmcia/sa1100_assabet.c +++ b/drivers/pcmcia/sa1100_assabet.c @@ -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) diff --git a/drivers/pcmcia/sa1100_cerf.c b/drivers/pcmcia/sa1100_cerf.c index c3e4c99c72047..0d7b0b4fcc3c4 100644 --- a/drivers/pcmcia/sa1100_cerf.c +++ b/drivers/pcmcia/sa1100_cerf.c @@ -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){ diff --git a/drivers/pcmcia/sa1100_flexanet.c b/drivers/pcmcia/sa1100_flexanet.c index 57bf3aca774db..8a4f07e9fc471 100644 --- a/drivers/pcmcia/sa1100_flexanet.c +++ b/drivers/pcmcia/sa1100_flexanet.c @@ -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; + } } diff --git a/drivers/pcmcia/sa1100_freebird.c b/drivers/pcmcia/sa1100_freebird.c index 05cb5498ac46a..50d34e429bc47 100644 --- a/drivers/pcmcia/sa1100_freebird.c +++ b/drivers/pcmcia/sa1100_freebird.c @@ -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){ diff --git a/drivers/pcmcia/sa1100_generic.c b/drivers/pcmcia/sa1100_generic.c index 1f8c6abbe6332..bc32508335c8b 100644 --- a/drivers/pcmcia/sa1100_generic.c +++ b/drivers/pcmcia/sa1100_generic.c @@ -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); } diff --git a/drivers/pcmcia/sa1100_generic.h b/drivers/pcmcia/sa1100_generic.h index d4b771b9c593a..45ba6c539b05e 100644 --- a/drivers/pcmcia/sa1100_generic.h +++ b/drivers/pcmcia/sa1100_generic.h @@ -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 *); diff --git a/drivers/pcmcia/sa1100_h3600.c b/drivers/pcmcia/sa1100_h3600.c index 918152a85767e..386e58d6e566f 100644 --- a/drivers/pcmcia/sa1100_h3600.c +++ b/drivers/pcmcia/sa1100_h3600.c @@ -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) diff --git a/drivers/pcmcia/sa1100_pangolin.c b/drivers/pcmcia/sa1100_pangolin.c index 2127c81e62cc7..396f9581935f5 100644 --- a/drivers/pcmcia/sa1100_pangolin.c +++ b/drivers/pcmcia/sa1100_pangolin.c @@ -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){ diff --git a/drivers/pcmcia/sa1100_shannon.c b/drivers/pcmcia/sa1100_shannon.c index 226ba1d0fb5e1..7559b19dd3987 100644 --- a/drivers/pcmcia/sa1100_shannon.c +++ b/drivers/pcmcia/sa1100_shannon.c @@ -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) diff --git a/drivers/pcmcia/sa1100_simpad.c b/drivers/pcmcia/sa1100_simpad.c index 060cbad125cbf..92ca8f46f4774 100644 --- a/drivers/pcmcia/sa1100_simpad.c +++ b/drivers/pcmcia/sa1100_simpad.c @@ -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){ diff --git a/drivers/pcmcia/sa1100_stork.c b/drivers/pcmcia/sa1100_stork.c index e3fa3c328a12c..1dea8cbccbfa6 100644 --- a/drivers/pcmcia/sa1100_stork.c +++ b/drivers/pcmcia/sa1100_stork.c @@ -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) diff --git a/drivers/pcmcia/sa1100_system3.c b/drivers/pcmcia/sa1100_system3.c index d2a4dd7099b64..3ed835b6e789b 100644 --- a/drivers/pcmcia/sa1100_system3.c +++ b/drivers/pcmcia/sa1100_system3.c @@ -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 = { diff --git a/drivers/pcmcia/sa1100_trizeps.c b/drivers/pcmcia/sa1100_trizeps.c index 7bc836ba57945..84c3947928c90 100644 --- a/drivers/pcmcia/sa1100_trizeps.c +++ b/drivers/pcmcia/sa1100_trizeps.c @@ -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 + } } /** diff --git a/drivers/pcmcia/sa1100_yopy.c b/drivers/pcmcia/sa1100_yopy.c index 4cca5952188eb..d8dfa6bb56362 100644 --- a/drivers/pcmcia/sa1100_yopy.c +++ b/drivers/pcmcia/sa1100_yopy.c @@ -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) diff --git a/drivers/pcmcia/sa1111_generic.c b/drivers/pcmcia/sa1111_generic.c index ab95d450441b7..3202ee37d2766 100644 --- a/drivers/pcmcia/sa1111_generic.c +++ b/drivers/pcmcia/sa1111_generic.c @@ -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) diff --git a/drivers/pcmcia/sa1111_generic.h b/drivers/pcmcia/sa1111_generic.h index 359978214675b..f93c7f068cac2 100644 --- a/drivers/pcmcia/sa1111_generic.h +++ b/drivers/pcmcia/sa1111_generic.h @@ -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); -- 2.53.0