lkml.org 
[lkml]   [2006]   [Jun]   [23]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    Date
    From
    SubjectRe: [PATCH 07/21] [MMC] Correct register order
    New version to fix conflicts by recent merge.

    [MMC] Correct register order

    The sdhci specification states that some registers must be written to in a
    specific order.

    Signed-off-by: Pierre Ossman <drzeus@drzeus.cx>
    ---

    drivers/mmc/sdhci.c | 44 +++++++++++++++++++++++++++-----------------
    1 files changed, 27 insertions(+), 17 deletions(-)

    diff --git a/drivers/mmc/sdhci.c b/drivers/mmc/sdhci.c
    index 877226e..4457881 100644
    --- a/drivers/mmc/sdhci.c
    +++ b/drivers/mmc/sdhci.c
    @@ -270,16 +270,13 @@ static void sdhci_transfer_pio(struct sd

    static void sdhci_prepare_data(struct sdhci_host *host, struct mmc_data *data)
    {
    - u16 mode;
    u8 count;
    unsigned target_timeout, current_timeout;

    WARN_ON(host->data);

    - if (data == NULL) {
    - writew(0, host->ioaddr + SDHCI_TRANSFER_MODE);
    + if (data == NULL)
    return;
    - }

    DBG("blksz %04x blks %04x flags %08x\n",
    data->blksz, data->blocks, data->flags);
    @@ -317,19 +314,6 @@ static void sdhci_prepare_data(struct sd

    writeb(count, host->ioaddr + SDHCI_TIMEOUT_CONTROL);

    - mode = SDHCI_TRNS_BLK_CNT_EN;
    - if (data->blocks > 1)
    - mode |= SDHCI_TRNS_MULTI;
    - if (data->flags & MMC_DATA_READ)
    - mode |= SDHCI_TRNS_READ;
    - if (host->flags & SDHCI_USE_DMA)
    - mode |= SDHCI_TRNS_DMA;
    -
    - writew(mode, host->ioaddr + SDHCI_TRANSFER_MODE);
    -
    - writew(data->blksz, host->ioaddr + SDHCI_BLOCK_SIZE);
    - writew(data->blocks, host->ioaddr + SDHCI_BLOCK_COUNT);
    -
    if (host->flags & SDHCI_USE_DMA) {
    int count;

    @@ -347,6 +331,30 @@ static void sdhci_prepare_data(struct sd
    host->offset = 0;
    host->remain = host->cur_sg->length;
    }
    +
    + writew(data->blksz, host->ioaddr + SDHCI_BLOCK_SIZE);
    + writew(data->blocks, host->ioaddr + SDHCI_BLOCK_COUNT);
    +}
    +
    +static void sdhci_set_transfer_mode(struct sdhci_host *host,
    + struct mmc_data *data)
    +{
    + u16 mode;
    +
    + WARN_ON(host->data);
    +
    + if (data == NULL)
    + return;
    +
    + mode = SDHCI_TRNS_BLK_CNT_EN;
    + if (data->blocks > 1)
    + mode |= SDHCI_TRNS_MULTI;
    + if (data->flags & MMC_DATA_READ)
    + mode |= SDHCI_TRNS_READ;
    + if (host->flags & SDHCI_USE_DMA)
    + mode |= SDHCI_TRNS_DMA;
    +
    + writew(mode, host->ioaddr + SDHCI_TRANSFER_MODE);
    }

    static void sdhci_finish_data(struct sdhci_host *host)
    @@ -447,6 +455,8 @@ static void sdhci_send_command(struct sd

    writel(cmd->arg, host->ioaddr + SDHCI_ARGUMENT);

    + sdhci_set_transfer_mode(host, cmd->data);
    +
    if ((cmd->flags & MMC_RSP_136) && (cmd->flags & MMC_RSP_BUSY)) {
    printk(KERN_ERR "%s: Unsupported response type! "
    "Please report this to " BUGMAIL ".\n",
    \
     
     \ /
      Last update: 2006-06-23 18:05    [W:0.023 / U:155.020 seconds]
    ©2003-2016 Jasper Spaans. hosted at Digital OceanAdvertise on this site