Merge branch 'char-misc-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/gregk...
[pandora-kernel.git] / drivers / mmc / host / sdhci-of-esdhc.c
index fe604df..59e9d00 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * Freescale eSDHC controller driver.
  *
- * Copyright (c) 2007 Freescale Semiconductor, Inc.
+ * Copyright (c) 2007, 2010 Freescale Semiconductor, Inc.
  * Copyright (c) 2009 MontaVista Software, Inc.
  *
  * Authors: Xiaobo Xie <X.Xie@freescale.com>
@@ -15,6 +15,7 @@
 
 #include <linux/io.h>
 #include <linux/delay.h>
+#include <linux/module.h>
 #include <linux/mmc/host.h>
 #include "sdhci-pltfm.h"
 #include "sdhci-esdhc.h"
 static u16 esdhc_readw(struct sdhci_host *host, int reg)
 {
        u16 ret;
+       int base = reg & ~0x3;
+       int shift = (reg & 0x2) * 8;
 
        if (unlikely(reg == SDHCI_HOST_VERSION))
-               ret = in_be16(host->ioaddr + reg);
+               ret = in_be32(host->ioaddr + base) & 0xffff;
        else
-               ret = sdhci_be32bs_readw(host, reg);
+               ret = (in_be32(host->ioaddr + base) >> shift) & 0xffff;
+       return ret;
+}
+
+static u8 esdhc_readb(struct sdhci_host *host, int reg)
+{
+       int base = reg & ~0x3;
+       int shift = (reg & 0x3) * 8;
+       u8 ret = (in_be32(host->ioaddr + base) >> shift) & 0xff;
        return ret;
 }
 
@@ -74,7 +85,7 @@ static unsigned int esdhc_of_get_min_clock(struct sdhci_host *host)
 static struct sdhci_ops sdhci_esdhc_ops = {
        .read_l = sdhci_be32bs_readl,
        .read_w = esdhc_readw,
-       .read_b = sdhci_be32bs_readb,
+       .read_b = esdhc_readb,
        .write_l = sdhci_be32bs_writel,
        .write_w = esdhc_writew,
        .write_b = esdhc_writeb,