in db1xxx_ss.c [242:324]
static int db1x_pcmcia_configure(struct pcmcia_socket *skt,
struct socket_state_t *state)
{
struct db1x_pcmcia_sock *sock = to_db1x_socket(skt);
unsigned short cr_clr, cr_set;
unsigned int changed;
int v, p, ret;
/* card voltage setup */
cr_clr = (0xf << (sock->nr * 8)); /* clear voltage settings */
cr_set = 0;
v = p = ret = 0;
switch (state->Vcc) {
case 50:
++v;
fallthrough;
case 33:
++v;
fallthrough;
case 0:
break;
default:
printk(KERN_INFO "pcmcia%d unsupported Vcc %d\n",
sock->nr, state->Vcc);
}
switch (state->Vpp) {
case 12:
++p;
fallthrough;
case 33:
case 50:
++p;
fallthrough;
case 0:
break;
default:
printk(KERN_INFO "pcmcia%d unsupported Vpp %d\n",
sock->nr, state->Vpp);
}
/* sanity check: Vpp must be 0, 12, or Vcc */
if (((state->Vcc == 33) && (state->Vpp == 50)) ||
((state->Vcc == 50) && (state->Vpp == 33))) {
printk(KERN_INFO "pcmcia%d bad Vcc/Vpp combo (%d %d)\n",
sock->nr, state->Vcc, state->Vpp);
v = p = 0;
ret = -EINVAL;
}
/* create new voltage code */
if (sock->board_type != BOARD_TYPE_DB1300)
cr_set |= ((v << 2) | p) << (sock->nr * 8);
changed = state->flags ^ sock->old_flags;
if (changed & SS_RESET) {
if (state->flags & SS_RESET) {
set_stschg(sock, 0);
/* assert reset, disable io buffers */
cr_clr |= (1 << (7 + (sock->nr * 8)));
cr_clr |= (1 << (4 + (sock->nr * 8)));
} else {
/* de-assert reset, enable io buffers */
cr_set |= 1 << (7 + (sock->nr * 8));
cr_set |= 1 << (4 + (sock->nr * 8));
}
}
/* update PCMCIA configuration */
bcsr_mod(BCSR_PCMCIA, cr_clr, cr_set);
sock->old_flags = state->flags;
/* reset was taken away: give card time to initialize properly */
if ((changed & SS_RESET) && !(state->flags & SS_RESET)) {
msleep(500);
set_stschg(sock, 1);
}
return ret;
}