Skip to content

Commit

Permalink
tifm_sd: remove wait for power off on remove
Browse files Browse the repository at this point in the history
This wait was needed because of the mmc layer failure to wait for completion
of all outstanding commands before host removal. It should be fixed now in
the mmc layer.

Signed-off-by: Alex Dubov <oakad@yahoo.com>
Signed-off-by: Pierre Ossman <drzeus@drzeus.cx>
  • Loading branch information
Alex Dubov authored and Pierre Ossman committed May 1, 2007
1 parent b039d4a commit 592d372
Showing 1 changed file with 10 additions and 15 deletions.
25 changes: 10 additions & 15 deletions drivers/mmc/tifm_sd.c
Original file line number Diff line number Diff line change
Expand Up @@ -80,7 +80,6 @@ typedef enum {
enum {
FIFO_RDY = 0x0001, /* hardware dependent value */
EJECT = 0x0004,
EJECT_DONE = 0x0008,
CARD_BUSY = 0x0010,
OPENDRAIN = 0x0040, /* hardware dependent value */
CARD_EVENT = 0x0100, /* hardware dependent value */
Expand All @@ -99,7 +98,6 @@ struct tifm_sd {
struct tasklet_struct finish_tasklet;
struct timer_list timer;
struct mmc_request *req;
wait_queue_head_t notify;

size_t written_blocks;
size_t buffer_size;
Expand Down Expand Up @@ -738,12 +736,6 @@ static void tifm_sd_ios(struct mmc_host *mmc, struct mmc_ios *ios)
/* chip_select : maybe later */
//vdd
//power is set before probe / after remove
//I believe, power_off when already marked for eject is sufficient to
// allow removal.
if ((host->flags & EJECT) && ios->power_mode == MMC_POWER_OFF) {
host->flags |= EJECT_DONE;
wake_up_all(&host->notify);
}

spin_unlock_irqrestore(&sock->lock, flags);
}
Expand Down Expand Up @@ -854,7 +846,6 @@ static int tifm_sd_probe(struct tifm_dev *sock)
host->dev = sock;
host->timeout_jiffies = msecs_to_jiffies(1000);

init_waitqueue_head(&host->notify);
tasklet_init(&host->finish_tasklet,
no_dma ? tifm_sd_end_cmd_nodma : tifm_sd_end_cmd,
(unsigned long)host);
Expand Down Expand Up @@ -896,28 +887,32 @@ static void tifm_sd_remove(struct tifm_dev *sock)
struct tifm_sd *host = mmc_priv(mmc);
unsigned long flags;

del_timer_sync(&host->timer);
spin_lock_irqsave(&sock->lock, flags);
host->flags |= EJECT;
writel(0, sock->addr + SOCK_MMCSD_INT_ENABLE);
mmiowb();
spin_unlock_irqrestore(&sock->lock, flags);

tasklet_kill(&host->finish_tasklet);

spin_lock_irqsave(&sock->lock, flags);
host->flags |= EJECT;
if (host->req) {
writel(TIFM_FIFO_INT_SETALL,
sock->addr + SOCK_DMA_FIFO_INT_ENABLE_CLEAR);
writel(0, sock->addr + SOCK_DMA_FIFO_INT_ENABLE_SET);
host->req->cmd->error = MMC_ERR_TIMEOUT;
if (host->req->stop)
host->req->stop->error = MMC_ERR_TIMEOUT;
tasklet_schedule(&host->finish_tasklet);
}
spin_unlock_irqrestore(&sock->lock, flags);
wait_event_timeout(host->notify, host->flags & EJECT_DONE,
host->timeout_jiffies);
tasklet_kill(&host->finish_tasklet);
mmc_remove_host(mmc);
dev_dbg(&sock->dev, "after remove\n");

/* The meaning of the bit majority in this constant is unknown. */
writel(0xfff8 & readl(sock->addr + SOCK_CONTROL),
sock->addr + SOCK_CONTROL);

tifm_set_drvdata(sock, NULL);
mmc_free_host(mmc);
}

Expand Down

0 comments on commit 592d372

Please sign in to comment.