forked from Minki/linux
tifm_7xx1: improve card detection routine
Remove unneeded conditions and change a sleeping regime a little in the card type detection routine. Signed-off-by: Alex Dubov <oakad@yahoo.com> Signed-off-by: Pierre Ossman <drzeus@drzeus.cx>
This commit is contained in:
parent
3540af8ffd
commit
342c0ec485
@ -75,48 +75,46 @@ static irqreturn_t tifm_7xx1_isr(int irq, void *dev_id)
|
|||||||
return IRQ_HANDLED;
|
return IRQ_HANDLED;
|
||||||
}
|
}
|
||||||
|
|
||||||
static unsigned char tifm_7xx1_toggle_sock_power(char __iomem *sock_addr,
|
static unsigned char tifm_7xx1_toggle_sock_power(char __iomem *sock_addr)
|
||||||
int is_x2)
|
|
||||||
{
|
{
|
||||||
unsigned int s_state;
|
unsigned int s_state;
|
||||||
int cnt;
|
int cnt;
|
||||||
|
|
||||||
writel(0x0e00, sock_addr + SOCK_CONTROL);
|
writel(0x0e00, sock_addr + SOCK_CONTROL);
|
||||||
|
|
||||||
for (cnt = 0; cnt < 100; cnt++) {
|
for (cnt = 16; cnt <= 256; cnt <<= 1) {
|
||||||
if (!(TIFM_SOCK_STATE_POWERED
|
if (!(TIFM_SOCK_STATE_POWERED
|
||||||
& readl(sock_addr + SOCK_PRESENT_STATE)))
|
& readl(sock_addr + SOCK_PRESENT_STATE)))
|
||||||
break;
|
break;
|
||||||
msleep(10);
|
|
||||||
|
msleep(cnt);
|
||||||
}
|
}
|
||||||
|
|
||||||
s_state = readl(sock_addr + SOCK_PRESENT_STATE);
|
s_state = readl(sock_addr + SOCK_PRESENT_STATE);
|
||||||
if (!(TIFM_SOCK_STATE_OCCUPIED & s_state))
|
if (!(TIFM_SOCK_STATE_OCCUPIED & s_state))
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
if (is_x2) {
|
writel(readl(sock_addr + SOCK_CONTROL) | TIFM_CTRL_LED,
|
||||||
writel((s_state & 7) | 0x0c00, sock_addr + SOCK_CONTROL);
|
sock_addr + SOCK_CONTROL);
|
||||||
} else {
|
|
||||||
// SmartMedia cards need extra 40 msec
|
|
||||||
if (((readl(sock_addr + SOCK_PRESENT_STATE) >> 4) & 7) == 1)
|
|
||||||
msleep(40);
|
|
||||||
writel(readl(sock_addr + SOCK_CONTROL) | TIFM_CTRL_LED,
|
|
||||||
sock_addr + SOCK_CONTROL);
|
|
||||||
msleep(10);
|
|
||||||
writel((s_state & 0x7) | 0x0c00 | TIFM_CTRL_LED,
|
|
||||||
sock_addr + SOCK_CONTROL);
|
|
||||||
}
|
|
||||||
|
|
||||||
for (cnt = 0; cnt < 100; cnt++) {
|
/* xd needs some extra time before power on */
|
||||||
|
if (((readl(sock_addr + SOCK_PRESENT_STATE) >> 4) & 7)
|
||||||
|
== TIFM_TYPE_XD)
|
||||||
|
msleep(40);
|
||||||
|
|
||||||
|
writel((s_state & 7) | 0x0c00, sock_addr + SOCK_CONTROL);
|
||||||
|
/* wait for power to stabilize */
|
||||||
|
msleep(20);
|
||||||
|
for (cnt = 16; cnt <= 256; cnt <<= 1) {
|
||||||
if ((TIFM_SOCK_STATE_POWERED
|
if ((TIFM_SOCK_STATE_POWERED
|
||||||
& readl(sock_addr + SOCK_PRESENT_STATE)))
|
& readl(sock_addr + SOCK_PRESENT_STATE)))
|
||||||
break;
|
break;
|
||||||
msleep(10);
|
|
||||||
|
msleep(cnt);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!is_x2)
|
writel(readl(sock_addr + SOCK_CONTROL) & (~TIFM_CTRL_LED),
|
||||||
writel(readl(sock_addr + SOCK_CONTROL) & (~TIFM_CTRL_LED),
|
sock_addr + SOCK_CONTROL);
|
||||||
sock_addr + SOCK_CONTROL);
|
|
||||||
|
|
||||||
return (readl(sock_addr + SOCK_PRESENT_STATE) >> 4) & 7;
|
return (readl(sock_addr + SOCK_PRESENT_STATE) >> 4) & 7;
|
||||||
}
|
}
|
||||||
@ -169,8 +167,7 @@ static void tifm_7xx1_switch_media(struct work_struct *work)
|
|||||||
|
|
||||||
spin_unlock_irqrestore(&fm->lock, flags);
|
spin_unlock_irqrestore(&fm->lock, flags);
|
||||||
media_id = tifm_7xx1_toggle_sock_power(
|
media_id = tifm_7xx1_toggle_sock_power(
|
||||||
tifm_7xx1_sock_addr(fm->addr, cnt),
|
tifm_7xx1_sock_addr(fm->addr, cnt));
|
||||||
fm->num_sockets == 2);
|
|
||||||
if (media_id) {
|
if (media_id) {
|
||||||
sock = tifm_alloc_device(fm);
|
sock = tifm_alloc_device(fm);
|
||||||
if (sock) {
|
if (sock) {
|
||||||
@ -258,8 +255,7 @@ static int tifm_7xx1_resume(struct pci_dev *dev)
|
|||||||
|
|
||||||
for (cnt = 0; cnt < fm->num_sockets; cnt++)
|
for (cnt = 0; cnt < fm->num_sockets; cnt++)
|
||||||
new_ids[cnt] = tifm_7xx1_toggle_sock_power(
|
new_ids[cnt] = tifm_7xx1_toggle_sock_power(
|
||||||
tifm_7xx1_sock_addr(fm->addr, cnt),
|
tifm_7xx1_sock_addr(fm->addr, cnt));
|
||||||
fm->num_sockets == 2);
|
|
||||||
spin_lock_irqsave(&fm->lock, flags);
|
spin_lock_irqsave(&fm->lock, flags);
|
||||||
fm->socket_change_set = 0;
|
fm->socket_change_set = 0;
|
||||||
for (cnt = 0; cnt < fm->num_sockets; cnt++) {
|
for (cnt = 0; cnt < fm->num_sockets; cnt++) {
|
||||||
|
Loading…
Reference in New Issue
Block a user