mmc: omap_hsmmc: add cmd23 support
authorBalaji T K <balajitk@ti.com>
Tue, 21 Jan 2014 14:24:42 +0000 (19:54 +0530)
committerChris Ball <chris@printf.net>
Tue, 4 Mar 2014 16:46:48 +0000 (11:46 -0500)
Add set block count command support for close ended multiblock read/write.

Signed-off-by: Balaji T K <balajitk@ti.com>
Signed-off-by: Chris Ball <chris@printf.net>
drivers/mmc/host/omap_hsmmc.c

index cdeca5e6fae4761a8f4d9d0073d1671df2380142..476c6a632bfc6d2a903860a608a2d0f506404eb7 100644 (file)
@@ -202,6 +202,8 @@ struct omap_mmc_of_data {
        u8 controller_flags;
 };
 
+static void omap_hsmmc_start_dma_transfer(struct omap_hsmmc_host *host);
+
 static int omap_hsmmc_card_detect(struct device *dev, int slot)
 {
        struct omap_hsmmc_host *host = dev_get_drvdata(dev);
@@ -888,11 +890,10 @@ omap_hsmmc_xfer_done(struct omap_hsmmc_host *host, struct mmc_data *data)
        else
                data->bytes_xfered = 0;
 
-       if (!data->stop) {
+       if (data->stop && (data->error || !host->mrq->sbc))
+               omap_hsmmc_start_command(host, data->stop, NULL);
+       else
                omap_hsmmc_request_done(host, data->mrq);
-               return;
-       }
-       omap_hsmmc_start_command(host, data->stop, NULL);
 }
 
 /*
@@ -903,6 +904,14 @@ omap_hsmmc_cmd_done(struct omap_hsmmc_host *host, struct mmc_command *cmd)
 {
        host->cmd = NULL;
 
+       if (host->mrq->sbc && (host->cmd == host->mrq->sbc) &&
+           !host->mrq->sbc->error) {
+               omap_hsmmc_start_dma_transfer(host);
+               omap_hsmmc_start_command(host, host->mrq->cmd,
+                                               host->mrq->data);
+               return;
+       }
+
        if (cmd->flags & MMC_RSP_PRESENT) {
                if (cmd->flags & MMC_RSP_136) {
                        /* response type 2 */
@@ -1504,6 +1513,10 @@ static void omap_hsmmc_request(struct mmc_host *mmc, struct mmc_request *req)
                mmc_request_done(mmc, req);
                return;
        }
+       if (req->sbc) {
+               omap_hsmmc_start_command(host, req->sbc, NULL);
+               return;
+       }
 
        omap_hsmmc_start_dma_transfer(host);
        omap_hsmmc_start_command(host, req->cmd, req->data);