Hi Will, On Sun, Dec 12, 2010 at 10:57:44AM +0000, Will Newton wrote: > > drivers/mmc/host/dw_mmc.c: In function âdw_mci_pull_data64â: > > drivers/mmc/host/dw_mmc.c:998: error: implicit declaration of function â__raw_readqâ > > > > because arch/arm doesn't implement raw versions of these 64-bit accesses. > > I'm surprised that this driver hasn't been compiled on ARM before! ÂWhat > > That particular bit of code has been added since it was last built for > arm. Our architecture can do 64bit accesses so we implement readq. > Unfortunately there doesn't seem to be a sane way to conditionalize > code for architectures that have or don't have readq, so I suspect > I'll have to just remove that branch of the if statement for now. (Russell, thanks for the excellent explanation.) Other drivers (MTD, gpio/basic_mmio_gpio.c, fs/fuse, pcm_oss.c) conditionalize uses of {read,write}q on BITS_PER_LONG >= 64, so something like this: diff --git a/drivers/mmc/host/dw_mmc.c b/drivers/mmc/host/dw_mmc.c index 7de6b42..526b5cb 100644 --- a/drivers/mmc/host/dw_mmc.c +++ b/drivers/mmc/host/dw_mmc.c @@ -988,10 +988,11 @@ static void dw_mci_pull_data32(struct dw_mci *host, void *buf, int cnt) *pData++ = mci_readl(host, DATA); cnt--; } } +#if BITS_PER_LONG >= 64 static void dw_mci_push_data64(struct dw_mci *host, void *buf, int cnt) { u64 *pData = (u64 *)buf; WARN_ON(cnt % 8 != 0); @@ -1013,10 +1014,11 @@ static void dw_mci_pull_data64(struct dw_mci *host, void *buf, int cnt) while (cnt > 0) { *pData++ = mci_readq(host, DATA); cnt--; } } +#endif static void dw_mci_read_data_pio(struct dw_mci *host) { struct scatterlist *sg = host->sg; void *buf = sg_virt(sg); @@ -1591,15 +1593,17 @@ static int dw_mci_probe(struct platform_device *pdev) if (!i) { host->push_data = dw_mci_push_data16; host->pull_data = dw_mci_pull_data16; width = 16; host->data_shift = 1; +#if BITS_PER_LONG >= 64 } else if (i == 2) { host->push_data = dw_mci_push_data64; host->pull_data = dw_mci_pull_data64; width = 64; host->data_shift = 3; +#endif } else { /* Check for a reserved value, and warn if it is */ WARN((i != 1), "HCON reports a reserved host data width!\n" "Defaulting to 32-bit access.\n"); This is only useful if you just want the driver to compile (it compiles on ARM after the above) and don't expect a working device if you find the HCON programmed with 64-bit width on an ARM board, though. Thanks, -- Chris Ball <cjb@xxxxxxxxxx> <http://printf.net/> One Laptop Per Child -- To unsubscribe from this list: send the line "unsubscribe linux-mmc" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html