On Fri, Mar 25, 2011 at 04:48:49PM +0800, Shawn Guo wrote: > The patch turns the sdhci-of-core common stuff into helper functions > added into sdhci-pltfm.c, and makes sdhci-of device drviers self > registered using the same pair of .probe and .remove used by > sdhci-pltfm device drivers. > > As a result, sdhci-of-core.c and sdhci-of.h can be eliminated with > those common things merged into sdhci-pltfm.c and sdhci-pltfm.h > respectively. > > Signed-off-by: Shawn Guo <shawn.guo@xxxxxxxxxx> > --- > drivers/mmc/host/Kconfig | 15 +-- > drivers/mmc/host/Makefile | 7 +- > drivers/mmc/host/sdhci-of-core.c | 247 ------------------------------------- > drivers/mmc/host/sdhci-of-esdhc.c | 75 +++++++++++- > drivers/mmc/host/sdhci-of-hlwd.c | 73 +++++++++++- > drivers/mmc/host/sdhci-of.h | 33 ----- > drivers/mmc/host/sdhci-pltfm.c | 100 +++++++++++++++- > drivers/mmc/host/sdhci-pltfm.h | 14 ++ > 8 files changed, 263 insertions(+), 301 deletions(-) > delete mode 100644 drivers/mmc/host/sdhci-of-core.c > delete mode 100644 drivers/mmc/host/sdhci-of.h > > diff --git a/drivers/mmc/host/Kconfig b/drivers/mmc/host/Kconfig > index 1db9347..9f360b5 100644 > --- a/drivers/mmc/host/Kconfig > +++ b/drivers/mmc/host/Kconfig > @@ -81,19 +81,11 @@ config MMC_RICOH_MMC > > If unsure, say Y. > > -config MMC_SDHCI_OF > - tristate "SDHCI support on OpenFirmware platforms" > - depends on MMC_SDHCI && OF > - help > - This selects the OF support for Secure Digital Host Controller > - Interfaces. > - > - If unsure, say N. > - > config MMC_SDHCI_OF_ESDHC > bool "SDHCI OF support for the Freescale eSDHC controller" > - depends on MMC_SDHCI_OF > + depends on MMC_SDHCI > depends on PPC_OF > + select MMC_SDHCI_PLTFM > select MMC_SDHCI_BIG_ENDIAN_32BIT_BYTE_SWAPPER > help > This selects the Freescale eSDHC controller support. > @@ -102,8 +94,9 @@ config MMC_SDHCI_OF_ESDHC > > config MMC_SDHCI_OF_HLWD > bool "SDHCI OF support for the Nintendo Wii SDHCI controllers" > - depends on MMC_SDHCI_OF > + depends on MMC_SDHCI > depends on PPC_OF > + select MMC_SDHCI_PLTFM > select MMC_SDHCI_BIG_ENDIAN_32BIT_BYTE_SWAPPER > help > This selects the Secure Digital Host Controller Interface (SDHCI) > diff --git a/drivers/mmc/host/Makefile b/drivers/mmc/host/Makefile > index 1d8e43d..0ea8815 100644 > --- a/drivers/mmc/host/Makefile > +++ b/drivers/mmc/host/Makefile > @@ -41,11 +41,8 @@ obj-$(CONFIG_MMC_SDHCI_CNS3XXX) += sdhci-cns3xxx.o > obj-$(CONFIG_MMC_SDHCI_ESDHC_IMX) += sdhci-esdhc-imx.o > obj-$(CONFIG_MMC_SDHCI_DOVE) += sdhci-dove.o > obj-$(CONFIG_MMC_SDHCI_TEGRA) += sdhci-tegra.o > - > -obj-$(CONFIG_MMC_SDHCI_OF) += sdhci-of.o > -sdhci-of-y := sdhci-of-core.o > -sdhci-of-$(CONFIG_MMC_SDHCI_OF_ESDHC) += sdhci-of-esdhc.o > -sdhci-of-$(CONFIG_MMC_SDHCI_OF_HLWD) += sdhci-of-hlwd.o > +obj-$(CONFIG_MMC_SDHCI_OF_ESDHC) += sdhci-of-esdhc.o > +obj-$(CONFIG_MMC_SDHCI_OF_HLWD) += sdhci-of-hlwd.o > > ifeq ($(CONFIG_CB710_DEBUG),y) > CFLAGS-cb710-mmc += -DDEBUG > diff --git a/drivers/mmc/host/sdhci-of-core.c b/drivers/mmc/host/sdhci-of-core.c > deleted file mode 100644 > index a6c0132..0000000 > --- a/drivers/mmc/host/sdhci-of-core.c > +++ /dev/null > @@ -1,247 +0,0 @@ > -/* > - * OpenFirmware bindings for Secure Digital Host Controller Interface. > - * > - * Copyright (c) 2007 Freescale Semiconductor, Inc. > - * Copyright (c) 2009 MontaVista Software, Inc. > - * > - * Authors: Xiaobo Xie <X.Xie@xxxxxxxxxxxxx> > - * Anton Vorontsov <avorontsov@xxxxxxxxxxxxx> > - * > - * This program is free software; you can redistribute it and/or modify > - * it under the terms of the GNU General Public License as published by > - * the Free Software Foundation; either version 2 of the License, or (at > - * your option) any later version. > - */ > - > -#include <linux/err.h> > -#include <linux/module.h> > -#include <linux/init.h> > -#include <linux/io.h> > -#include <linux/interrupt.h> > -#include <linux/delay.h> > -#include <linux/of.h> > -#include <linux/of_platform.h> > -#include <linux/of_address.h> > -#include <linux/of_irq.h> > -#include <linux/mmc/host.h> > -#ifdef CONFIG_PPC > -#include <asm/machdep.h> > -#endif > -#include "sdhci-of.h" > -#include "sdhci.h" > - > -#ifdef CONFIG_MMC_SDHCI_BIG_ENDIAN_32BIT_BYTE_SWAPPER > - > -/* > - * These accessors are designed for big endian hosts doing I/O to > - * little endian controllers incorporating a 32-bit hardware byte swapper. > - */ > - > -u32 sdhci_be32bs_readl(struct sdhci_host *host, int reg) > -{ > - return in_be32(host->ioaddr + reg); > -} > - > -u16 sdhci_be32bs_readw(struct sdhci_host *host, int reg) > -{ > - return in_be16(host->ioaddr + (reg ^ 0x2)); > -} > - > -u8 sdhci_be32bs_readb(struct sdhci_host *host, int reg) > -{ > - return in_8(host->ioaddr + (reg ^ 0x3)); > -} > - > -void sdhci_be32bs_writel(struct sdhci_host *host, u32 val, int reg) > -{ > - out_be32(host->ioaddr + reg, val); > -} > - > -void sdhci_be32bs_writew(struct sdhci_host *host, u16 val, int reg) > -{ > - struct sdhci_pltfm_host *pltfm_host = sdhci_priv(host); > - int base = reg & ~0x3; > - int shift = (reg & 0x2) * 8; > - > - switch (reg) { > - case SDHCI_TRANSFER_MODE: > - /* > - * Postpone this write, we must do it together with a > - * command write that is down below. > - */ > - pltfm_host->xfer_mode_shadow = val; > - return; > - case SDHCI_COMMAND: > - sdhci_be32bs_writel(host, val << 16 | pltfm_host->xfer_mode_shadow, > - SDHCI_TRANSFER_MODE); > - return; > - } > - clrsetbits_be32(host->ioaddr + base, 0xffff << shift, val << shift); > -} > - > -void sdhci_be32bs_writeb(struct sdhci_host *host, u8 val, int reg) > -{ > - int base = reg & ~0x3; > - int shift = (reg & 0x3) * 8; > - > - clrsetbits_be32(host->ioaddr + base , 0xff << shift, val << shift); > -} > -#endif /* CONFIG_MMC_SDHCI_BIG_ENDIAN_32BIT_BYTE_SWAPPER */ > - > -#ifdef CONFIG_PM > - > -static int sdhci_of_suspend(struct platform_device *ofdev, pm_message_t state) > -{ > - struct sdhci_host *host = dev_get_drvdata(&ofdev->dev); > - > - return mmc_suspend_host(host->mmc); > -} > - > -static int sdhci_of_resume(struct platform_device *ofdev) > -{ > - struct sdhci_host *host = dev_get_drvdata(&ofdev->dev); > - > - return mmc_resume_host(host->mmc); > -} > - > -#else > - > -#define sdhci_of_suspend NULL > -#define sdhci_of_resume NULL > - > -#endif > - > -static bool __devinit sdhci_of_wp_inverted(struct device_node *np) > -{ > - if (of_get_property(np, "sdhci,wp-inverted", NULL)) > - return true; > - > - /* Old device trees don't have the wp-inverted property. */ > -#ifdef CONFIG_PPC > - return machine_is(mpc837x_rdb) || machine_is(mpc837x_mds); > -#else > - return false; > -#endif > -} > - > -static int __devinit sdhci_of_probe(struct platform_device *ofdev, > - const struct of_device_id *match) > -{ > - struct device_node *np = ofdev->dev.of_node; > - struct sdhci_pltfm_data *pdata = match->data; > - struct sdhci_host *host; > - struct sdhci_pltfm_host *pltfm_host; > - const __be32 *clk; > - int size; > - int ret; > - > - if (!of_device_is_available(np)) > - return -ENODEV; > - > - host = sdhci_alloc_host(&ofdev->dev, sizeof(*pltfm_host)); > - if (IS_ERR(host)) > - return -ENOMEM; > - > - pltfm_host = sdhci_priv(host); > - dev_set_drvdata(&ofdev->dev, host); > - > - host->ioaddr = of_iomap(np, 0); > - if (!host->ioaddr) { > - ret = -ENOMEM; > - goto err_addr_map; > - } > - > - host->irq = irq_of_parse_and_map(np, 0); > - if (!host->irq) { > - ret = -EINVAL; > - goto err_no_irq; > - } > - > - host->hw_name = dev_name(&ofdev->dev); > - if (pdata) { > - host->quirks = pdata->quirks; > - host->ops = &pdata->ops; > - } > - > - if (of_get_property(np, "sdhci,auto-cmd12", NULL)) > - host->quirks |= SDHCI_QUIRK_MULTIBLOCK_READ_ACMD12; > - > - > - if (of_get_property(np, "sdhci,1-bit-only", NULL)) > - host->quirks |= SDHCI_QUIRK_FORCE_1_BIT_DATA; > - > - if (sdhci_of_wp_inverted(np)) > - host->quirks |= SDHCI_QUIRK_INVERTED_WRITE_PROTECT; > - > - clk = of_get_property(np, "clock-frequency", &size); > - if (clk && size == sizeof(*clk) && *clk) > - pltfm_host->clock = be32_to_cpup(clk); > - > - ret = sdhci_add_host(host); > - if (ret) > - goto err_add_host; > - > - return 0; > - > -err_add_host: > - irq_dispose_mapping(host->irq); > -err_no_irq: > - iounmap(host->ioaddr); > -err_addr_map: > - sdhci_free_host(host); > - return ret; > -} > - > -static int __devexit sdhci_of_remove(struct platform_device *ofdev) > -{ > - struct sdhci_host *host = dev_get_drvdata(&ofdev->dev); > - > - sdhci_remove_host(host, 0); > - sdhci_free_host(host); > - irq_dispose_mapping(host->irq); > - iounmap(host->ioaddr); > - return 0; > -} > - > -static const struct of_device_id sdhci_of_match[] = { > -#ifdef CONFIG_MMC_SDHCI_OF_ESDHC > - { .compatible = "fsl,mpc8379-esdhc", .data = &sdhci_esdhc_pdata, }, > - { .compatible = "fsl,mpc8536-esdhc", .data = &sdhci_esdhc_pdata, }, > - { .compatible = "fsl,esdhc", .data = &sdhci_esdhc_pdata, }, > -#endif > -#ifdef CONFIG_MMC_SDHCI_OF_HLWD > - { .compatible = "nintendo,hollywood-sdhci", .data = &sdhci_hlwd_pdata, }, > -#endif > - { .compatible = "generic-sdhci", }, > - {}, > -}; > -MODULE_DEVICE_TABLE(of, sdhci_of_match); > - > -static struct of_platform_driver sdhci_of_driver = { > - .driver = { > - .name = "sdhci-of", > - .owner = THIS_MODULE, > - .of_match_table = sdhci_of_match, > - }, > - .probe = sdhci_of_probe, > - .remove = __devexit_p(sdhci_of_remove), > - .suspend = sdhci_of_suspend, > - .resume = sdhci_of_resume, > -}; > - > -static int __init sdhci_of_init(void) > -{ > - return of_register_platform_driver(&sdhci_of_driver); > -} > -module_init(sdhci_of_init); > - > -static void __exit sdhci_of_exit(void) > -{ > - of_unregister_platform_driver(&sdhci_of_driver); > -} > -module_exit(sdhci_of_exit); > - > -MODULE_DESCRIPTION("Secure Digital Host Controller Interface OF driver"); > -MODULE_AUTHOR("Xiaobo Xie <X.Xie@xxxxxxxxxxxxx>, " > - "Anton Vorontsov <avorontsov@xxxxxxxxxxxxx>"); > -MODULE_LICENSE("GPL"); > diff --git a/drivers/mmc/host/sdhci-of-esdhc.c b/drivers/mmc/host/sdhci-of-esdhc.c > index 702a98b..ccd182f 100644 > --- a/drivers/mmc/host/sdhci-of-esdhc.c > +++ b/drivers/mmc/host/sdhci-of-esdhc.c > @@ -16,7 +16,7 @@ > #include <linux/io.h> > #include <linux/delay.h> > #include <linux/mmc/host.h> > -#include "sdhci-of.h" > +#include "sdhci-pltfm.h" > #include "sdhci.h" > #include "sdhci-esdhc.h" > > @@ -85,7 +85,78 @@ static struct sdhci_ops sdhci_esdhc_ops = { > .get_min_clock = esdhc_of_get_min_clock, > }; > > -struct sdhci_pltfm_data sdhci_esdhc_pdata = { > +static struct sdhci_pltfm_data sdhci_esdhc_pdata = { > .quirks = ESDHC_DEFAULT_QUIRKS, > .ops = &sdhci_esdhc_ops, > }; > + > +static int __devinit sdhci_esdhc_probe(struct platform_device *pdev) > +{ > + struct sdhci_host *host; > + int ret; > + > + host = sdhci_pltfm_init(pdev, &sdhci_esdhc_pdata); > + if (!host) > + return -ENOMEM; > + > + sdhci_get_of_property(pdev); > + > + ret = sdhci_add_host(host); > + if (ret) > + goto err_add_host; > + > + return 0; > + > +err_add_host: > + sdhci_pltfm_free(pdev); > + return ret; > +} > + > +static int __devexit sdhci_esdhc_remove(struct platform_device *pdev) > +{ > + struct sdhci_host *host = platform_get_drvdata(pdev); > + > + sdhci_remove_host(host, 0); > + sdhci_pltfm_free(pdev); > + > + return 0; > +} > + > +static const struct of_device_id sdhci_esdhc_of_match[] = { > + { .compatible = "fsl,mpc8379-esdhc" }, > + { .compatible = "fsl,mpc8536-esdhc" }, > + { .compatible = "fsl,esdhc" }, > + { } > +}; > +MODULE_DEVICE_TABLE(of, sdhci_esdhc_of_match); > + > +static struct platform_driver sdhci_esdhc_driver = { > + .driver = { > + .name = "sdhci-esdhc", > + .owner = THIS_MODULE, > + .of_match_table = sdhci_esdhc_of_match, > + }, > + .probe = sdhci_esdhc_probe, > + .remove = __devexit_p(sdhci_esdhc_remove), > +#ifdef CONFIG_PM > + .suspend = sdhci_pltfm_suspend, > + .resume = sdhci_pltfm_resume, > +#endif > +}; > + > +static int __init sdhci_esdhc_init(void) > +{ > + return platform_driver_register(&sdhci_esdhc_driver); > +} > +module_init(sdhci_esdhc_init); > + > +static void __exit sdhci_esdhc_exit(void) > +{ > + platform_driver_unregister(&sdhci_esdhc_driver); > +} > +module_exit(sdhci_esdhc_exit); > + > +MODULE_DESCRIPTION("Secure Digital Host Controller Interface OF driver"); > +MODULE_AUTHOR("Xiaobo Xie <X.Xie@xxxxxxxxxxxxx>, " > + "Anton Vorontsov <avorontsov@xxxxxxxxxxxxx>"); > +MODULE_LICENSE("GPL v2"); > diff --git a/drivers/mmc/host/sdhci-of-hlwd.c b/drivers/mmc/host/sdhci-of-hlwd.c > index 380e896..52944d1 100644 > --- a/drivers/mmc/host/sdhci-of-hlwd.c > +++ b/drivers/mmc/host/sdhci-of-hlwd.c > @@ -21,7 +21,7 @@ > > #include <linux/delay.h> > #include <linux/mmc/host.h> > -#include "sdhci-of.h" > +#include "sdhci-pltfm.h" > #include "sdhci.h" > > /* > @@ -60,8 +60,77 @@ static struct sdhci_ops sdhci_hlwd_ops = { > .write_b = sdhci_hlwd_writeb, > }; > > -struct sdhci_pltfm_data sdhci_hlwd_pdata = { > +static struct sdhci_pltfm_data sdhci_hlwd_pdata = { > .quirks = SDHCI_QUIRK_32BIT_DMA_ADDR | > SDHCI_QUIRK_32BIT_DMA_SIZE, > .ops = &sdhci_hlwd_ops, > }; > + > +static int __devinit sdhci_hlwd_probe(struct platform_device *pdev) > +{ > + struct sdhci_host *host; > + int ret; > + > + host = sdhci_pltfm_init(pdev, &sdhci_hlwd_pdata); > + if (!host) > + return -ENOMEM; > + > + sdhci_get_of_property(pdev); > + > + ret = sdhci_add_host(host); > + if (ret) > + goto err_add_host; > + > + return 0; > + > +err_add_host: > + sdhci_pltfm_free(pdev); > + return ret; > +} > + > +static int __devexit sdhci_hlwd_remove(struct platform_device *pdev) > +{ > + struct sdhci_host *host = platform_get_drvdata(pdev); > + > + sdhci_remove_host(host, 0); > + sdhci_pltfm_free(pdev); > + > + return 0; > +} > + > +static const struct of_device_id sdhci_hlwd_of_match[] = { > + { .compatible = "nintendo,hollywood-sdhci" }, > + { } > +}; > +MODULE_DEVICE_TABLE(of, sdhci_hlwd_of_match); > + > +static struct platform_driver sdhci_hlwd_driver = { > + .driver = { > + .name = "sdhci-hlwd", > + .owner = THIS_MODULE, > + .of_match_table = sdhci_hlwd_of_match, > + }, > + .probe = sdhci_hlwd_probe, > + .remove = __devexit_p(sdhci_hlwd_remove), > +#ifdef CONFIG_PM > + .suspend = sdhci_pltfm_suspend, > + .resume = sdhci_pltfm_resume, > +#endif > +}; > + > +static int __init sdhci_hlwd_init(void) > +{ > + return platform_driver_register(&sdhci_hlwd_driver); > +} > +module_init(sdhci_hlwd_init); > + > +static void __exit sdhci_hlwd_exit(void) > +{ > + platform_driver_unregister(&sdhci_hlwd_driver); > +} > +module_exit(sdhci_hlwd_exit); > + > +MODULE_DESCRIPTION("Secure Digital Host Controller Interface OF driver"); > +MODULE_AUTHOR("Xiaobo Xie <X.Xie@xxxxxxxxxxxxx>, " > + "Anton Vorontsov <avorontsov@xxxxxxxxxxxxx>"); > +MODULE_LICENSE("GPL v2"); > diff --git a/drivers/mmc/host/sdhci-of.h b/drivers/mmc/host/sdhci-of.h > deleted file mode 100644 > index 5bdb5e7..0000000 > --- a/drivers/mmc/host/sdhci-of.h > +++ /dev/null > @@ -1,33 +0,0 @@ > -/* > - * OpenFirmware bindings for Secure Digital Host Controller Interface. > - * > - * Copyright (c) 2007 Freescale Semiconductor, Inc. > - * Copyright (c) 2009 MontaVista Software, Inc. > - * > - * Authors: Xiaobo Xie <X.Xie@xxxxxxxxxxxxx> > - * Anton Vorontsov <avorontsov@xxxxxxxxxxxxx> > - * > - * This program is free software; you can redistribute it and/or modify > - * it under the terms of the GNU General Public License as published by > - * the Free Software Foundation; either version 2 of the License, or (at > - * your option) any later version. > - */ > - > -#ifndef __SDHCI_OF_H > -#define __SDHCI_OF_H > - > -#include <linux/types.h> > -#include "sdhci.h" > -#include "sdhci-pltfm.h" > - > -extern u32 sdhci_be32bs_readl(struct sdhci_host *host, int reg); > -extern u16 sdhci_be32bs_readw(struct sdhci_host *host, int reg); > -extern u8 sdhci_be32bs_readb(struct sdhci_host *host, int reg); > -extern void sdhci_be32bs_writel(struct sdhci_host *host, u32 val, int reg); > -extern void sdhci_be32bs_writew(struct sdhci_host *host, u16 val, int reg); > -extern void sdhci_be32bs_writeb(struct sdhci_host *host, u8 val, int reg); > - > -extern struct sdhci_pltfm_data sdhci_esdhc_pdata; > -extern struct sdhci_pltfm_data sdhci_hlwd_pdata; > - > -#endif /* __SDHCI_OF_H */ > diff --git a/drivers/mmc/host/sdhci-pltfm.c b/drivers/mmc/host/sdhci-pltfm.c > index 63e45aa..4e998f1 100644 > --- a/drivers/mmc/host/sdhci-pltfm.c > +++ b/drivers/mmc/host/sdhci-pltfm.c > @@ -23,13 +23,111 @@ > */ > > #include <linux/err.h> > - > +#include <linux/of.h> > +#ifdef CONFIG_PPC > +#include <asm/machdep.h> > +#endif > #include "sdhci.h" > #include "sdhci-pltfm.h" > > static struct sdhci_ops sdhci_pltfm_ops = { > }; > > +#ifdef CONFIG_MMC_SDHCI_BIG_ENDIAN_32BIT_BYTE_SWAPPER > +/* > + * These accessors are designed for big endian hosts doing I/O to > + * little endian controllers incorporating a 32-bit hardware byte swapper. > + */ > +u32 sdhci_be32bs_readl(struct sdhci_host *host, int reg) > +{ > + return in_be32(host->ioaddr + reg); > +} > + > +u16 sdhci_be32bs_readw(struct sdhci_host *host, int reg) > +{ > + return in_be16(host->ioaddr + (reg ^ 0x2)); > +} > + > +u8 sdhci_be32bs_readb(struct sdhci_host *host, int reg) > +{ > + return in_8(host->ioaddr + (reg ^ 0x3)); > +} > + > +void sdhci_be32bs_writel(struct sdhci_host *host, u32 val, int reg) > +{ > + out_be32(host->ioaddr + reg, val); > +} > + > +void sdhci_be32bs_writew(struct sdhci_host *host, u16 val, int reg) > +{ > + struct sdhci_pltfm_host *pltfm_host = sdhci_priv(host); > + int base = reg & ~0x3; > + int shift = (reg & 0x2) * 8; > + > + switch (reg) { > + case SDHCI_TRANSFER_MODE: > + /* > + * Postpone this write, we must do it together with a > + * command write that is down below. > + */ > + pltfm_host->xfer_mode_shadow = val; > + return; > + case SDHCI_COMMAND: > + sdhci_be32bs_writel(host, val << 16 | pltfm_host->xfer_mode_shadow, > + SDHCI_TRANSFER_MODE); > + return; > + } > + clrsetbits_be32(host->ioaddr + base, 0xffff << shift, val << shift); > +} > + > +void sdhci_be32bs_writeb(struct sdhci_host *host, u8 val, int reg) > +{ > + int base = reg & ~0x3; > + int shift = (reg & 0x3) * 8; > + > + clrsetbits_be32(host->ioaddr + base , 0xff << shift, val << shift); > +} > +#endif /* CONFIG_MMC_SDHCI_BIG_ENDIAN_32BIT_BYTE_SWAPPER */ > + > +#ifdef CONFIG_OF > +static bool sdhci_of_wp_inverted(struct device_node *np) > +{ > + if (of_get_property(np, "sdhci,wp-inverted", NULL)) > + return true; > + > + /* Old device trees don't have the wp-inverted property. */ > +#ifdef CONFIG_PPC > + return machine_is(mpc837x_rdb) || machine_is(mpc837x_mds); > +#else > + return false; > +#endif > +} > + > +void sdhci_get_of_property(struct platform_device *pdev) > +{ > + struct device_node *np = pdev->dev.of_node; > + struct sdhci_host *host = platform_get_drvdata(pdev); > + struct sdhci_pltfm_host *pltfm_host = sdhci_priv(host); > + const __be32 *clk; > + int size; > + > + if (of_device_is_available(np)) { > + if (of_get_property(np, "sdhci,auto-cmd12", NULL)) > + host->quirks |= SDHCI_QUIRK_MULTIBLOCK_READ_ACMD12; > + > + if (of_get_property(np, "sdhci,1-bit-only", NULL)) > + host->quirks |= SDHCI_QUIRK_FORCE_1_BIT_DATA; > + > + if (sdhci_of_wp_inverted(np)) > + host->quirks |= SDHCI_QUIRK_INVERTED_WRITE_PROTECT; > + > + clk = of_get_property(np, "clock-frequency", &size); > + if (clk && size == sizeof(*clk) && *clk) > + pltfm_host->clock = be32_to_cpup(clk); > + } > +} > +#endif > + > struct sdhci_host *sdhci_pltfm_init(struct platform_device *pdev, > struct sdhci_pltfm_data *pdata) > { > diff --git a/drivers/mmc/host/sdhci-pltfm.h b/drivers/mmc/host/sdhci-pltfm.h > index 12afe86..2f38056 100644 > --- a/drivers/mmc/host/sdhci-pltfm.h > +++ b/drivers/mmc/host/sdhci-pltfm.h > @@ -15,6 +15,7 @@ > #include <linux/types.h> > #include <linux/platform_device.h> > #include <linux/mmc/sdhci-pltfm.h> > +#include <linux/mmc/sdhci.h> > > struct sdhci_pltfm_host { > struct clk *clk; > @@ -25,6 +26,19 @@ struct sdhci_pltfm_host { > u16 xfer_mode_shadow; > }; > > +#ifdef CONFIG_MMC_SDHCI_BIG_ENDIAN_32BIT_BYTE_SWAPPER > +extern u32 sdhci_be32bs_readl(struct sdhci_host *host, int reg); > +extern u16 sdhci_be32bs_readw(struct sdhci_host *host, int reg); > +extern u8 sdhci_be32bs_readb(struct sdhci_host *host, int reg); > +extern void sdhci_be32bs_writel(struct sdhci_host *host, u32 val, int reg); > +extern void sdhci_be32bs_writew(struct sdhci_host *host, u16 val, int reg); > +extern void sdhci_be32bs_writeb(struct sdhci_host *host, u8 val, int reg); > +#endif > + > +#ifdef CONFIG_OF > +extern void sdhci_get_of_property(struct platform_device *pdev); If you also implement an sdhci_pltfm_register() function as suggested in my earlier comment, then You'll probably also want: #else static void sdhci_get_of_property(struct platform_device *pdev) {} > +#endif > + > extern struct sdhci_host *sdhci_pltfm_init(struct platform_device *pdev, > struct sdhci_pltfm_data *pdata); > extern void sdhci_pltfm_free(struct platform_device *pdev); > -- > 1.7.1 > > > _______________________________________________ > linaro-dev mailing list > linaro-dev@xxxxxxxxxxxxxxxx > http://lists.linaro.org/mailman/listinfo/linaro-dev -- 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