static int neponset_pcmcia_configure_socket(struct soc_pcmcia_socket *skt, const socket_state_t *state) { struct sa1111_pcmcia_socket *s = to_skt(skt); unsigned int ncr_mask, ncr_set, pa_dwr_mask, pa_dwr_set; int ret; switch (skt->nr) { case 0: pa_dwr_mask = GPIO_A0 | GPIO_A1; ncr_mask = NCR_A0VPP | NCR_A1VPP; if (state->Vpp == 0) ncr_set = 0; else if (state->Vpp == 120) ncr_set = NCR_A1VPP; else if (state->Vpp == state->Vcc) ncr_set = NCR_A0VPP; else { printk(KERN_ERR "%s(): unrecognized VPP %u\n", __func__, state->Vpp); return -1; } break; case 1: pa_dwr_mask = GPIO_A2 | GPIO_A3; ncr_mask = 0; ncr_set = 0; if (state->Vpp != state->Vcc && state->Vpp != 0) { printk(KERN_ERR "%s(): CF slot cannot support VPP %u\n", __func__, state->Vpp); return -1; } break; default: return -1; } /* * pa_dwr_set is the mask for selecting Vcc on both sockets. * pa_dwr_mask selects which bits (and therefore socket) we change. */ switch (state->Vcc) { default: case 0: pa_dwr_set = 0; break; case 33: pa_dwr_set = GPIO_A1|GPIO_A2; break; case 50: pa_dwr_set = GPIO_A0|GPIO_A3; break; } ret = sa1111_pcmcia_configure_socket(skt, state); if (ret == 0) { neponset_ncr_frob(ncr_mask, ncr_set); sa1111_set_io(s->dev, pa_dwr_mask, pa_dwr_set); } return ret; }
static int jornada720_pcmcia_configure_socket(struct soc_pcmcia_socket *skt, const socket_state_t *state) { unsigned int pa_dwr_mask, pa_dwr_set; int ret; printk("%s(): config socket %d vcc %d vpp %d\n", __FUNCTION__, skt->nr, state->Vcc, state->Vpp); switch (skt->nr) { case 0: pa_dwr_mask = SOCKET0_POWER | SOCKET0_3V; switch (state->Vcc) { default: case 0: pa_dwr_set = 0; break; case 33: pa_dwr_set = SOCKET0_POWER | SOCKET0_3V; break; case 50: pa_dwr_set = SOCKET0_POWER; break; } break; case 1: pa_dwr_mask = SOCKET1_POWER; switch (state->Vcc) { default: case 0: pa_dwr_set = 0; break; case 33: pa_dwr_set = SOCKET1_POWER; break; case 50: pa_dwr_set = SOCKET1_POWER; break; } break; default: return -1; } if (state->Vpp != state->Vcc && state->Vpp != 0) { printk(KERN_ERR "%s(): slot cannot support VPP %u\n", __FUNCTION__, state->Vpp); return -1; } ret = sa1111_pcmcia_configure_socket(skt, state); if (ret == 0) { unsigned long flags; local_irq_save(flags); sa1111_set_io(SA1111_DEV(skt->dev), pa_dwr_mask, pa_dwr_set); local_irq_restore(flags); } return ret; }
static int badge4_pcmcia_configure_socket(struct soc_pcmcia_socket *skt, const socket_state_t *state) { int ret; switch (skt->nr) { case 0: if ((state->Vcc != 0) && (state->Vcc != badge4_pcmvcc)) { complain_about_jumpering(__func__, "pcmvcc", badge4_pcmvcc, state->Vcc); // Apply power regardless of the jumpering. // return -1; } if ((state->Vpp != 0) && (state->Vpp != badge4_pcmvpp)) { complain_about_jumpering(__func__, "pcmvpp", badge4_pcmvpp, state->Vpp); return -1; } break; case 1: if ((state->Vcc != 0) && (state->Vcc != badge4_cfvcc)) { complain_about_jumpering(__func__, "cfvcc", badge4_cfvcc, state->Vcc); return -1; } break; default: return -1; } ret = sa1111_pcmcia_configure_socket(skt, state); if (ret == 0) { unsigned long flags; int need5V; local_irq_save(flags); need5V = ((state->Vcc == 50) || (state->Vpp == 50)); badge4_set_5V(BADGE4_5V_PCMCIA_SOCK(skt->nr), need5V); local_irq_restore(flags); } return 0; }
static int jornada720_pcmcia_configure_socket(const struct pcmcia_configure *conf) { unsigned int pa_dwr_mask, pa_dwr_set; int ret; printk("%s(): config socket %d vcc %d vpp %d\n", __FUNCTION__, conf->sock, conf->vcc, conf->vpp); switch (conf->sock) { case 0: pa_dwr_mask = SOCKET0_POWER | SOCKET0_3V; switch (conf->vcc) { default: case 0: pa_dwr_set = 0; break; case 33: pa_dwr_set = SOCKET0_POWER | SOCKET0_3V; break; case 50: pa_dwr_set = SOCKET0_POWER; break; } break; case 1: pa_dwr_mask = SOCKET1_POWER; switch (conf->vcc) { default: case 0: pa_dwr_set = 0; break; case 33: pa_dwr_set = SOCKET1_POWER; break; case 50: pa_dwr_set = SOCKET1_POWER; break; } break; } if (conf->vpp != conf->vcc && conf->vpp != 0) { printk(KERN_ERR "%s(): slot cannot support VPP %u\n", __FUNCTION__, conf->vpp); return -1; } ret = sa1111_pcmcia_configure_socket(conf); if (ret == 0) { unsigned long flags; local_irq_save(flags); PA_DWR = (PA_DWR & ~pa_dwr_mask) | pa_dwr_set; local_irq_restore(flags); } return ret; }
static int graphicsmaster_pcmcia_configure_socket(const struct pcmcia_configure *conf) { unsigned int pa_dwr_mask, pa_dwr_set; int ret; switch (conf->sock) { case 0: pa_dwr_mask = GPIO_GPIO0 | GPIO_GPIO1; switch (conf->vcc) { default: case 0: pa_dwr_set = GPIO_GPIO0 | GPIO_GPIO1; break; case 33: pa_dwr_set = GPIO_GPIO1; break; case 50: pa_dwr_set = GPIO_GPIO0; break; } break; case 1: pa_dwr_mask = GPIO_GPIO2 | GPIO_GPIO3; switch (conf->vcc) { default: case 0: pa_dwr_set = GPIO_GPIO2 | GPIO_GPIO3; break; case 33: pa_dwr_set = GPIO_GPIO3; break; case 50: pa_dwr_set = GPIO_GPIO2; break; } } if (conf->vpp != conf->vcc && conf->vpp != 0) { printk(KERN_ERR "%s(): CF slot cannot support Vpp %u\n", __FUNCTION__, conf->vpp); return -1; } ret = sa1111_pcmcia_configure_socket(conf); if (ret == 0) { unsigned long flags; local_irq_save(flags); PA_DWR = (PA_DWR & ~pa_dwr_mask) | pa_dwr_set; local_irq_restore(flags); } return ret; }
static int lubbock_pcmcia_configure_socket(struct soc_pcmcia_socket *skt, const socket_state_t *state) { unsigned int pa_dwr_mask, pa_dwr_set, misc_mask, misc_set; int ret = 0; pa_dwr_mask = pa_dwr_set = misc_mask = misc_set = 0; again: switch (skt->nr) { case 0: pa_dwr_mask = GPIO_A0 | GPIO_A1 | GPIO_A2 | GPIO_A3; switch (state->Vcc) { case 0: break; case 33: pa_dwr_set |= GPIO_A3; break; case 50: pa_dwr_set |= GPIO_A2; break; default: printk(KERN_ERR "%s(): unrecognized Vcc %u\n", __func__, state->Vcc); ret = -1; } switch (state->Vpp) { case 0: break; case 120: pa_dwr_set |= GPIO_A1; break; default: if (state->Vpp == state->Vcc) pa_dwr_set |= GPIO_A0; else { printk(KERN_ERR "%s(): unrecognized Vpp %u\n", __func__, state->Vpp); ret = -1; break; } } break; case 1: misc_mask = (1 << 15) | (1 << 14); switch (state->Vcc) { case 0: break; case 33: misc_set |= 1 << 15; break; case 50: misc_set |= 1 << 14; break; default: printk(KERN_ERR "%s(): unrecognized Vcc %u\n", __func__, state->Vcc); ret = -1; break; } if (state->Vpp != state->Vcc && state->Vpp != 0) { printk(KERN_ERR "%s(): CF slot cannot support Vpp %u\n", __func__, state->Vpp); ret = -1; break; } break; default: ret = -1; } if (ret == 0) ret = sa1111_pcmcia_configure_socket(skt, state); if (ret == 0) { lubbock_set_misc_wr(misc_mask, misc_set); sa1111_set_io(SA1111_DEV(skt->dev), pa_dwr_mask, pa_dwr_set); } #if 1 if (ret == 0 && state->Vcc == 33) { struct pcmcia_state new_state; mdelay(3); sa1111_pcmcia_socket_state(skt, &new_state); if (!new_state.vs_3v && !new_state.vs_Xv) { lubbock_set_misc_wr(misc_mask, 0); sa1111_set_io(SA1111_DEV(skt->dev), pa_dwr_mask, 0); mdelay(100); ((socket_state_t *)state)->Vcc = 50; ((socket_state_t *)state)->Vpp = 50; goto again; } } #endif return ret; }
static int neponset_pcmcia_configure_socket(struct sa1100_pcmcia_socket *skt, const socket_state_t *state) { unsigned int ncr_mask, ncr_set, pa_dwr_mask, pa_dwr_set; int ret; switch (skt->nr) { case 0: pa_dwr_mask = GPIO_GPIO0 | GPIO_GPIO1; ncr_mask = NCR_A0VPP | NCR_A1VPP; if (state->Vpp == 0) ncr_set = 0; else if (state->Vpp == 120) ncr_set = NCR_A1VPP; else if (state->Vpp == state->Vcc) ncr_set = NCR_A0VPP; else { printk(KERN_ERR "%s(): unrecognized VPP %u\n", __FUNCTION__, state->Vpp); return -1; } break; case 1: pa_dwr_mask = GPIO_GPIO2 | GPIO_GPIO3; ncr_mask = 0; ncr_set = 0; if (state->Vpp != state->Vcc && state->Vpp != 0) { printk(KERN_ERR "%s(): CF slot cannot support VPP %u\n", __FUNCTION__, state->Vpp); return -1; } break; default: return -1; } /* * pa_dwr_set is the mask for selecting Vcc on both sockets. * pa_dwr_mask selects which bits (and therefore socket) we change. */ switch (state->Vcc) { default: case 0: pa_dwr_set = 0; break; case 33: pa_dwr_set = GPIO_GPIO1|GPIO_GPIO2; break; case 50: pa_dwr_set = GPIO_GPIO0|GPIO_GPIO3; break; } ret = sa1111_pcmcia_configure_socket(skt, state); if (ret == 0) { unsigned long flags; local_irq_save(flags); NCR_0 = (NCR_0 & ~ncr_mask) | ncr_set; PA_DWR = (PA_DWR & ~pa_dwr_mask) | (pa_dwr_set & pa_dwr_mask); local_irq_restore(flags); } return 0; }
static int pfs168_pcmcia_configure_socket(struct sa1100_pcmcia_socket *skt, const socket_state_t *state) { unsigned int pa_dwr_mask = 0, pa_dwr_set = 0; int ret; /* PFS168 uses the Texas Instruments TPS2211 for PCMCIA (socket 0) voltage control only, * with the following connections: * * TPS2211 PFS168 * * -VCCD0 SA-1111 GPIO A<0> * -VCCD0 SA-1111 GPIO A<1> * VPPD0 SA-1111 GPIO A<2> * VPPD0 SA-1111 GPIO A<2> * */ switch (skt->nr) { case 0: pa_dwr_mask = GPIO_GPIO0 | GPIO_GPIO1 | GPIO_GPIO2 | GPIO_GPIO3; switch (state->Vcc) { default: case 0: pa_dwr_set = 0; break; case 33: pa_dwr_set = GPIO_GPIO0; break; case 50: pa_dwr_set = GPIO_GPIO1; break; } switch (state->Vpp) { case 0: break; case 120: printk(KERN_ERR "%s(): PFS-168 does not support VPP %uV\n", __FUNCTION__, state->Vpp / 10); return -1; break; default: if (state->Vpp == state->Vcc) pa_dwr_set |= GPIO_GPIO3; else { printk(KERN_ERR "%s(): unrecognized VPP %u\n", __FUNCTION__, state->Vpp); return -1; } } break; case 1: pa_dwr_mask = 0; pa_dwr_set = 0; switch (conf->vcc) { case 0: case 33: break; case 50: printk(KERN_ERR "%s(): PFS-168 CompactFlash socket does not support VCC %uV\n", __FUNCTION__, state->Vcc / 10); return -1; default: printk(KERN_ERR "%s(): unrecognized VCC %u\n", __FUNCTION__, state->Vcc); return -1; } if (state->Vpp != state->Vcc && state->Vpp != 0) { printk(KERN_ERR "%s(): CompactFlash socket does not support VPP %uV\n" __FUNCTION__, state->Vpp / 10); return -1; } break; } ret = sa1111_pcmcia_configure_socket(skt, state); if (ret == 0) { unsigned long flags; local_irq_save(flags); PA_DWR = (PA_DWR & ~pa_dwr_mask) | pa_dwr_set; local_irq_restore(flags); } return 0; }
static int lubbock_pcmcia_configure_socket(struct soc_pcmcia_socket *skt, const socket_state_t *state) { unsigned int pa_dwr_mask, pa_dwr_set, misc_mask, misc_set; int ret = 0; pa_dwr_mask = pa_dwr_set = misc_mask = misc_set = 0; /* Lubbock uses the Maxim MAX1602, with the following connections: * * Socket 0 (PCMCIA): * MAX1602 Lubbock Register * Pin Signal * ----- ------- ---------------------- * A0VPP S0_PWR0 SA-1111 GPIO A<0> * A1VPP S0_PWR1 SA-1111 GPIO A<1> * A0VCC S0_PWR2 SA-1111 GPIO A<2> * A1VCC S0_PWR3 SA-1111 GPIO A<3> * VX VCC * VY +3.3V * 12IN +12V * CODE +3.3V Cirrus Code, CODE = High (VY) * * Socket 1 (CF): * MAX1602 Lubbock Register * Pin Signal * ----- ------- ---------------------- * A0VPP GND VPP is not connected * A1VPP GND VPP is not connected * A0VCC S1_PWR0 MISC_WR<14> * A1VCC S1_PWR1 MISC_WR<15> * VX VCC * VY +3.3V * 12IN GND VPP is not connected * CODE +3.3V Cirrus Code, CODE = High (VY) * */ again: switch (skt->nr) { case 0: pa_dwr_mask = GPIO_A0 | GPIO_A1 | GPIO_A2 | GPIO_A3; switch (state->Vcc) { case 0: /* Hi-Z */ break; case 33: /* VY */ pa_dwr_set |= GPIO_A3; break; case 50: /* VX */ pa_dwr_set |= GPIO_A2; break; default: printk(KERN_ERR "%s(): unrecognized Vcc %u\n", __FUNCTION__, state->Vcc); ret = -1; } switch (state->Vpp) { case 0: /* Hi-Z */ break; case 120: /* 12IN */ pa_dwr_set |= GPIO_A1; break; default: /* VCC */ if (state->Vpp == state->Vcc) pa_dwr_set |= GPIO_A0; else { printk(KERN_ERR "%s(): unrecognized Vpp %u\n", __FUNCTION__, state->Vpp); ret = -1; break; } } break; case 1: misc_mask = (1 << 15) | (1 << 14); switch (state->Vcc) { case 0: /* Hi-Z */ break; case 33: /* VY */ misc_set |= 1 << 15; break; case 50: /* VX */ misc_set |= 1 << 14; break; default: printk(KERN_ERR "%s(): unrecognized Vcc %u\n", __FUNCTION__, state->Vcc); ret = -1; break; } if (state->Vpp != state->Vcc && state->Vpp != 0) { printk(KERN_ERR "%s(): CF slot cannot support Vpp %u\n", __FUNCTION__, state->Vpp); ret = -1; break; } break; default: ret = -1; } if (ret == 0) ret = sa1111_pcmcia_configure_socket(skt, state); if (ret == 0) { lubbock_set_misc_wr(misc_mask, misc_set); sa1111_set_io(SA1111_DEV(skt->dev), pa_dwr_mask, pa_dwr_set); } #if 1 if (ret == 0 && state->Vcc == 33) { struct pcmcia_state new_state; /* * HACK ALERT: * We can't sense the voltage properly on Lubbock before * actually applying some power to the socket (catch 22). * Resense the socket Voltage Sense pins after applying * socket power. * * Note: It takes about 2.5ms for the MAX1602 VCC output * to rise. */ mdelay(3); sa1111_pcmcia_socket_state(skt, &new_state); if (!new_state.vs_3v && !new_state.vs_Xv) { /* * Switch to 5V, Configure socket with 5V voltage */ lubbock_set_misc_wr(misc_mask, 0); sa1111_set_io(SA1111_DEV(skt->dev), pa_dwr_mask, 0); /* * It takes about 100ms to turn off Vcc. */ mdelay(100); /* * We need to hack around the const qualifier as * well to keep this ugly workaround localized and * not force it to the rest of the code. Barf bags * avaliable in the seat pocket in front of you! */ ((socket_state_t *)state)->Vcc = 50; ((socket_state_t *)state)->Vpp = 50; goto again; } } #endif return ret; }
static int jornada720_pcmcia_configure_socket(struct soc_pcmcia_socket *skt, const socket_state_t *state) { struct sa1111_pcmcia_socket *s = to_skt(skt); unsigned int pa_dwr_mask, pa_dwr_set; int ret; #ifdef CONFIG_DEBUG_PRINTK printk(KERN_INFO "%s(): config socket %d vcc %d vpp %d\n", __func__, skt->nr, state->Vcc, state->Vpp); #else ; #endif switch (skt->nr) { case 0: pa_dwr_mask = SOCKET0_POWER | SOCKET0_3V; switch (state->Vcc) { default: case 0: pa_dwr_set = 0; break; case 33: pa_dwr_set = SOCKET0_POWER | SOCKET0_3V; break; case 50: pa_dwr_set = SOCKET0_POWER; break; } break; case 1: pa_dwr_mask = SOCKET1_POWER; switch (state->Vcc) { default: case 0: pa_dwr_set = 0; break; case 33: pa_dwr_set = SOCKET1_POWER; break; case 50: pa_dwr_set = SOCKET1_POWER; break; } break; default: return -1; } if (state->Vpp != state->Vcc && state->Vpp != 0) { printk(KERN_ERR "%s(): slot cannot support VPP %u\n", __func__, state->Vpp); return -EPERM; } ret = sa1111_pcmcia_configure_socket(skt, state); if (ret == 0) { unsigned long flags; local_irq_save(flags); sa1111_set_io(s->dev, pa_dwr_mask, pa_dwr_set); local_irq_restore(flags); } return ret; }