* [PATCH 6/6] mmc: sdhci-pltfm: add pltfm-driver for imx35/51
2010-09-28 12:36 [PATCH 0/6] Add driver for mx35/51-esdhc-controller (and update sdhci for that) Wolfram Sang
@ 2010-09-28 12:36 ` Wolfram Sang
2010-09-28 12:58 ` Anton Vorontsov
2010-09-28 14:04 ` zhangfei gao
0 siblings, 2 replies; 84+ messages in thread
From: Wolfram Sang @ 2010-09-28 12:36 UTC (permalink / raw)
To: linux-mmc
Cc: Anton Vorontsov, zhangfei gao, Zhu Richard-R65037, Philip Rakity,
Wolfram Sang
This driver adds basic support for the esdhc-core found on e.g.
imx35/51. It adds up to the pltfm-core.
Signed-off-by: Wolfram Sang <w.sang@pengutronix.de>
---
Changes since last version:
* some "-imx" suffixes added
* some cosmetic improvements
Thanks to Anton for those.
drivers/mmc/host/Kconfig | 10 +++
drivers/mmc/host/Makefile | 1 +
drivers/mmc/host/sdhci-esdhc-imx.c | 144 ++++++++++++++++++++++++++++++++++++
drivers/mmc/host/sdhci-pltfm.c | 3 +
drivers/mmc/host/sdhci-pltfm.h | 1 +
5 files changed, 159 insertions(+), 0 deletions(-)
create mode 100644 drivers/mmc/host/sdhci-esdhc-imx.c
diff --git a/drivers/mmc/host/Kconfig b/drivers/mmc/host/Kconfig
index 6f12d5d..815bf0f 100644
--- a/drivers/mmc/host/Kconfig
+++ b/drivers/mmc/host/Kconfig
@@ -143,6 +143,16 @@ config MMC_SDHCI_MV
If unsure, say N.
+config MMC_SDHCI_ESDHC
+ bool "SDHCI platform support for the Freescale eSDHC controller"
+ depends on MMC_SDHCI_PLTFM
+ select MMC_SDHCI_IO_ACCESSORS
+ help
+ This selects the Freescale eSDHC controller support on the platform
+ bus, found on platforms like mx35/51.
+
+ If unsure, say N.
+
config MMC_SDHCI_S3C
tristate "SDHCI support on Samsung S3C SoC"
depends on MMC_SDHCI && PLAT_SAMSUNG
diff --git a/drivers/mmc/host/Makefile b/drivers/mmc/host/Makefile
index ef32c32..5294425 100644
--- a/drivers/mmc/host/Makefile
+++ b/drivers/mmc/host/Makefile
@@ -38,6 +38,7 @@ obj-$(CONFIG_MMC_USHC) += ushc.o
obj-$(CONFIG_MMC_SDHCI_PLTFM) += sdhci-platform.o
sdhci-platform-y := sdhci-pltfm.o
sdhci-platform-$(CONFIG_MMC_SDHCI_CNS3XXX) += sdhci-cns3xxx.o
+sdhci-platform-$(CONFIG_MMC_SDHCI_ESDHC) += sdhci-esdhc-imx.o
obj-$(CONFIG_MMC_SDHCI_OF) += sdhci-of.o
sdhci-of-y := sdhci-of-core.o
diff --git a/drivers/mmc/host/sdhci-esdhc-imx.c b/drivers/mmc/host/sdhci-esdhc-imx.c
new file mode 100644
index 0000000..c43d448
--- /dev/null
+++ b/drivers/mmc/host/sdhci-esdhc-imx.c
@@ -0,0 +1,144 @@
+/*
+ * Freescale eSDHC controller driver for the platform bus.
+ *
+ * derived from the OF-version.
+ *
+ * Copyright (c) 2010 Pengutronix e.K.
+ * Author: Wolfram Sang <w.sang@pengutronix.de>
+ *
+ * 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.
+ */
+
+#include <linux/io.h>
+#include <linux/delay.h>
+#include <linux/err.h>
+#include <linux/clk.h>
+#include <linux/mmc/host.h>
+#include <linux/mmc/sdhci-pltfm.h>
+#include "sdhci.h"
+#include "sdhci-pltfm.h"
+#include "sdhci-esdhc.h"
+
+static inline void esdhc_clrset_le(struct sdhci_host *host, u32 mask, u32 val, int reg)
+{
+ void __iomem *base = host->ioaddr + (reg & ~0x3);
+ u32 shift = (reg & 0x3) * 8;
+
+ writel(((readl(base) & ~(mask << shift)) | (val << shift)), base);
+}
+
+static u16 esdhc_readw_le(struct sdhci_host *host, int reg)
+{
+ if (unlikely(reg == SDHCI_HOST_VERSION))
+ reg ^= 2;
+
+ return readw(host->ioaddr + reg);
+}
+
+static void esdhc_writew_le(struct sdhci_host *host, u16 val, int reg)
+{
+ struct sdhci_pltfm_host *pltfm_host = sdhci_priv(host);
+
+ switch (reg) {
+ case SDHCI_TRANSFER_MODE:
+ /*
+ * Postpone this write, we must do it together with a
+ * command write that is down below.
+ */
+ pltfm_host->scratchpad = val;
+ return;
+ case SDHCI_COMMAND:
+ writel(val << 16 | pltfm_host->scratchpad,
+ host->ioaddr + SDHCI_TRANSFER_MODE);
+ return;
+ case SDHCI_BLOCK_SIZE:
+ val &= ~SDHCI_MAKE_BLKSZ(0x7, 0);
+ break;
+ }
+ esdhc_clrset_le(host, 0xffff, val, reg);
+}
+
+static void esdhc_writeb_le(struct sdhci_host *host, u8 val, int reg)
+{
+ u32 new_val;
+
+ switch (reg) {
+ case SDHCI_POWER_CONTROL:
+ /*
+ * FSL put some DMA bits here
+ * If your board has a regulator, code should be here
+ */
+ return;
+ case SDHCI_HOST_CONTROL:
+ /* FSL messed up here, so we can just keep those two */
+ new_val = val & (SDHCI_CTRL_LED | SDHCI_CTRL_4BITBUS);
+ /* ensure the endianess */
+ new_val |= ESDHC_HOST_CONTROL_LE;
+ /* DMA mode bits are shifted */
+ new_val |= (val & SDHCI_CTRL_DMA_MASK) << 5;
+
+ esdhc_clrset_le(host, 0xffff, new_val, reg);
+ return;
+ }
+ esdhc_clrset_le(host, 0xff, val, reg);
+}
+
+static unsigned int esdhc_pltfm_get_max_clock(struct sdhci_host *host)
+{
+ struct sdhci_pltfm_host *pltfm_host = sdhci_priv(host);
+
+ return clk_get_rate(pltfm_host->clk);
+}
+
+static unsigned int esdhc_pltfm_get_min_clock(struct sdhci_host *host)
+{
+ struct sdhci_pltfm_host *pltfm_host = sdhci_priv(host);
+
+ return clk_get_rate(pltfm_host->clk) / 256 / 16;
+}
+
+static int esdhc_pltfm_init(struct sdhci_host *host,
+ struct sdhci_pltfm_data *pdata, void *priv_pdata)
+{
+ struct sdhci_pltfm_host *pltfm_host = sdhci_priv(host);
+ struct clk *clk;
+
+ clk = clk_get(NULL, "sdhc");
+ if (IS_ERR(clk)) {
+ dev_err(mmc_dev(host->mmc), "clk err\n");
+ return -ENODEV;
+ }
+ clk_enable(clk);
+ pltfm_host->clk = clk;
+
+ return 0;
+}
+
+static void esdhc_pltfm_exit(struct sdhci_host *host)
+{
+ struct sdhci_pltfm_host *pltfm_host = sdhci_priv(host);
+
+ clk_disable(pltfm_host->clk);
+ clk_put(pltfm_host->clk);
+}
+
+static struct sdhci_ops sdhci_esdhc_ops = {
+ .read_w = esdhc_readw_le,
+ .write_w = esdhc_writew_le,
+ .write_b = esdhc_writeb_le,
+ .set_clock = esdhc_set_clock,
+ .get_max_clock = esdhc_pltfm_get_max_clock,
+ .get_min_clock = esdhc_pltfm_get_min_clock,
+};
+
+struct sdhci_pltfm_data sdhci_esdhc_imx_pdata = {
+ .quirks = ESDHC_DEFAULT_QUIRKS | SDHCI_QUIRK_NO_MULTIBLOCK
+ | SDHCI_QUIRK_BROKEN_ADMA,
+ /* ADMA has issues. Might be fixable */
+ /* NO_MULTIBLOCK might be MX35 only (Errata: ENGcm07207) */
+ .ops = &sdhci_esdhc_ops,
+ .init = esdhc_pltfm_init,
+ .exit = esdhc_pltfm_exit,
+};
diff --git a/drivers/mmc/host/sdhci-pltfm.c b/drivers/mmc/host/sdhci-pltfm.c
index 4076222..3e892a8 100644
--- a/drivers/mmc/host/sdhci-pltfm.c
+++ b/drivers/mmc/host/sdhci-pltfm.c
@@ -169,6 +169,9 @@ static const struct platform_device_id sdhci_pltfm_ids[] = {
#ifdef CONFIG_MMC_SDHCI_CNS3XXX
{ "sdhci-cns3xxx", (kernel_ulong_t)&sdhci_cns3xxx_pdata },
#endif
+#ifdef CONFIG_MMC_SDHCI_ESDHC
+ { "sdhci-esdhc-imx", (kernel_ulong_t)&sdhci_esdhc_imx_pdata },
+#endif
{ },
};
MODULE_DEVICE_TABLE(platform, sdhci_pltfm_ids);
diff --git a/drivers/mmc/host/sdhci-pltfm.h b/drivers/mmc/host/sdhci-pltfm.h
index 9a6f8a9..efe8ea0 100644
--- a/drivers/mmc/host/sdhci-pltfm.h
+++ b/drivers/mmc/host/sdhci-pltfm.h
@@ -20,5 +20,6 @@ struct sdhci_pltfm_host {
};
extern struct sdhci_pltfm_data sdhci_cns3xxx_pdata;
+extern struct sdhci_pltfm_data sdhci_esdhc_imx_pdata;
#endif /* _DRIVERS_MMC_SDHCI_PLTFM_H */
--
1.7.1
^ permalink raw reply related [flat|nested] 84+ messages in thread
* Re: [PATCH 6/6] mmc: sdhci-pltfm: add pltfm-driver for imx35/51
2010-09-28 12:36 ` [PATCH 6/6] mmc: sdhci-pltfm: add pltfm-driver for imx35/51 Wolfram Sang
@ 2010-09-28 12:58 ` Anton Vorontsov
2010-09-28 14:04 ` zhangfei gao
1 sibling, 0 replies; 84+ messages in thread
From: Anton Vorontsov @ 2010-09-28 12:58 UTC (permalink / raw)
To: Wolfram Sang; +Cc: linux-mmc, zhangfei gao, Zhu Richard-R65037, Philip Rakity
On Tue, Sep 28, 2010 at 02:36:46PM +0200, Wolfram Sang wrote:
> This driver adds basic support for the esdhc-core found on e.g.
> imx35/51. It adds up to the pltfm-core.
>
> Signed-off-by: Wolfram Sang <w.sang@pengutronix.de>
> ---
Just a few more nits:
> +++ b/drivers/mmc/host/Kconfig
> @@ -143,6 +143,16 @@ config MMC_SDHCI_MV
>
> If unsure, say N.
>
> +config MMC_SDHCI_ESDHC
MMC_SDHCI_ESDHC_IMX
> + bool "SDHCI platform support for the Freescale eSDHC controller"
SDHCI platform support for the Freescale eSDHC i.MX controller
[...]
> +++ b/drivers/mmc/host/sdhci-esdhc-imx.c
> @@ -0,0 +1,144 @@
> +/*
> + * Freescale eSDHC controller driver for the platform bus.
eSDHC i.MX
Other than that, looks good.
Acked-by: Anton Vorontsov <cbouatmailru@gmail.com>
--
Anton Vorontsov
email: cbouatmailru@gmail.com
irc://irc.freenode.net/bd2
^ permalink raw reply [flat|nested] 84+ messages in thread
* Re: [PATCH 6/6] mmc: sdhci-pltfm: add pltfm-driver for imx35/51
2010-09-28 12:36 ` [PATCH 6/6] mmc: sdhci-pltfm: add pltfm-driver for imx35/51 Wolfram Sang
2010-09-28 12:58 ` Anton Vorontsov
@ 2010-09-28 14:04 ` zhangfei gao
2010-09-28 14:51 ` Wolfram Sang
2010-09-28 20:57 ` Ben Dooks
1 sibling, 2 replies; 84+ messages in thread
From: zhangfei gao @ 2010-09-28 14:04 UTC (permalink / raw)
To: Wolfram Sang
Cc: linux-mmc, Anton Vorontsov, Zhu Richard-R65037, Philip Rakity,
Eric Miao, Haojian Zhuang, Saeed Bishara
On Tue, Sep 28, 2010 at 8:36 AM, Wolfram Sang <w.sang@pengutronix.de> wrote:
> This driver adds basic support for the esdhc-core found on e.g.
> imx35/51. It adds up to the pltfm-core.
>
> Signed-off-by: Wolfram Sang <w.sang@pengutronix.de>
> ---
>
> Changes since last version:
>
> * some "-imx" suffixes added
> * some cosmetic improvements
>
> Thanks to Anton for those.
>
> drivers/mmc/host/Kconfig | 10 +++
> drivers/mmc/host/Makefile | 1 +
> drivers/mmc/host/sdhci-esdhc-imx.c | 144 ++++++++++++++++++++++++++++++++++++
> drivers/mmc/host/sdhci-pltfm.c | 3 +
> drivers/mmc/host/sdhci-pltfm.h | 1 +
> 5 files changed, 159 insertions(+), 0 deletions(-)
> create mode 100644 drivers/mmc/host/sdhci-esdhc-imx.c
>
> diff --git a/drivers/mmc/host/Kconfig b/drivers/mmc/host/Kconfig
> index 6f12d5d..815bf0f 100644
> --- a/drivers/mmc/host/Kconfig
> +++ b/drivers/mmc/host/Kconfig
> @@ -143,6 +143,16 @@ config MMC_SDHCI_MV
>
> If unsure, say N.
>
> +config MMC_SDHCI_ESDHC
> + bool "SDHCI platform support for the Freescale eSDHC controller"
> + depends on MMC_SDHCI_PLTFM
> + select MMC_SDHCI_IO_ACCESSORS
> + help
> + This selects the Freescale eSDHC controller support on the platform
> + bus, found on platforms like mx35/51.
> +
> + If unsure, say N.
> +
> config MMC_SDHCI_S3C
> tristate "SDHCI support on Samsung S3C SoC"
> depends on MMC_SDHCI && PLAT_SAMSUNG
> diff --git a/drivers/mmc/host/Makefile b/drivers/mmc/host/Makefile
> index ef32c32..5294425 100644
> --- a/drivers/mmc/host/Makefile
> +++ b/drivers/mmc/host/Makefile
> @@ -38,6 +38,7 @@ obj-$(CONFIG_MMC_USHC) += ushc.o
> obj-$(CONFIG_MMC_SDHCI_PLTFM) += sdhci-platform.o
> sdhci-platform-y := sdhci-pltfm.o
> sdhci-platform-$(CONFIG_MMC_SDHCI_CNS3XXX) += sdhci-cns3xxx.o
> +sdhci-platform-$(CONFIG_MMC_SDHCI_ESDHC) += sdhci-esdhc-imx.o
>
> obj-$(CONFIG_MMC_SDHCI_OF) += sdhci-of.o
> sdhci-of-y := sdhci-of-core.o
> diff --git a/drivers/mmc/host/sdhci-esdhc-imx.c b/drivers/mmc/host/sdhci-esdhc-imx.c
> new file mode 100644
> index 0000000..c43d448
> --- /dev/null
> +++ b/drivers/mmc/host/sdhci-esdhc-imx.c
> @@ -0,0 +1,144 @@
> +/*
> + * Freescale eSDHC controller driver for the platform bus.
> + *
> + * derived from the OF-version.
> + *
> + * Copyright (c) 2010 Pengutronix e.K.
> + * Author: Wolfram Sang <w.sang@pengutronix.de>
> + *
> + * 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.
> + */
> +
> +#include <linux/io.h>
> +#include <linux/delay.h>
> +#include <linux/err.h>
> +#include <linux/clk.h>
> +#include <linux/mmc/host.h>
> +#include <linux/mmc/sdhci-pltfm.h>
> +#include "sdhci.h"
> +#include "sdhci-pltfm.h"
> +#include "sdhci-esdhc.h"
> +
> +static inline void esdhc_clrset_le(struct sdhci_host *host, u32 mask, u32 val, int reg)
> +{
> + void __iomem *base = host->ioaddr + (reg & ~0x3);
> + u32 shift = (reg & 0x3) * 8;
> +
> + writel(((readl(base) & ~(mask << shift)) | (val << shift)), base);
> +}
> +
> +static u16 esdhc_readw_le(struct sdhci_host *host, int reg)
> +{
> + if (unlikely(reg == SDHCI_HOST_VERSION))
> + reg ^= 2;
> +
> + return readw(host->ioaddr + reg);
> +}
> +
> +static void esdhc_writew_le(struct sdhci_host *host, u16 val, int reg)
> +{
> + struct sdhci_pltfm_host *pltfm_host = sdhci_priv(host);
> +
> + switch (reg) {
> + case SDHCI_TRANSFER_MODE:
> + /*
> + * Postpone this write, we must do it together with a
> + * command write that is down below.
> + */
> + pltfm_host->scratchpad = val;
> + return;
> + case SDHCI_COMMAND:
> + writel(val << 16 | pltfm_host->scratchpad,
> + host->ioaddr + SDHCI_TRANSFER_MODE);
> + return;
> + case SDHCI_BLOCK_SIZE:
> + val &= ~SDHCI_MAKE_BLKSZ(0x7, 0);
> + break;
> + }
> + esdhc_clrset_le(host, 0xffff, val, reg);
> +}
> +
> +static void esdhc_writeb_le(struct sdhci_host *host, u8 val, int reg)
> +{
> + u32 new_val;
> +
> + switch (reg) {
> + case SDHCI_POWER_CONTROL:
> + /*
> + * FSL put some DMA bits here
> + * If your board has a regulator, code should be here
> + */
> + return;
> + case SDHCI_HOST_CONTROL:
> + /* FSL messed up here, so we can just keep those two */
> + new_val = val & (SDHCI_CTRL_LED | SDHCI_CTRL_4BITBUS);
> + /* ensure the endianess */
> + new_val |= ESDHC_HOST_CONTROL_LE;
> + /* DMA mode bits are shifted */
> + new_val |= (val & SDHCI_CTRL_DMA_MASK) << 5;
> +
> + esdhc_clrset_le(host, 0xffff, new_val, reg);
> + return;
> + }
> + esdhc_clrset_le(host, 0xff, val, reg);
> +}
> +
> +static unsigned int esdhc_pltfm_get_max_clock(struct sdhci_host *host)
> +{
> + struct sdhci_pltfm_host *pltfm_host = sdhci_priv(host);
> +
> + return clk_get_rate(pltfm_host->clk);
> +}
> +
> +static unsigned int esdhc_pltfm_get_min_clock(struct sdhci_host *host)
> +{
> + struct sdhci_pltfm_host *pltfm_host = sdhci_priv(host);
> +
> + return clk_get_rate(pltfm_host->clk) / 256 / 16;
> +}
> +
> +static int esdhc_pltfm_init(struct sdhci_host *host,
> + struct sdhci_pltfm_data *pdata, void *priv_pdata)
> +{
> + struct sdhci_pltfm_host *pltfm_host = sdhci_priv(host);
> + struct clk *clk;
> +
> + clk = clk_get(NULL, "sdhc");
Here only could support one device, how about several device, for
example sdhc.0, sdhc.1 sdhc.2, if using this method, they will get the
first clock.
Then sdhc.1 sdhc.2 can not work.
> + if (IS_ERR(clk)) {
> + dev_err(mmc_dev(host->mmc), "clk err\n");
> + return -ENODEV;
> + }
> + clk_enable(clk);
> + pltfm_host->clk = clk;
> +
> + return 0;
> +}
> +
> +static void esdhc_pltfm_exit(struct sdhci_host *host)
> +{
> + struct sdhci_pltfm_host *pltfm_host = sdhci_priv(host);
> +
> + clk_disable(pltfm_host->clk);
> + clk_put(pltfm_host->clk);
> +}
> +
> +static struct sdhci_ops sdhci_esdhc_ops = {
> + .read_w = esdhc_readw_le,
> + .write_w = esdhc_writew_le,
> + .write_b = esdhc_writeb_le,
> + .set_clock = esdhc_set_clock,
> + .get_max_clock = esdhc_pltfm_get_max_clock,
> + .get_min_clock = esdhc_pltfm_get_min_clock,
> +};
> +
> +struct sdhci_pltfm_data sdhci_esdhc_imx_pdata = {
> + .quirks = ESDHC_DEFAULT_QUIRKS | SDHCI_QUIRK_NO_MULTIBLOCK
> + | SDHCI_QUIRK_BROKEN_ADMA,
> + /* ADMA has issues. Might be fixable */
> + /* NO_MULTIBLOCK might be MX35 only (Errata: ENGcm07207) */
> + .ops = &sdhci_esdhc_ops,
> + .init = esdhc_pltfm_init,
> + .exit = esdhc_pltfm_exit,
> +};
> diff --git a/drivers/mmc/host/sdhci-pltfm.c b/drivers/mmc/host/sdhci-pltfm.c
> index 4076222..3e892a8 100644
> --- a/drivers/mmc/host/sdhci-pltfm.c
> +++ b/drivers/mmc/host/sdhci-pltfm.c
> @@ -169,6 +169,9 @@ static const struct platform_device_id sdhci_pltfm_ids[] = {
> #ifdef CONFIG_MMC_SDHCI_CNS3XXX
> { "sdhci-cns3xxx", (kernel_ulong_t)&sdhci_cns3xxx_pdata },
> #endif
> +#ifdef CONFIG_MMC_SDHCI_ESDHC
> + { "sdhci-esdhc-imx", (kernel_ulong_t)&sdhci_esdhc_imx_pdata },
> +#endif
> { },
> };
> MODULE_DEVICE_TABLE(platform, sdhci_pltfm_ids);
> diff --git a/drivers/mmc/host/sdhci-pltfm.h b/drivers/mmc/host/sdhci-pltfm.h
> index 9a6f8a9..efe8ea0 100644
> --- a/drivers/mmc/host/sdhci-pltfm.h
> +++ b/drivers/mmc/host/sdhci-pltfm.h
> @@ -20,5 +20,6 @@ struct sdhci_pltfm_host {
> };
>
> extern struct sdhci_pltfm_data sdhci_cns3xxx_pdata;
> +extern struct sdhci_pltfm_data sdhci_esdhc_imx_pdata;
>
> #endif /* _DRIVERS_MMC_SDHCI_PLTFM_H */
> --
> 1.7.1
>
>
^ permalink raw reply [flat|nested] 84+ messages in thread
* Re: [PATCH 6/6] mmc: sdhci-pltfm: add pltfm-driver for imx35/51
2010-09-28 14:04 ` zhangfei gao
@ 2010-09-28 14:51 ` Wolfram Sang
2010-09-28 20:57 ` Ben Dooks
1 sibling, 0 replies; 84+ messages in thread
From: Wolfram Sang @ 2010-09-28 14:51 UTC (permalink / raw)
To: zhangfei gao
Cc: linux-mmc, Anton Vorontsov, Zhu Richard-R65037, Philip Rakity,
Eric Miao, Haojian Zhuang, Saeed Bishara
[-- Attachment #1: Type: text/plain, Size: 710 bytes --]
> > +static int esdhc_pltfm_init(struct sdhci_host *host,
> > + struct sdhci_pltfm_data *pdata, void *priv_pdata)
> > +{
> > + struct sdhci_pltfm_host *pltfm_host = sdhci_priv(host);
> > + struct clk *clk;
> > +
> > + clk = clk_get(NULL, "sdhc");
>
> Here only could support one device, how about several device, for
> example sdhc.0, sdhc.1 sdhc.2, if using this method, they will get the
> first clock.
> Then sdhc.1 sdhc.2 can not work.
>
Ouch, totally overlooked this one. Thanks for spotting it!
--
Pengutronix e.K. | Wolfram Sang |
Industrial Linux Solutions | http://www.pengutronix.de/ |
[-- Attachment #2: Digital signature --]
[-- Type: application/pgp-signature, Size: 198 bytes --]
^ permalink raw reply [flat|nested] 84+ messages in thread
* Re: [PATCH 6/6] mmc: sdhci-pltfm: add pltfm-driver for imx35/51
2010-09-28 14:04 ` zhangfei gao
2010-09-28 14:51 ` Wolfram Sang
@ 2010-09-28 20:57 ` Ben Dooks
2010-09-29 1:59 ` zhangfei gao
2010-09-29 19:26 ` Wolfram Sang
1 sibling, 2 replies; 84+ messages in thread
From: Ben Dooks @ 2010-09-28 20:57 UTC (permalink / raw)
To: zhangfei gao
Cc: Wolfram Sang, linux-mmc, Anton Vorontsov, Zhu Richard-R65037,
Philip Rakity, Eric Miao, Haojian Zhuang, Saeed Bishara
On Tue, Sep 28, 2010 at 10:04:14AM -0400, zhangfei gao wrote:
> On Tue, Sep 28, 2010 at 8:36 AM, Wolfram Sang <w.sang@pengutronix.de> wrote:
> > This driver adds basic support for the esdhc-core found on e.g.
> > imx35/51. It adds up to the pltfm-core.
> >
> > Signed-off-by: Wolfram Sang <w.sang@pengutronix.de>
> > ---
> >
> > Changes since last version:
> >
> > * some "-imx" suffixes added
> > * some cosmetic improvements
> >
> > Thanks to Anton for those.
> >
> > drivers/mmc/host/Kconfig | 10 +++
> > drivers/mmc/host/Makefile | 1 +
> > drivers/mmc/host/sdhci-esdhc-imx.c | 144 ++++++++++++++++++++++++++++++++++++
> > drivers/mmc/host/sdhci-pltfm.c | 3 +
> > drivers/mmc/host/sdhci-pltfm.h | 1 +
> > 5 files changed, 159 insertions(+), 0 deletions(-)
> > create mode 100644 drivers/mmc/host/sdhci-esdhc-imx.c
> >
> > diff --git a/drivers/mmc/host/Kconfig b/drivers/mmc/host/Kconfig
> > index 6f12d5d..815bf0f 100644
> > --- a/drivers/mmc/host/Kconfig
> > +++ b/drivers/mmc/host/Kconfig
> > @@ -143,6 +143,16 @@ config MMC_SDHCI_MV
> >
> > If unsure, say N.
> >
> > +config MMC_SDHCI_ESDHC
> > + bool "SDHCI platform support for the Freescale eSDHC controller"
> > + depends on MMC_SDHCI_PLTFM
> > + select MMC_SDHCI_IO_ACCESSORS
> > + help
> > + This selects the Freescale eSDHC controller support on the platform
> > + bus, found on platforms like mx35/51.
> > +
> > + If unsure, say N.
> > +
> > config MMC_SDHCI_S3C
> > tristate "SDHCI support on Samsung S3C SoC"
> > depends on MMC_SDHCI && PLAT_SAMSUNG
> > diff --git a/drivers/mmc/host/Makefile b/drivers/mmc/host/Makefile
> > index ef32c32..5294425 100644
> > --- a/drivers/mmc/host/Makefile
> > +++ b/drivers/mmc/host/Makefile
> > @@ -38,6 +38,7 @@ obj-$(CONFIG_MMC_USHC) += ushc.o
> > obj-$(CONFIG_MMC_SDHCI_PLTFM) += sdhci-platform.o
> > sdhci-platform-y := sdhci-pltfm.o
> > sdhci-platform-$(CONFIG_MMC_SDHCI_CNS3XXX) += sdhci-cns3xxx.o
> > +sdhci-platform-$(CONFIG_MMC_SDHCI_ESDHC) += sdhci-esdhc-imx.o
> >
> > obj-$(CONFIG_MMC_SDHCI_OF) += sdhci-of.o
> > sdhci-of-y := sdhci-of-core.o
> > diff --git a/drivers/mmc/host/sdhci-esdhc-imx.c b/drivers/mmc/host/sdhci-esdhc-imx.c
> > new file mode 100644
> > index 0000000..c43d448
> > --- /dev/null
> > +++ b/drivers/mmc/host/sdhci-esdhc-imx.c
> > @@ -0,0 +1,144 @@
> > +/*
> > + * Freescale eSDHC controller driver for the platform bus.
> > + *
> > + * derived from the OF-version.
> > + *
> > + * Copyright (c) 2010 Pengutronix e.K.
> > + * Author: Wolfram Sang <w.sang@pengutronix.de>
> > + *
> > + * 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.
> > + */
> > +
> > +#include <linux/io.h>
> > +#include <linux/delay.h>
> > +#include <linux/err.h>
> > +#include <linux/clk.h>
> > +#include <linux/mmc/host.h>
> > +#include <linux/mmc/sdhci-pltfm.h>
> > +#include "sdhci.h"
> > +#include "sdhci-pltfm.h"
> > +#include "sdhci-esdhc.h"
> > +
> > +static inline void esdhc_clrset_le(struct sdhci_host *host, u32 mask, u32 val, int reg)
> > +{
> > + void __iomem *base = host->ioaddr + (reg & ~0x3);
> > + u32 shift = (reg & 0x3) * 8;
> > +
> > + writel(((readl(base) & ~(mask << shift)) | (val << shift)), base);
> > +}
> > +
> > +static u16 esdhc_readw_le(struct sdhci_host *host, int reg)
> > +{
> > + if (unlikely(reg == SDHCI_HOST_VERSION))
> > + reg ^= 2;
> > +
> > + return readw(host->ioaddr + reg);
> > +}
> > +
> > +static void esdhc_writew_le(struct sdhci_host *host, u16 val, int reg)
> > +{
> > + struct sdhci_pltfm_host *pltfm_host = sdhci_priv(host);
> > +
> > + switch (reg) {
> > + case SDHCI_TRANSFER_MODE:
> > + /*
> > + * Postpone this write, we must do it together with a
> > + * command write that is down below.
> > + */
> > + pltfm_host->scratchpad = val;
> > + return;
> > + case SDHCI_COMMAND:
> > + writel(val << 16 | pltfm_host->scratchpad,
> > + host->ioaddr + SDHCI_TRANSFER_MODE);
> > + return;
> > + case SDHCI_BLOCK_SIZE:
> > + val &= ~SDHCI_MAKE_BLKSZ(0x7, 0);
> > + break;
> > + }
> > + esdhc_clrset_le(host, 0xffff, val, reg);
> > +}
> > +
> > +static void esdhc_writeb_le(struct sdhci_host *host, u8 val, int reg)
> > +{
> > + u32 new_val;
> > +
> > + switch (reg) {
> > + case SDHCI_POWER_CONTROL:
> > + /*
> > + * FSL put some DMA bits here
> > + * If your board has a regulator, code should be here
> > + */
> > + return;
> > + case SDHCI_HOST_CONTROL:
> > + /* FSL messed up here, so we can just keep those two */
> > + new_val = val & (SDHCI_CTRL_LED | SDHCI_CTRL_4BITBUS);
> > + /* ensure the endianess */
> > + new_val |= ESDHC_HOST_CONTROL_LE;
> > + /* DMA mode bits are shifted */
> > + new_val |= (val & SDHCI_CTRL_DMA_MASK) << 5;
> > +
> > + esdhc_clrset_le(host, 0xffff, new_val, reg);
> > + return;
> > + }
> > + esdhc_clrset_le(host, 0xff, val, reg);
> > +}
> > +
> > +static unsigned int esdhc_pltfm_get_max_clock(struct sdhci_host *host)
> > +{
> > + struct sdhci_pltfm_host *pltfm_host = sdhci_priv(host);
> > +
> > + return clk_get_rate(pltfm_host->clk);
> > +}
> > +
> > +static unsigned int esdhc_pltfm_get_min_clock(struct sdhci_host *host)
> > +{
> > + struct sdhci_pltfm_host *pltfm_host = sdhci_priv(host);
> > +
> > + return clk_get_rate(pltfm_host->clk) / 256 / 16;
> > +}
the above always confuses me, how about a / (b * c) or similar?
> > +static int esdhc_pltfm_init(struct sdhci_host *host,
> > + struct sdhci_pltfm_data *pdata, void *priv_pdata)
> > +{
> > + struct sdhci_pltfm_host *pltfm_host = sdhci_priv(host);
> > + struct clk *clk;
> > +
> > + clk = clk_get(NULL, "sdhc");
>
> Here only could support one device, how about several device, for
> example sdhc.0, sdhc.1 sdhc.2, if using this method, they will get the
> first clock.
> Then sdhc.1 sdhc.2 can not work.
No, clk_get() should be passed the device and a NULL for preference.
The main match should be made on the device, and the name is an optional
distinguisher for devices that have multiple clock sources.
> > --- a/drivers/mmc/host/sdhci-pltfm.c
> > +++ b/drivers/mmc/host/sdhci-pltfm.c
> > @@ -169,6 +169,9 @@ static const struct platform_device_id sdhci_pltfm_ids[] = {
> > #ifdef CONFIG_MMC_SDHCI_CNS3XXX
> > { "sdhci-cns3xxx", (kernel_ulong_t)&sdhci_cns3xxx_pdata },
> > #endif
> > +#ifdef CONFIG_MMC_SDHCI_ESDHC
> > + { "sdhci-esdhc-imx", (kernel_ulong_t)&sdhci_esdhc_imx_pdata },
> > +#endif
> > { },
I'd much prefer to see these outside of the sdhci-pltfm.c, this sort of
#ifdef went out of other drivers with the end of the caveman.
My preference would be to rework the sdhci-pltfm.c to be the 'core'
implementation called by each driver. I'll have a look at posting
some patches to see what can be done to sort this out.
--
Ben
Q: What's a light-year?
A: One-third less calories than a regular year.
^ permalink raw reply [flat|nested] 84+ messages in thread
* Re: [PATCH 6/6] mmc: sdhci-pltfm: add pltfm-driver for imx35/51
2010-09-28 20:57 ` Ben Dooks
@ 2010-09-29 1:59 ` zhangfei gao
2010-09-29 2:27 ` Zhu Richard-R65037
2010-09-29 19:26 ` Wolfram Sang
1 sibling, 1 reply; 84+ messages in thread
From: zhangfei gao @ 2010-09-29 1:59 UTC (permalink / raw)
To: Ben Dooks
Cc: Wolfram Sang, linux-mmc, Anton Vorontsov, Zhu Richard-R65037,
Philip Rakity, Eric Miao, Haojian Zhuang, Saeed Bishara
On Wed, Sep 29, 2010 at 4:57 AM, Ben Dooks <ben@trinity.fluff.org> wrote:
> On Tue, Sep 28, 2010 at 10:04:14AM -0400, zhangfei gao wrote:
>> On Tue, Sep 28, 2010 at 8:36 AM, Wolfram Sang <w.sang@pengutronix.de> wrote:
>> > This driver adds basic support for the esdhc-core found on e.g.
>> > imx35/51. It adds up to the pltfm-core.
>> >
>> > Signed-off-by: Wolfram Sang <w.sang@pengutronix.de>
>> > ---
>> >
>> > Changes since last version:
>> >
>> > * some "-imx" suffixes added
>> > * some cosmetic improvements
>> >
>> > Thanks to Anton for those.
>> >
>> > drivers/mmc/host/Kconfig | 10 +++
>> > drivers/mmc/host/Makefile | 1 +
>> > drivers/mmc/host/sdhci-esdhc-imx.c | 144 ++++++++++++++++++++++++++++++++++++
>> > drivers/mmc/host/sdhci-pltfm.c | 3 +
>> > drivers/mmc/host/sdhci-pltfm.h | 1 +
>> > 5 files changed, 159 insertions(+), 0 deletions(-)
>> > create mode 100644 drivers/mmc/host/sdhci-esdhc-imx.c
>> >
>> > diff --git a/drivers/mmc/host/Kconfig b/drivers/mmc/host/Kconfig
>> > index 6f12d5d..815bf0f 100644
>> > --- a/drivers/mmc/host/Kconfig
>> > +++ b/drivers/mmc/host/Kconfig
>> > @@ -143,6 +143,16 @@ config MMC_SDHCI_MV
>> >
>> > If unsure, say N.
>> >
>> > +config MMC_SDHCI_ESDHC
>> > + bool "SDHCI platform support for the Freescale eSDHC controller"
>> > + depends on MMC_SDHCI_PLTFM
>> > + select MMC_SDHCI_IO_ACCESSORS
>> > + help
>> > + This selects the Freescale eSDHC controller support on the platform
>> > + bus, found on platforms like mx35/51.
>> > +
>> > + If unsure, say N.
>> > +
>> > config MMC_SDHCI_S3C
>> > tristate "SDHCI support on Samsung S3C SoC"
>> > depends on MMC_SDHCI && PLAT_SAMSUNG
>> > diff --git a/drivers/mmc/host/Makefile b/drivers/mmc/host/Makefile
>> > index ef32c32..5294425 100644
>> > --- a/drivers/mmc/host/Makefile
>> > +++ b/drivers/mmc/host/Makefile
>> > @@ -38,6 +38,7 @@ obj-$(CONFIG_MMC_USHC) += ushc.o
>> > obj-$(CONFIG_MMC_SDHCI_PLTFM) += sdhci-platform.o
>> > sdhci-platform-y := sdhci-pltfm.o
>> > sdhci-platform-$(CONFIG_MMC_SDHCI_CNS3XXX) += sdhci-cns3xxx.o
>> > +sdhci-platform-$(CONFIG_MMC_SDHCI_ESDHC) += sdhci-esdhc-imx.o
>> >
>> > obj-$(CONFIG_MMC_SDHCI_OF) += sdhci-of.o
>> > sdhci-of-y := sdhci-of-core.o
>> > diff --git a/drivers/mmc/host/sdhci-esdhc-imx.c b/drivers/mmc/host/sdhci-esdhc-imx.c
>> > new file mode 100644
>> > index 0000000..c43d448
>> > --- /dev/null
>> > +++ b/drivers/mmc/host/sdhci-esdhc-imx.c
>> > @@ -0,0 +1,144 @@
>> > +/*
>> > + * Freescale eSDHC controller driver for the platform bus.
>> > + *
>> > + * derived from the OF-version.
>> > + *
>> > + * Copyright (c) 2010 Pengutronix e.K.
>> > + * Author: Wolfram Sang <w.sang@pengutronix.de>
>> > + *
>> > + * 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.
>> > + */
>> > +
>> > +#include <linux/io.h>
>> > +#include <linux/delay.h>
>> > +#include <linux/err.h>
>> > +#include <linux/clk.h>
>> > +#include <linux/mmc/host.h>
>> > +#include <linux/mmc/sdhci-pltfm.h>
>> > +#include "sdhci.h"
>> > +#include "sdhci-pltfm.h"
>> > +#include "sdhci-esdhc.h"
>> > +
>> > +static inline void esdhc_clrset_le(struct sdhci_host *host, u32 mask, u32 val, int reg)
>> > +{
>> > + void __iomem *base = host->ioaddr + (reg & ~0x3);
>> > + u32 shift = (reg & 0x3) * 8;
>> > +
>> > + writel(((readl(base) & ~(mask << shift)) | (val << shift)), base);
>> > +}
>> > +
>> > +static u16 esdhc_readw_le(struct sdhci_host *host, int reg)
>> > +{
>> > + if (unlikely(reg == SDHCI_HOST_VERSION))
>> > + reg ^= 2;
>> > +
>> > + return readw(host->ioaddr + reg);
>> > +}
>> > +
>> > +static void esdhc_writew_le(struct sdhci_host *host, u16 val, int reg)
>> > +{
>> > + struct sdhci_pltfm_host *pltfm_host = sdhci_priv(host);
>> > +
>> > + switch (reg) {
>> > + case SDHCI_TRANSFER_MODE:
>> > + /*
>> > + * Postpone this write, we must do it together with a
>> > + * command write that is down below.
>> > + */
>> > + pltfm_host->scratchpad = val;
>> > + return;
>> > + case SDHCI_COMMAND:
>> > + writel(val << 16 | pltfm_host->scratchpad,
>> > + host->ioaddr + SDHCI_TRANSFER_MODE);
>> > + return;
>> > + case SDHCI_BLOCK_SIZE:
>> > + val &= ~SDHCI_MAKE_BLKSZ(0x7, 0);
>> > + break;
>> > + }
>> > + esdhc_clrset_le(host, 0xffff, val, reg);
>> > +}
>> > +
>> > +static void esdhc_writeb_le(struct sdhci_host *host, u8 val, int reg)
>> > +{
>> > + u32 new_val;
>> > +
>> > + switch (reg) {
>> > + case SDHCI_POWER_CONTROL:
>> > + /*
>> > + * FSL put some DMA bits here
>> > + * If your board has a regulator, code should be here
>> > + */
>> > + return;
>> > + case SDHCI_HOST_CONTROL:
>> > + /* FSL messed up here, so we can just keep those two */
>> > + new_val = val & (SDHCI_CTRL_LED | SDHCI_CTRL_4BITBUS);
>> > + /* ensure the endianess */
>> > + new_val |= ESDHC_HOST_CONTROL_LE;
>> > + /* DMA mode bits are shifted */
>> > + new_val |= (val & SDHCI_CTRL_DMA_MASK) << 5;
>> > +
>> > + esdhc_clrset_le(host, 0xffff, new_val, reg);
>> > + return;
>> > + }
>> > + esdhc_clrset_le(host, 0xff, val, reg);
>> > +}
>> > +
>> > +static unsigned int esdhc_pltfm_get_max_clock(struct sdhci_host *host)
>> > +{
>> > + struct sdhci_pltfm_host *pltfm_host = sdhci_priv(host);
>> > +
>> > + return clk_get_rate(pltfm_host->clk);
>> > +}
>> > +
>> > +static unsigned int esdhc_pltfm_get_min_clock(struct sdhci_host *host)
>> > +{
>> > + struct sdhci_pltfm_host *pltfm_host = sdhci_priv(host);
>> > +
>> > + return clk_get_rate(pltfm_host->clk) / 256 / 16;
>> > +}
>
> the above always confuses me, how about a / (b * c) or similar?
>
>> > +static int esdhc_pltfm_init(struct sdhci_host *host,
>> > + struct sdhci_pltfm_data *pdata, void *priv_pdata)
>> > +{
>> > + struct sdhci_pltfm_host *pltfm_host = sdhci_priv(host);
>> > + struct clk *clk;
>> > +
>> > + clk = clk_get(NULL, "sdhc");
>>
>> Here only could support one device, how about several device, for
>> example sdhc.0, sdhc.1 sdhc.2, if using this method, they will get the
>> first clock.
>> Then sdhc.1 sdhc.2 can not work.
>
> No, clk_get() should be passed the device and a NULL for preference.
>
> The main match should be made on the device, and the name is an optional
> distinguisher for devices that have multiple clock sources.
Sorry, not understand,
If three devices, sdhci,0, sdhci.1, sdhci.2, each device have
different clock, with different register.
Pass NULL will not distinguish which device, so can not choose which clk.
>
>> > --- a/drivers/mmc/host/sdhci-pltfm.c
>> > +++ b/drivers/mmc/host/sdhci-pltfm.c
>> > @@ -169,6 +169,9 @@ static const struct platform_device_id sdhci_pltfm_ids[] = {
>> > #ifdef CONFIG_MMC_SDHCI_CNS3XXX
>> > { "sdhci-cns3xxx", (kernel_ulong_t)&sdhci_cns3xxx_pdata },
>> > #endif
>> > +#ifdef CONFIG_MMC_SDHCI_ESDHC
>> > + { "sdhci-esdhc-imx", (kernel_ulong_t)&sdhci_esdhc_imx_pdata },
>> > +#endif
>> > { },
>
> I'd much prefer to see these outside of the sdhci-pltfm.c, this sort of
> #ifdef went out of other drivers with the end of the caveman.
>
> My preference would be to rework the sdhci-pltfm.c to be the 'core'
> implementation called by each driver. I'll have a look at posting
> some patches to see what can be done to sort this out.
>
> --
> Ben
>
> Q: What's a light-year?
> A: One-third less calories than a regular year.
>
>
^ permalink raw reply [flat|nested] 84+ messages in thread
* RE: [PATCH 6/6] mmc: sdhci-pltfm: add pltfm-driver for imx35/51
2010-09-29 1:59 ` zhangfei gao
@ 2010-09-29 2:27 ` Zhu Richard-R65037
2010-09-29 3:22 ` zhangfei gao
0 siblings, 1 reply; 84+ messages in thread
From: Zhu Richard-R65037 @ 2010-09-29 2:27 UTC (permalink / raw)
To: zhangfei gao, Ben Dooks
Cc: Wolfram Sang, linux-mmc, Anton Vorontsov, Philip Rakity,
Eric Miao, Haojian Zhuang, Saeed Bishara
> -----Original Message-----
> From: zhangfei gao [mailto:zhangfei.gao@gmail.com]
> Sent: Wednesday, September 29, 2010 10:00 AM
> To: Ben Dooks
> Cc: Wolfram Sang; linux-mmc@vger.kernel.org; Anton Vorontsov; Zhu
> Richard-R65037; Philip Rakity; Eric Miao; Haojian Zhuang; Saeed Bishara
> Subject: Re: [PATCH 6/6] mmc: sdhci-pltfm: add pltfm-driver for imx35/51
>
> On Wed, Sep 29, 2010 at 4:57 AM, Ben Dooks <ben@trinity.fluff.org> wrote:
> > On Tue, Sep 28, 2010 at 10:04:14AM -0400, zhangfei gao wrote:
> >> On Tue, Sep 28, 2010 at 8:36 AM, Wolfram Sang <w.sang@pengutronix.de>
> wrote:
> >> > This driver adds basic support for the esdhc-core found on e.g.
> >> > imx35/51. It adds up to the pltfm-core.
> >> >
> >> > Signed-off-by: Wolfram Sang <w.sang@pengutronix.de>
> >> > ---
> >> >
> >> > Changes since last version:
> >> >
> >> > * some "-imx" suffixes added
> >> > * some cosmetic improvements
> >> >
> >> > Thanks to Anton for those.
> >> >
> >> > drivers/mmc/host/Kconfig | 10 +++
> >> > drivers/mmc/host/Makefile | 1 +
> >> > drivers/mmc/host/sdhci-esdhc-imx.c | 144
> >> > ++++++++++++++++++++++++++++++++++++
> >> > drivers/mmc/host/sdhci-pltfm.c | 3 +
> >> > drivers/mmc/host/sdhci-pltfm.h | 1 +
> >> > 5 files changed, 159 insertions(+), 0 deletions(-)
> >> > create mode 100644 drivers/mmc/host/sdhci-esdhc-imx.c
> >> >
> >> > diff --git a/drivers/mmc/host/Kconfig b/drivers/mmc/host/Kconfig
> >> > index 6f12d5d..815bf0f 100644
> >> > --- a/drivers/mmc/host/Kconfig
> >> > +++ b/drivers/mmc/host/Kconfig
> >> > @@ -143,6 +143,16 @@ config MMC_SDHCI_MV
> >> >
> >> > If unsure, say N.
> >> >
> >> > +config MMC_SDHCI_ESDHC
> >> > + bool "SDHCI platform support for the Freescale eSDHC
> controller"
> >> > + depends on MMC_SDHCI_PLTFM
> >> > + select MMC_SDHCI_IO_ACCESSORS
> >> > + help
> >> > + This selects the Freescale eSDHC controller support on
> >> > +the platform
> >> > + bus, found on platforms like mx35/51.
> >> > +
> >> > + If unsure, say N.
> >> > +
> >> > config MMC_SDHCI_S3C
> >> > tristate "SDHCI support on Samsung S3C SoC"
> >> > depends on MMC_SDHCI && PLAT_SAMSUNG diff --git
> >> > a/drivers/mmc/host/Makefile b/drivers/mmc/host/Makefile index
> >> > ef32c32..5294425 100644
> >> > --- a/drivers/mmc/host/Makefile
> >> > +++ b/drivers/mmc/host/Makefile
> >> > @@ -38,6 +38,7 @@ obj-$(CONFIG_MMC_USHC) += ushc.o
> >> > obj-$(CONFIG_MMC_SDHCI_PLTFM) += sdhci-platform.o
> >> > sdhci-platform-y := sdhci-pltfm.o
> >> > sdhci-platform-$(CONFIG_MMC_SDHCI_CNS3XXX) += sdhci-cns3xxx.o
> >> > +sdhci-platform-$(CONFIG_MMC_SDHCI_ESDHC) +=
> >> > +sdhci-esdhc-imx.o
> >> >
> >> > obj-$(CONFIG_MMC_SDHCI_OF) += sdhci-of.o
> >> > sdhci-of-y := sdhci-of-core.o diff
> >> > --git a/drivers/mmc/host/sdhci-esdhc-imx.c
> >> > b/drivers/mmc/host/sdhci-esdhc-imx.c
> >> > new file mode 100644
> >> > index 0000000..c43d448
> >> > --- /dev/null
> >> > +++ b/drivers/mmc/host/sdhci-esdhc-imx.c
> >> > @@ -0,0 +1,144 @@
> >> > +/*
> >> > + * Freescale eSDHC controller driver for the platform bus.
> >> > + *
> >> > + * derived from the OF-version.
> >> > + *
> >> > + * Copyright (c) 2010 Pengutronix e.K.
> >> > + * Author: Wolfram Sang <w.sang@pengutronix.de>
> >> > + *
> >> > + * 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.
> >> > + */
> >> > +
> >> > +#include <linux/io.h>
> >> > +#include <linux/delay.h>
> >> > +#include <linux/err.h>
> >> > +#include <linux/clk.h>
> >> > +#include <linux/mmc/host.h>
> >> > +#include <linux/mmc/sdhci-pltfm.h> #include "sdhci.h"
> >> > +#include "sdhci-pltfm.h"
> >> > +#include "sdhci-esdhc.h"
> >> > +
> >> > +static inline void esdhc_clrset_le(struct sdhci_host *host, u32
> >> > +mask, u32 val, int reg) {
> >> > + void __iomem *base = host->ioaddr + (reg & ~0x3);
> >> > + u32 shift = (reg & 0x3) * 8;
> >> > +
> >> > + writel(((readl(base) & ~(mask << shift)) | (val << shift)),
> >> > +base); }
> >> > +
> >> > +static u16 esdhc_readw_le(struct sdhci_host *host, int reg) {
> >> > + if (unlikely(reg == SDHCI_HOST_VERSION))
> >> > + reg ^= 2;
> >> > +
> >> > + return readw(host->ioaddr + reg); }
> >> > +
> >> > +static void esdhc_writew_le(struct sdhci_host *host, u16 val, int
> >> > +reg) {
> >> > + struct sdhci_pltfm_host *pltfm_host = sdhci_priv(host);
> >> > +
> >> > + switch (reg) {
> >> > + case SDHCI_TRANSFER_MODE:
> >> > + /*
> >> > + * Postpone this write, we must do it together with
> >> > +a
> >> > + * command write that is down below.
> >> > + */
> >> > + pltfm_host->scratchpad = val;
> >> > + return;
> >> > + case SDHCI_COMMAND:
> >> > + writel(val << 16 | pltfm_host->scratchpad,
> >> > + host->ioaddr + SDHCI_TRANSFER_MODE);
> >> > + return;
> >> > + case SDHCI_BLOCK_SIZE:
> >> > + val &= ~SDHCI_MAKE_BLKSZ(0x7, 0);
> >> > + break;
> >> > + }
> >> > + esdhc_clrset_le(host, 0xffff, val, reg); }
> >> > +
> >> > +static void esdhc_writeb_le(struct sdhci_host *host, u8 val, int
> >> > +reg) {
> >> > + u32 new_val;
> >> > +
> >> > + switch (reg) {
> >> > + case SDHCI_POWER_CONTROL:
> >> > + /*
> >> > + * FSL put some DMA bits here
> >> > + * If your board has a regulator, code should be
> >> > + here
> >> > + */
> >> > + return;
> >> > + case SDHCI_HOST_CONTROL:
> >> > + /* FSL messed up here, so we can just keep those
> >> > + two */
> >> > + new_val = val & (SDHCI_CTRL_LED |
> >> > + SDHCI_CTRL_4BITBUS);
> >> > + /* ensure the endianess */
> >> > + new_val |= ESDHC_HOST_CONTROL_LE;
> >> > + /* DMA mode bits are shifted */
> >> > + new_val |= (val & SDHCI_CTRL_DMA_MASK) << 5;
> >> > +
> >> > + esdhc_clrset_le(host, 0xffff, new_val, reg);
> >> > + return;
> >> > + }
> >> > + esdhc_clrset_le(host, 0xff, val, reg); }
> >> > +
> >> > +static unsigned int esdhc_pltfm_get_max_clock(struct sdhci_host
> >> > +*host) {
> >> > + struct sdhci_pltfm_host *pltfm_host = sdhci_priv(host);
> >> > +
> >> > + return clk_get_rate(pltfm_host->clk); }
> >> > +
> >> > +static unsigned int esdhc_pltfm_get_min_clock(struct sdhci_host
> >> > +*host) {
> >> > + struct sdhci_pltfm_host *pltfm_host = sdhci_priv(host);
> >> > +
> >> > + return clk_get_rate(pltfm_host->clk) / 256 / 16; }
> >
> > the above always confuses me, how about a / (b * c) or similar?
> >
> >> > +static int esdhc_pltfm_init(struct sdhci_host *host,
> >> > + struct sdhci_pltfm_data *pdata, void *priv_pdata) {
> >> > + struct sdhci_pltfm_host *pltfm_host = sdhci_priv(host);
> >> > + struct clk *clk;
> >> > +
> >> > + clk = clk_get(NULL, "sdhc");
> >>
> >> Here only could support one device, how about several device, for
> >> example sdhc.0, sdhc.1 sdhc.2, if using this method, they will get
> >> the first clock.
> >> Then sdhc.1 sdhc.2 can not work.
> >
> > No, clk_get() should be passed the device and a NULL for preference.
> >
> > The main match should be made on the device, and the name is an
> > optional distinguisher for devices that have multiple clock sources.
>
> Sorry, not understand,
> If three devices, sdhci,0, sdhci.1, sdhci.2, each device have different
> clock, with different register.
> Pass NULL will not distinguish which device, so can not choose which clk.
>
Hi:
How about to add such kind of device_find_child func codes that can indicated
which dev is requesting the clk.
static int __match_sdhci_imx(struct device *dev, void *data)
{
return !strncmp(dev_name(dev), "imx-sdhci", 9);
}
static int sdhci_imx_init(struct sdhci_host *host) {
struct sdhci_pltfm_host *pltfm_host = sdhci_priv(host);
struct clk *clk;
struct device *dev;
dev = device_find_child(mmc_dev(host->mmc), NULL, __match_sdhci_imx);
clk = clk_get(dev, "imx_sdhc_clk");
if (IS_ERR(clk)) {
dev_err(mmc_dev(host->mmc), "clk err\n");
return -ENODEV;
}
clk_enable(clk);
pltfm_host->clk = clk;
dev_dbg(dev, "SDHC clock:%lu\n", clk_get_rate(clk));
return 0;
}
> >
> >> > --- a/drivers/mmc/host/sdhci-pltfm.c
> >> > +++ b/drivers/mmc/host/sdhci-pltfm.c
> >> > @@ -169,6 +169,9 @@ static const struct platform_device_id
> >> > sdhci_pltfm_ids[] = {
> >> > #ifdef CONFIG_MMC_SDHCI_CNS3XXX
> >> > { "sdhci-cns3xxx", (kernel_ulong_t)&sdhci_cns3xxx_pdata },
> >> > #endif
> >> > +#ifdef CONFIG_MMC_SDHCI_ESDHC
> >> > + { "sdhci-esdhc-imx", (kernel_ulong_t)&sdhci_esdhc_imx_pdata
> >> > +}, #endif
> >> > { },
> >
> > I'd much prefer to see these outside of the sdhci-pltfm.c, this sort
> > of #ifdef went out of other drivers with the end of the caveman.
> >
> > My preference would be to rework the sdhci-pltfm.c to be the 'core'
> > implementation called by each driver. I'll have a look at posting some
> > patches to see what can be done to sort this out.
> >
> > --
> > Ben
> >
> > Q: What's a light-year?
> > A: One-third less calories than a regular year.
> >
> >
^ permalink raw reply [flat|nested] 84+ messages in thread
* Re: [PATCH 6/6] mmc: sdhci-pltfm: add pltfm-driver for imx35/51
2010-09-29 2:27 ` Zhu Richard-R65037
@ 2010-09-29 3:22 ` zhangfei gao
2010-09-29 3:41 ` Zhu Richard-R65037
0 siblings, 1 reply; 84+ messages in thread
From: zhangfei gao @ 2010-09-29 3:22 UTC (permalink / raw)
To: Zhu Richard-R65037
Cc: Ben Dooks, Wolfram Sang, linux-mmc, Anton Vorontsov,
Philip Rakity, Eric Miao, Haojian Zhuang, Saeed Bishara
On Wed, Sep 29, 2010 at 10:27 AM, Zhu Richard-R65037
<r65037@freescale.com> wrote:
>
>
>> -----Original Message-----
>> From: zhangfei gao [mailto:zhangfei.gao@gmail.com]
>> Sent: Wednesday, September 29, 2010 10:00 AM
>> To: Ben Dooks
>> Cc: Wolfram Sang; linux-mmc@vger.kernel.org; Anton Vorontsov; Zhu
>> Richard-R65037; Philip Rakity; Eric Miao; Haojian Zhuang; Saeed Bishara
>> Subject: Re: [PATCH 6/6] mmc: sdhci-pltfm: add pltfm-driver for imx35/51
>>
>> On Wed, Sep 29, 2010 at 4:57 AM, Ben Dooks <ben@trinity.fluff.org> wrote:
>> > On Tue, Sep 28, 2010 at 10:04:14AM -0400, zhangfei gao wrote:
>> >> On Tue, Sep 28, 2010 at 8:36 AM, Wolfram Sang <w.sang@pengutronix.de>
>> wrote:
>> >> > This driver adds basic support for the esdhc-core found on e.g.
>> >> > imx35/51. It adds up to the pltfm-core.
>> >> >
>> >> > Signed-off-by: Wolfram Sang <w.sang@pengutronix.de>
>> >> > ---
>> >> >
>> >> > Changes since last version:
>> >> >
>> >> > * some "-imx" suffixes added
>> >> > * some cosmetic improvements
>> >> >
>> >> > Thanks to Anton for those.
>> >> >
>> >> > drivers/mmc/host/Kconfig | 10 +++
>> >> > drivers/mmc/host/Makefile | 1 +
>> >> > drivers/mmc/host/sdhci-esdhc-imx.c | 144
>> >> > ++++++++++++++++++++++++++++++++++++
>> >> > drivers/mmc/host/sdhci-pltfm.c | 3 +
>> >> > drivers/mmc/host/sdhci-pltfm.h | 1 +
>> >> > 5 files changed, 159 insertions(+), 0 deletions(-)
>> >> > create mode 100644 drivers/mmc/host/sdhci-esdhc-imx.c
>> >> >
>> >> > diff --git a/drivers/mmc/host/Kconfig b/drivers/mmc/host/Kconfig
>> >> > index 6f12d5d..815bf0f 100644
>> >> > --- a/drivers/mmc/host/Kconfig
>> >> > +++ b/drivers/mmc/host/Kconfig
>> >> > @@ -143,6 +143,16 @@ config MMC_SDHCI_MV
>> >> >
>> >> > If unsure, say N.
>> >> >
>> >> > +config MMC_SDHCI_ESDHC
>> >> > + bool "SDHCI platform support for the Freescale eSDHC
>> controller"
>> >> > + depends on MMC_SDHCI_PLTFM
>> >> > + select MMC_SDHCI_IO_ACCESSORS
>> >> > + help
>> >> > + This selects the Freescale eSDHC controller support on
>> >> > +the platform
>> >> > + bus, found on platforms like mx35/51.
>> >> > +
>> >> > + If unsure, say N.
>> >> > +
>> >> > config MMC_SDHCI_S3C
>> >> > tristate "SDHCI support on Samsung S3C SoC"
>> >> > depends on MMC_SDHCI && PLAT_SAMSUNG diff --git
>> >> > a/drivers/mmc/host/Makefile b/drivers/mmc/host/Makefile index
>> >> > ef32c32..5294425 100644
>> >> > --- a/drivers/mmc/host/Makefile
>> >> > +++ b/drivers/mmc/host/Makefile
>> >> > @@ -38,6 +38,7 @@ obj-$(CONFIG_MMC_USHC) += ushc.o
>> >> > obj-$(CONFIG_MMC_SDHCI_PLTFM) += sdhci-platform.o
>> >> > sdhci-platform-y := sdhci-pltfm.o
>> >> > sdhci-platform-$(CONFIG_MMC_SDHCI_CNS3XXX) += sdhci-cns3xxx.o
>> >> > +sdhci-platform-$(CONFIG_MMC_SDHCI_ESDHC) +=
>> >> > +sdhci-esdhc-imx.o
>> >> >
>> >> > obj-$(CONFIG_MMC_SDHCI_OF) += sdhci-of.o
>> >> > sdhci-of-y := sdhci-of-core.o diff
>> >> > --git a/drivers/mmc/host/sdhci-esdhc-imx.c
>> >> > b/drivers/mmc/host/sdhci-esdhc-imx.c
>> >> > new file mode 100644
>> >> > index 0000000..c43d448
>> >> > --- /dev/null
>> >> > +++ b/drivers/mmc/host/sdhci-esdhc-imx.c
>> >> > @@ -0,0 +1,144 @@
>> >> > +/*
>> >> > + * Freescale eSDHC controller driver for the platform bus.
>> >> > + *
>> >> > + * derived from the OF-version.
>> >> > + *
>> >> > + * Copyright (c) 2010 Pengutronix e.K.
>> >> > + * Author: Wolfram Sang <w.sang@pengutronix.de>
>> >> > + *
>> >> > + * 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.
>> >> > + */
>> >> > +
>> >> > +#include <linux/io.h>
>> >> > +#include <linux/delay.h>
>> >> > +#include <linux/err.h>
>> >> > +#include <linux/clk.h>
>> >> > +#include <linux/mmc/host.h>
>> >> > +#include <linux/mmc/sdhci-pltfm.h> #include "sdhci.h"
>> >> > +#include "sdhci-pltfm.h"
>> >> > +#include "sdhci-esdhc.h"
>> >> > +
>> >> > +static inline void esdhc_clrset_le(struct sdhci_host *host, u32
>> >> > +mask, u32 val, int reg) {
>> >> > + void __iomem *base = host->ioaddr + (reg & ~0x3);
>> >> > + u32 shift = (reg & 0x3) * 8;
>> >> > +
>> >> > + writel(((readl(base) & ~(mask << shift)) | (val << shift)),
>> >> > +base); }
>> >> > +
>> >> > +static u16 esdhc_readw_le(struct sdhci_host *host, int reg) {
>> >> > + if (unlikely(reg == SDHCI_HOST_VERSION))
>> >> > + reg ^= 2;
>> >> > +
>> >> > + return readw(host->ioaddr + reg); }
>> >> > +
>> >> > +static void esdhc_writew_le(struct sdhci_host *host, u16 val, int
>> >> > +reg) {
>> >> > + struct sdhci_pltfm_host *pltfm_host = sdhci_priv(host);
>> >> > +
>> >> > + switch (reg) {
>> >> > + case SDHCI_TRANSFER_MODE:
>> >> > + /*
>> >> > + * Postpone this write, we must do it together with
>> >> > +a
>> >> > + * command write that is down below.
>> >> > + */
>> >> > + pltfm_host->scratchpad = val;
>> >> > + return;
>> >> > + case SDHCI_COMMAND:
>> >> > + writel(val << 16 | pltfm_host->scratchpad,
>> >> > + host->ioaddr + SDHCI_TRANSFER_MODE);
>> >> > + return;
>> >> > + case SDHCI_BLOCK_SIZE:
>> >> > + val &= ~SDHCI_MAKE_BLKSZ(0x7, 0);
>> >> > + break;
>> >> > + }
>> >> > + esdhc_clrset_le(host, 0xffff, val, reg); }
>> >> > +
>> >> > +static void esdhc_writeb_le(struct sdhci_host *host, u8 val, int
>> >> > +reg) {
>> >> > + u32 new_val;
>> >> > +
>> >> > + switch (reg) {
>> >> > + case SDHCI_POWER_CONTROL:
>> >> > + /*
>> >> > + * FSL put some DMA bits here
>> >> > + * If your board has a regulator, code should be
>> >> > + here
>> >> > + */
>> >> > + return;
>> >> > + case SDHCI_HOST_CONTROL:
>> >> > + /* FSL messed up here, so we can just keep those
>> >> > + two */
>> >> > + new_val = val & (SDHCI_CTRL_LED |
>> >> > + SDHCI_CTRL_4BITBUS);
>> >> > + /* ensure the endianess */
>> >> > + new_val |= ESDHC_HOST_CONTROL_LE;
>> >> > + /* DMA mode bits are shifted */
>> >> > + new_val |= (val & SDHCI_CTRL_DMA_MASK) << 5;
>> >> > +
>> >> > + esdhc_clrset_le(host, 0xffff, new_val, reg);
>> >> > + return;
>> >> > + }
>> >> > + esdhc_clrset_le(host, 0xff, val, reg); }
>> >> > +
>> >> > +static unsigned int esdhc_pltfm_get_max_clock(struct sdhci_host
>> >> > +*host) {
>> >> > + struct sdhci_pltfm_host *pltfm_host = sdhci_priv(host);
>> >> > +
>> >> > + return clk_get_rate(pltfm_host->clk); }
>> >> > +
>> >> > +static unsigned int esdhc_pltfm_get_min_clock(struct sdhci_host
>> >> > +*host) {
>> >> > + struct sdhci_pltfm_host *pltfm_host = sdhci_priv(host);
>> >> > +
>> >> > + return clk_get_rate(pltfm_host->clk) / 256 / 16; }
>> >
>> > the above always confuses me, how about a / (b * c) or similar?
>> >
>> >> > +static int esdhc_pltfm_init(struct sdhci_host *host,
>> >> > + struct sdhci_pltfm_data *pdata, void *priv_pdata) {
>> >> > + struct sdhci_pltfm_host *pltfm_host = sdhci_priv(host);
>> >> > + struct clk *clk;
>> >> > +
>> >> > + clk = clk_get(NULL, "sdhc");
>> >>
>> >> Here only could support one device, how about several device, for
>> >> example sdhc.0, sdhc.1 sdhc.2, if using this method, they will get
>> >> the first clock.
>> >> Then sdhc.1 sdhc.2 can not work.
>> >
>> > No, clk_get() should be passed the device and a NULL for preference.
>> >
>> > The main match should be made on the device, and the name is an
>> > optional distinguisher for devices that have multiple clock sources.
>>
>> Sorry, not understand,
>> If three devices, sdhci,0, sdhci.1, sdhci.2, each device have different
>> clock, with different register.
>> Pass NULL will not distinguish which device, so can not choose which clk.
>>
> Hi:
> How about to add such kind of device_find_child func codes that can indicated
> which dev is requesting the clk.
> static int __match_sdhci_imx(struct device *dev, void *data)
> {
> return !strncmp(dev_name(dev), "imx-sdhci", 9);
> }
They are same effect, what you get is only the first one, imx-sdhci.0
> static int sdhci_imx_init(struct sdhci_host *host) {
> struct sdhci_pltfm_host *pltfm_host = sdhci_priv(host);
> struct clk *clk;
> struct device *dev;
>
> dev = device_find_child(mmc_dev(host->mmc), NULL, __match_sdhci_imx);
> clk = clk_get(dev, "imx_sdhc_clk");
> if (IS_ERR(clk)) {
> dev_err(mmc_dev(host->mmc), "clk err\n");
> return -ENODEV;
> }
> clk_enable(clk);
> pltfm_host->clk = clk;
> dev_dbg(dev, "SDHC clock:%lu\n", clk_get_rate(clk));
>
> return 0;
> }
>> >
>> >> > --- a/drivers/mmc/host/sdhci-pltfm.c
>> >> > +++ b/drivers/mmc/host/sdhci-pltfm.c
>> >> > @@ -169,6 +169,9 @@ static const struct platform_device_id
>> >> > sdhci_pltfm_ids[] = {
>> >> > #ifdef CONFIG_MMC_SDHCI_CNS3XXX
>> >> > { "sdhci-cns3xxx", (kernel_ulong_t)&sdhci_cns3xxx_pdata },
>> >> > #endif
>> >> > +#ifdef CONFIG_MMC_SDHCI_ESDHC
>> >> > + { "sdhci-esdhc-imx", (kernel_ulong_t)&sdhci_esdhc_imx_pdata
>> >> > +}, #endif
>> >> > { },
>> >
>> > I'd much prefer to see these outside of the sdhci-pltfm.c, this sort
>> > of #ifdef went out of other drivers with the end of the caveman.
>> >
>> > My preference would be to rework the sdhci-pltfm.c to be the 'core'
>> > implementation called by each driver. I'll have a look at posting some
>> > patches to see what can be done to sort this out.
>> >
>> > --
>> > Ben
>> >
>> > Q: What's a light-year?
>> > A: One-third less calories than a regular year.
>> >
>> >
>
>
>
^ permalink raw reply [flat|nested] 84+ messages in thread
* RE: [PATCH 6/6] mmc: sdhci-pltfm: add pltfm-driver for imx35/51
2010-09-29 3:22 ` zhangfei gao
@ 2010-09-29 3:41 ` Zhu Richard-R65037
0 siblings, 0 replies; 84+ messages in thread
From: Zhu Richard-R65037 @ 2010-09-29 3:41 UTC (permalink / raw)
To: zhangfei gao
Cc: Ben Dooks, Wolfram Sang, linux-mmc, Anton Vorontsov,
Philip Rakity, Eric Miao, Haojian Zhuang, Saeed Bishara
> -----Original Message-----
> From: zhangfei gao [mailto:zhangfei.gao@gmail.com]
> Sent: Wednesday, September 29, 2010 11:22 AM
> To: Zhu Richard-R65037
> Cc: Ben Dooks; Wolfram Sang; linux-mmc@vger.kernel.org; Anton Vorontsov;
> Philip Rakity; Eric Miao; Haojian Zhuang; Saeed Bishara
> Subject: Re: [PATCH 6/6] mmc: sdhci-pltfm: add pltfm-driver for imx35/51
>
> On Wed, Sep 29, 2010 at 10:27 AM, Zhu Richard-R65037
> <r65037@freescale.com> wrote:
> >
> >
> >> -----Original Message-----
> >> From: zhangfei gao [mailto:zhangfei.gao@gmail.com]
> >> Sent: Wednesday, September 29, 2010 10:00 AM
> >> To: Ben Dooks
> >> Cc: Wolfram Sang; linux-mmc@vger.kernel.org; Anton Vorontsov; Zhu
> >> Richard-R65037; Philip Rakity; Eric Miao; Haojian Zhuang; Saeed
> >> Bishara
> >> Subject: Re: [PATCH 6/6] mmc: sdhci-pltfm: add pltfm-driver for
> >> imx35/51
> >>
> >> On Wed, Sep 29, 2010 at 4:57 AM, Ben Dooks <ben@trinity.fluff.org>
> wrote:
> >> > On Tue, Sep 28, 2010 at 10:04:14AM -0400, zhangfei gao wrote:
> >> >> On Tue, Sep 28, 2010 at 8:36 AM, Wolfram Sang
> >> >> <w.sang@pengutronix.de>
> >> wrote:
> >> >> > This driver adds basic support for the esdhc-core found on e.g.
> >> >> > imx35/51. It adds up to the pltfm-core.
> >> >> >
> >> >> > Signed-off-by: Wolfram Sang <w.sang@pengutronix.de>
> >> >> > ---
> >> >> >
> >> >> > Changes since last version:
> >> >> >
> >> >> > * some "-imx" suffixes added
> >> >> > * some cosmetic improvements
> >> >> >
> >> >> > Thanks to Anton for those.
> >> >> >
> >> >> > drivers/mmc/host/Kconfig | 10 +++
> >> >> > drivers/mmc/host/Makefile | 1 +
> >> >> > drivers/mmc/host/sdhci-esdhc-imx.c | 144
> >> >> > ++++++++++++++++++++++++++++++++++++
> >> >> > drivers/mmc/host/sdhci-pltfm.c | 3 +
> >> >> > drivers/mmc/host/sdhci-pltfm.h | 1 +
> >> >> > 5 files changed, 159 insertions(+), 0 deletions(-)
> >> >> > create mode 100644 drivers/mmc/host/sdhci-esdhc-imx.c
> >> >> >
> >> >> > diff --git a/drivers/mmc/host/Kconfig b/drivers/mmc/host/Kconfig
> >> >> > index 6f12d5d..815bf0f 100644
> >> >> > --- a/drivers/mmc/host/Kconfig
> >> >> > +++ b/drivers/mmc/host/Kconfig
> >> >> > @@ -143,6 +143,16 @@ config MMC_SDHCI_MV
> >> >> >
> >> >> > If unsure, say N.
> >> >> >
> >> >> > +config MMC_SDHCI_ESDHC
> >> >> > + bool "SDHCI platform support for the Freescale eSDHC
> >> controller"
> >> >> > + depends on MMC_SDHCI_PLTFM
> >> >> > + select MMC_SDHCI_IO_ACCESSORS
> >> >> > + help
> >> >> > + This selects the Freescale eSDHC controller support on
> >> >> > +the platform
> >> >> > + bus, found on platforms like mx35/51.
> >> >> > +
> >> >> > + If unsure, say N.
> >> >> > +
> >> >> > config MMC_SDHCI_S3C
> >> >> > tristate "SDHCI support on Samsung S3C SoC"
> >> >> > depends on MMC_SDHCI && PLAT_SAMSUNG diff --git
> >> >> > a/drivers/mmc/host/Makefile b/drivers/mmc/host/Makefile index
> >> >> > ef32c32..5294425 100644
> >> >> > --- a/drivers/mmc/host/Makefile
> >> >> > +++ b/drivers/mmc/host/Makefile
> >> >> > @@ -38,6 +38,7 @@ obj-$(CONFIG_MMC_USHC) +=
> >> >> > ushc.o
> >> >> > obj-$(CONFIG_MMC_SDHCI_PLTFM) +=
> >> >> > sdhci-platform.o
> >> >> > sdhci-platform-y := sdhci-pltfm.o
> >> >> > sdhci-platform-$(CONFIG_MMC_SDHCI_CNS3XXX) +=
> >> >> > sdhci-cns3xxx.o
> >> >> > +sdhci-platform-$(CONFIG_MMC_SDHCI_ESDHC) +=
> >> >> > +sdhci-esdhc-imx.o
> >> >> >
> >> >> > obj-$(CONFIG_MMC_SDHCI_OF) += sdhci-of.o
> >> >> > sdhci-of-y := sdhci-of-core.o diff
> >> >> > --git a/drivers/mmc/host/sdhci-esdhc-imx.c
> >> >> > b/drivers/mmc/host/sdhci-esdhc-imx.c
> >> >> > new file mode 100644
> >> >> > index 0000000..c43d448
> >> >> > --- /dev/null
> >> >> > +++ b/drivers/mmc/host/sdhci-esdhc-imx.c
> >> >> > @@ -0,0 +1,144 @@
> >> >> > +/*
> >> >> > + * Freescale eSDHC controller driver for the platform bus.
> >> >> > + *
> >> >> > + * derived from the OF-version.
> >> >> > + *
> >> >> > + * Copyright (c) 2010 Pengutronix e.K.
> >> >> > + * Author: Wolfram Sang <w.sang@pengutronix.de>
> >> >> > + *
> >> >> > + * 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.
> >> >> > + */
> >> >> > +
> >> >> > +#include <linux/io.h>
> >> >> > +#include <linux/delay.h>
> >> >> > +#include <linux/err.h>
> >> >> > +#include <linux/clk.h>
> >> >> > +#include <linux/mmc/host.h>
> >> >> > +#include <linux/mmc/sdhci-pltfm.h> #include "sdhci.h"
> >> >> > +#include "sdhci-pltfm.h"
> >> >> > +#include "sdhci-esdhc.h"
> >> >> > +
> >> >> > +static inline void esdhc_clrset_le(struct sdhci_host *host, u32
> >> >> > +mask, u32 val, int reg) {
> >> >> > + void __iomem *base = host->ioaddr + (reg & ~0x3);
> >> >> > + u32 shift = (reg & 0x3) * 8;
> >> >> > +
> >> >> > + writel(((readl(base) & ~(mask << shift)) | (val <<
> >> >> > +shift)), base); }
> >> >> > +
> >> >> > +static u16 esdhc_readw_le(struct sdhci_host *host, int reg) {
> >> >> > + if (unlikely(reg == SDHCI_HOST_VERSION))
> >> >> > + reg ^= 2;
> >> >> > +
> >> >> > + return readw(host->ioaddr + reg); }
> >> >> > +
> >> >> > +static void esdhc_writew_le(struct sdhci_host *host, u16 val,
> >> >> > +int
> >> >> > +reg) {
> >> >> > + struct sdhci_pltfm_host *pltfm_host = sdhci_priv(host);
> >> >> > +
> >> >> > + switch (reg) {
> >> >> > + case SDHCI_TRANSFER_MODE:
> >> >> > + /*
> >> >> > + * Postpone this write, we must do it together
> >> >> > +with a
> >> >> > + * command write that is down below.
> >> >> > + */
> >> >> > + pltfm_host->scratchpad = val;
> >> >> > + return;
> >> >> > + case SDHCI_COMMAND:
> >> >> > + writel(val << 16 | pltfm_host->scratchpad,
> >> >> > + host->ioaddr + SDHCI_TRANSFER_MODE);
> >> >> > + return;
> >> >> > + case SDHCI_BLOCK_SIZE:
> >> >> > + val &= ~SDHCI_MAKE_BLKSZ(0x7, 0);
> >> >> > + break;
> >> >> > + }
> >> >> > + esdhc_clrset_le(host, 0xffff, val, reg); }
> >> >> > +
> >> >> > +static void esdhc_writeb_le(struct sdhci_host *host, u8 val,
> >> >> > +int
> >> >> > +reg) {
> >> >> > + u32 new_val;
> >> >> > +
> >> >> > + switch (reg) {
> >> >> > + case SDHCI_POWER_CONTROL:
> >> >> > + /*
> >> >> > + * FSL put some DMA bits here
> >> >> > + * If your board has a regulator, code should be
> >> >> > + here
> >> >> > + */
> >> >> > + return;
> >> >> > + case SDHCI_HOST_CONTROL:
> >> >> > + /* FSL messed up here, so we can just keep those
> >> >> > + two */
> >> >> > + new_val = val & (SDHCI_CTRL_LED |
> >> >> > + SDHCI_CTRL_4BITBUS);
> >> >> > + /* ensure the endianess */
> >> >> > + new_val |= ESDHC_HOST_CONTROL_LE;
> >> >> > + /* DMA mode bits are shifted */
> >> >> > + new_val |= (val & SDHCI_CTRL_DMA_MASK) << 5;
> >> >> > +
> >> >> > + esdhc_clrset_le(host, 0xffff, new_val, reg);
> >> >> > + return;
> >> >> > + }
> >> >> > + esdhc_clrset_le(host, 0xff, val, reg); }
> >> >> > +
> >> >> > +static unsigned int esdhc_pltfm_get_max_clock(struct sdhci_host
> >> >> > +*host) {
> >> >> > + struct sdhci_pltfm_host *pltfm_host = sdhci_priv(host);
> >> >> > +
> >> >> > + return clk_get_rate(pltfm_host->clk); }
> >> >> > +
> >> >> > +static unsigned int esdhc_pltfm_get_min_clock(struct sdhci_host
> >> >> > +*host) {
> >> >> > + struct sdhci_pltfm_host *pltfm_host = sdhci_priv(host);
> >> >> > +
> >> >> > + return clk_get_rate(pltfm_host->clk) / 256 / 16; }
> >> >
> >> > the above always confuses me, how about a / (b * c) or similar?
> >> >
> >> >> > +static int esdhc_pltfm_init(struct sdhci_host *host,
> >> >> > + struct sdhci_pltfm_data *pdata, void
> >> >> > +*priv_pdata) {
> >> >> > + struct sdhci_pltfm_host *pltfm_host = sdhci_priv(host);
> >> >> > + struct clk *clk;
> >> >> > +
> >> >> > + clk = clk_get(NULL, "sdhc");
> >> >>
> >> >> Here only could support one device, how about several device, for
> >> >> example sdhc.0, sdhc.1 sdhc.2, if using this method, they will get
> >> >> the first clock.
> >> >> Then sdhc.1 sdhc.2 can not work.
> >> >
> >> > No, clk_get() should be passed the device and a NULL for preference.
> >> >
> >> > The main match should be made on the device, and the name is an
> >> > optional distinguisher for devices that have multiple clock sources.
> >>
> >> Sorry, not understand,
> >> If three devices, sdhci,0, sdhci.1, sdhci.2, each device have
> >> different clock, with different register.
> >> Pass NULL will not distinguish which device, so can not choose which
> clk.
> >>
> > Hi:
> > How about to add such kind of device_find_child func codes that can
> > indicated
> > which dev is requesting the clk.
> > static int __match_sdhci_imx(struct device *dev, void *data) {
> > return !strncmp(dev_name(dev), "imx-sdhci", 9); }
>
> They are same effect, what you get is only the first one, imx-sdhci.0
The clk name string can be set and transferred from the private board specified platform data.
We can just use the device_find_child func to find the different dev by dev_id.
(BTW, the dev.parent would be used when allocate the host.)
These example codes are used when I verify the functions on the i.MX51 BBG board based on the platform
Core sdhci-pltfm.c file.
I found that device can't get the proper clk when the first parameter of the clk_get func is NULL.
So I add these codes in my local branch to verify the basic functions on the i.MX51 board.
One more complementary, the different clocks should have the unified interfaces although they have the different
Registers or the configurations.
>
> > static int sdhci_imx_init(struct sdhci_host *host) {
> > struct sdhci_pltfm_host *pltfm_host = sdhci_priv(host);
> > struct clk *clk;
> > struct device *dev;
> >
> > dev = device_find_child(mmc_dev(host->mmc), NULL,
> > __match_sdhci_imx);
> > clk = clk_get(dev, "imx_sdhc_clk");
> > if (IS_ERR(clk)) {
> > dev_err(mmc_dev(host->mmc), "clk err\n");
> > return -ENODEV;
> > }
> > clk_enable(clk);
> > pltfm_host->clk = clk;
> > dev_dbg(dev, "SDHC clock:%lu\n", clk_get_rate(clk));
> >
> > return 0;
> > }
> >> >
> >> >> > --- a/drivers/mmc/host/sdhci-pltfm.c
> >> >> > +++ b/drivers/mmc/host/sdhci-pltfm.c
> >> >> > @@ -169,6 +169,9 @@ static const struct platform_device_id
> >> >> > sdhci_pltfm_ids[] = {
> >> >> > #ifdef CONFIG_MMC_SDHCI_CNS3XXX
> >> >> > { "sdhci-cns3xxx", (kernel_ulong_t)&sdhci_cns3xxx_pdata
> >> >> > },
> >> >> > #endif
> >> >> > +#ifdef CONFIG_MMC_SDHCI_ESDHC
> >> >> > + { "sdhci-esdhc-imx",
> >> >> > +(kernel_ulong_t)&sdhci_esdhc_imx_pdata
> >> >> > +}, #endif
> >> >> > { },
> >> >
> >> > I'd much prefer to see these outside of the sdhci-pltfm.c, this
> >> > sort of #ifdef went out of other drivers with the end of the caveman.
> >> >
> >> > My preference would be to rework the sdhci-pltfm.c to be the 'core'
> >> > implementation called by each driver. I'll have a look at posting
> >> > some patches to see what can be done to sort this out.
> >> >
> >> > --
> >> > Ben
> >> >
> >> > Q: What's a light-year?
> >> > A: One-third less calories than a regular year.
> >> >
> >> >
> >
> >
> >
^ permalink raw reply [flat|nested] 84+ messages in thread
* Re: [PATCH 6/6] mmc: sdhci-pltfm: add pltfm-driver for imx35/51
2010-09-28 20:57 ` Ben Dooks
2010-09-29 1:59 ` zhangfei gao
@ 2010-09-29 19:26 ` Wolfram Sang
1 sibling, 0 replies; 84+ messages in thread
From: Wolfram Sang @ 2010-09-29 19:26 UTC (permalink / raw)
To: Ben Dooks
Cc: zhangfei gao, linux-mmc, Anton Vorontsov, Zhu Richard-R65037,
Philip Rakity, Eric Miao, Haojian Zhuang, Saeed Bishara
[-- Attachment #1: Type: text/plain, Size: 368 bytes --]
> My preference would be to rework the sdhci-pltfm.c to be the 'core'
> implementation called by each driver. I'll have a look at posting
> some patches to see what can be done to sort this out.
Cool!
--
Pengutronix e.K. | Wolfram Sang |
Industrial Linux Solutions | http://www.pengutronix.de/ |
[-- Attachment #2: Digital signature --]
[-- Type: application/pgp-signature, Size: 198 bytes --]
^ permalink raw reply [flat|nested] 84+ messages in thread
* [PATCH 6/6] mmc: sdhci-pltfm: add pltfm-driver for imx35/51
2010-09-29 20:07 [PATCH V3 0/6] SD/MMC-driver for MX35/51 (and improvements to SDHCI) Wolfram Sang
@ 2010-09-29 20:08 ` Wolfram Sang
0 siblings, 0 replies; 84+ messages in thread
From: Wolfram Sang @ 2010-09-29 20:08 UTC (permalink / raw)
To: linux-mmc
Cc: linux-arm-kernel, Anton Vorontsov, Zhu Richard-R65037,
zhangfei gao, Philip Rakity, Wolfram Sang
This driver adds basic support for the esdhc-core found on e.g.
imx35/51. It adds up to the pltfm-core.
Signed-off-by: Wolfram Sang <w.sang@pengutronix.de>
Acked-by: Anton Vorontsov <cbouatmailru@gmail.com>
---
Changes since last version:
* some more -imx suffixes added
* reworked the clock-matching. Now matching the pdev
drivers/mmc/host/Kconfig | 10 +++
drivers/mmc/host/Makefile | 1 +
drivers/mmc/host/sdhci-esdhc-imx.c | 143 ++++++++++++++++++++++++++++++++++++
drivers/mmc/host/sdhci-pltfm.c | 3 +
drivers/mmc/host/sdhci-pltfm.h | 1 +
5 files changed, 158 insertions(+), 0 deletions(-)
create mode 100644 drivers/mmc/host/sdhci-esdhc-imx.c
diff --git a/drivers/mmc/host/Kconfig b/drivers/mmc/host/Kconfig
index 6f12d5d..3c8c286 100644
--- a/drivers/mmc/host/Kconfig
+++ b/drivers/mmc/host/Kconfig
@@ -143,6 +143,16 @@ config MMC_SDHCI_MV
If unsure, say N.
+config MMC_SDHCI_ESDHC_IMX
+ bool "SDHCI platform support for the Freescale eSDHC i.MX controller"
+ depends on MMC_SDHCI_PLTFM
+ select MMC_SDHCI_IO_ACCESSORS
+ help
+ This selects the Freescale eSDHC controller support on the platform
+ bus, found on platforms like mx35/51.
+
+ If unsure, say N.
+
config MMC_SDHCI_S3C
tristate "SDHCI support on Samsung S3C SoC"
depends on MMC_SDHCI && PLAT_SAMSUNG
diff --git a/drivers/mmc/host/Makefile b/drivers/mmc/host/Makefile
index ef32c32..5f283b5 100644
--- a/drivers/mmc/host/Makefile
+++ b/drivers/mmc/host/Makefile
@@ -38,6 +38,7 @@ obj-$(CONFIG_MMC_USHC) += ushc.o
obj-$(CONFIG_MMC_SDHCI_PLTFM) += sdhci-platform.o
sdhci-platform-y := sdhci-pltfm.o
sdhci-platform-$(CONFIG_MMC_SDHCI_CNS3XXX) += sdhci-cns3xxx.o
+sdhci-platform-$(CONFIG_MMC_SDHCI_ESDHC_IMX) += sdhci-esdhc-imx.o
obj-$(CONFIG_MMC_SDHCI_OF) += sdhci-of.o
sdhci-of-y := sdhci-of-core.o
diff --git a/drivers/mmc/host/sdhci-esdhc-imx.c b/drivers/mmc/host/sdhci-esdhc-imx.c
new file mode 100644
index 0000000..68cf78c
--- /dev/null
+++ b/drivers/mmc/host/sdhci-esdhc-imx.c
@@ -0,0 +1,143 @@
+/*
+ * Freescale eSDHC i.MX controller driver for the platform bus.
+ *
+ * derived from the OF-version.
+ *
+ * Copyright (c) 2010 Pengutronix e.K.
+ * Author: Wolfram Sang <w.sang@pengutronix.de>
+ *
+ * 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.
+ */
+
+#include <linux/io.h>
+#include <linux/delay.h>
+#include <linux/err.h>
+#include <linux/clk.h>
+#include <linux/mmc/host.h>
+#include <linux/mmc/sdhci-pltfm.h>
+#include "sdhci.h"
+#include "sdhci-pltfm.h"
+#include "sdhci-esdhc.h"
+
+static inline void esdhc_clrset_le(struct sdhci_host *host, u32 mask, u32 val, int reg)
+{
+ void __iomem *base = host->ioaddr + (reg & ~0x3);
+ u32 shift = (reg & 0x3) * 8;
+
+ writel(((readl(base) & ~(mask << shift)) | (val << shift)), base);
+}
+
+static u16 esdhc_readw_le(struct sdhci_host *host, int reg)
+{
+ if (unlikely(reg == SDHCI_HOST_VERSION))
+ reg ^= 2;
+
+ return readw(host->ioaddr + reg);
+}
+
+static void esdhc_writew_le(struct sdhci_host *host, u16 val, int reg)
+{
+ struct sdhci_pltfm_host *pltfm_host = sdhci_priv(host);
+
+ switch (reg) {
+ case SDHCI_TRANSFER_MODE:
+ /*
+ * Postpone this write, we must do it together with a
+ * command write that is down below.
+ */
+ pltfm_host->scratchpad = val;
+ return;
+ case SDHCI_COMMAND:
+ writel(val << 16 | pltfm_host->scratchpad,
+ host->ioaddr + SDHCI_TRANSFER_MODE);
+ return;
+ case SDHCI_BLOCK_SIZE:
+ val &= ~SDHCI_MAKE_BLKSZ(0x7, 0);
+ break;
+ }
+ esdhc_clrset_le(host, 0xffff, val, reg);
+}
+
+static void esdhc_writeb_le(struct sdhci_host *host, u8 val, int reg)
+{
+ u32 new_val;
+
+ switch (reg) {
+ case SDHCI_POWER_CONTROL:
+ /*
+ * FSL put some DMA bits here
+ * If your board has a regulator, code should be here
+ */
+ return;
+ case SDHCI_HOST_CONTROL:
+ /* FSL messed up here, so we can just keep those two */
+ new_val = val & (SDHCI_CTRL_LED | SDHCI_CTRL_4BITBUS);
+ /* ensure the endianess */
+ new_val |= ESDHC_HOST_CONTROL_LE;
+ /* DMA mode bits are shifted */
+ new_val |= (val & SDHCI_CTRL_DMA_MASK) << 5;
+
+ esdhc_clrset_le(host, 0xffff, new_val, reg);
+ return;
+ }
+ esdhc_clrset_le(host, 0xff, val, reg);
+}
+
+static unsigned int esdhc_pltfm_get_max_clock(struct sdhci_host *host)
+{
+ struct sdhci_pltfm_host *pltfm_host = sdhci_priv(host);
+
+ return clk_get_rate(pltfm_host->clk);
+}
+
+static unsigned int esdhc_pltfm_get_min_clock(struct sdhci_host *host)
+{
+ struct sdhci_pltfm_host *pltfm_host = sdhci_priv(host);
+
+ return clk_get_rate(pltfm_host->clk) / 256 / 16;
+}
+
+static int esdhc_pltfm_init(struct sdhci_host *host, struct sdhci_pltfm_data *pdata)
+{
+ struct sdhci_pltfm_host *pltfm_host = sdhci_priv(host);
+ struct clk *clk;
+
+ clk = clk_get(mmc_dev(host->mmc), NULL);
+ if (IS_ERR(clk)) {
+ dev_err(mmc_dev(host->mmc), "clk err\n");
+ return -ENODEV;
+ }
+ clk_enable(clk);
+ pltfm_host->clk = clk;
+
+ return 0;
+}
+
+static void esdhc_pltfm_exit(struct sdhci_host *host)
+{
+ struct sdhci_pltfm_host *pltfm_host = sdhci_priv(host);
+
+ clk_disable(pltfm_host->clk);
+ clk_put(pltfm_host->clk);
+}
+
+static struct sdhci_ops sdhci_esdhc_ops = {
+ .read_w = esdhc_readw_le,
+ .write_w = esdhc_writew_le,
+ .write_b = esdhc_writeb_le,
+ .set_clock = esdhc_set_clock,
+ .get_max_clock = esdhc_pltfm_get_max_clock,
+ .get_min_clock = esdhc_pltfm_get_min_clock,
+};
+
+struct sdhci_pltfm_data sdhci_esdhc_imx_pdata = {
+ .quirks = ESDHC_DEFAULT_QUIRKS | SDHCI_QUIRK_NO_MULTIBLOCK
+ | SDHCI_QUIRK_BROKEN_ADMA,
+ /* ADMA has issues. Might be fixable */
+ /* NO_MULTIBLOCK might be MX35 only (Errata: ENGcm07207) */
+ .ops = &sdhci_esdhc_ops,
+ .init = esdhc_pltfm_init,
+ .exit = esdhc_pltfm_exit,
+};
diff --git a/drivers/mmc/host/sdhci-pltfm.c b/drivers/mmc/host/sdhci-pltfm.c
index 2b315e9..9ef7050 100644
--- a/drivers/mmc/host/sdhci-pltfm.c
+++ b/drivers/mmc/host/sdhci-pltfm.c
@@ -164,6 +164,9 @@ static const struct platform_device_id sdhci_pltfm_ids[] = {
#ifdef CONFIG_MMC_SDHCI_CNS3XXX
{ "sdhci-cns3xxx", (kernel_ulong_t)&sdhci_cns3xxx_pdata },
#endif
+#ifdef CONFIG_MMC_SDHCI_ESDHC_IMX
+ { "sdhci-esdhc-imx", (kernel_ulong_t)&sdhci_esdhc_imx_pdata },
+#endif
{ },
};
MODULE_DEVICE_TABLE(platform, sdhci_pltfm_ids);
diff --git a/drivers/mmc/host/sdhci-pltfm.h b/drivers/mmc/host/sdhci-pltfm.h
index 562b929..c1bfe48 100644
--- a/drivers/mmc/host/sdhci-pltfm.h
+++ b/drivers/mmc/host/sdhci-pltfm.h
@@ -21,5 +21,6 @@ struct sdhci_pltfm_host {
};
extern struct sdhci_pltfm_data sdhci_cns3xxx_pdata;
+extern struct sdhci_pltfm_data sdhci_esdhc_imx_pdata;
#endif /* _DRIVERS_MMC_SDHCI_PLTFM_H */
--
1.7.1
^ permalink raw reply related [flat|nested] 84+ messages in thread
* [PATCH 6/6] mmc: sdhci-pltfm: add pltfm-driver for imx35/51
@ 2010-09-29 20:08 ` Wolfram Sang
0 siblings, 0 replies; 84+ messages in thread
From: Wolfram Sang @ 2010-09-29 20:08 UTC (permalink / raw)
To: linux-arm-kernel
This driver adds basic support for the esdhc-core found on e.g.
imx35/51. It adds up to the pltfm-core.
Signed-off-by: Wolfram Sang <w.sang@pengutronix.de>
Acked-by: Anton Vorontsov <cbouatmailru@gmail.com>
---
Changes since last version:
* some more -imx suffixes added
* reworked the clock-matching. Now matching the pdev
drivers/mmc/host/Kconfig | 10 +++
drivers/mmc/host/Makefile | 1 +
drivers/mmc/host/sdhci-esdhc-imx.c | 143 ++++++++++++++++++++++++++++++++++++
drivers/mmc/host/sdhci-pltfm.c | 3 +
drivers/mmc/host/sdhci-pltfm.h | 1 +
5 files changed, 158 insertions(+), 0 deletions(-)
create mode 100644 drivers/mmc/host/sdhci-esdhc-imx.c
diff --git a/drivers/mmc/host/Kconfig b/drivers/mmc/host/Kconfig
index 6f12d5d..3c8c286 100644
--- a/drivers/mmc/host/Kconfig
+++ b/drivers/mmc/host/Kconfig
@@ -143,6 +143,16 @@ config MMC_SDHCI_MV
If unsure, say N.
+config MMC_SDHCI_ESDHC_IMX
+ bool "SDHCI platform support for the Freescale eSDHC i.MX controller"
+ depends on MMC_SDHCI_PLTFM
+ select MMC_SDHCI_IO_ACCESSORS
+ help
+ This selects the Freescale eSDHC controller support on the platform
+ bus, found on platforms like mx35/51.
+
+ If unsure, say N.
+
config MMC_SDHCI_S3C
tristate "SDHCI support on Samsung S3C SoC"
depends on MMC_SDHCI && PLAT_SAMSUNG
diff --git a/drivers/mmc/host/Makefile b/drivers/mmc/host/Makefile
index ef32c32..5f283b5 100644
--- a/drivers/mmc/host/Makefile
+++ b/drivers/mmc/host/Makefile
@@ -38,6 +38,7 @@ obj-$(CONFIG_MMC_USHC) += ushc.o
obj-$(CONFIG_MMC_SDHCI_PLTFM) += sdhci-platform.o
sdhci-platform-y := sdhci-pltfm.o
sdhci-platform-$(CONFIG_MMC_SDHCI_CNS3XXX) += sdhci-cns3xxx.o
+sdhci-platform-$(CONFIG_MMC_SDHCI_ESDHC_IMX) += sdhci-esdhc-imx.o
obj-$(CONFIG_MMC_SDHCI_OF) += sdhci-of.o
sdhci-of-y := sdhci-of-core.o
diff --git a/drivers/mmc/host/sdhci-esdhc-imx.c b/drivers/mmc/host/sdhci-esdhc-imx.c
new file mode 100644
index 0000000..68cf78c
--- /dev/null
+++ b/drivers/mmc/host/sdhci-esdhc-imx.c
@@ -0,0 +1,143 @@
+/*
+ * Freescale eSDHC i.MX controller driver for the platform bus.
+ *
+ * derived from the OF-version.
+ *
+ * Copyright (c) 2010 Pengutronix e.K.
+ * Author: Wolfram Sang <w.sang@pengutronix.de>
+ *
+ * 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.
+ */
+
+#include <linux/io.h>
+#include <linux/delay.h>
+#include <linux/err.h>
+#include <linux/clk.h>
+#include <linux/mmc/host.h>
+#include <linux/mmc/sdhci-pltfm.h>
+#include "sdhci.h"
+#include "sdhci-pltfm.h"
+#include "sdhci-esdhc.h"
+
+static inline void esdhc_clrset_le(struct sdhci_host *host, u32 mask, u32 val, int reg)
+{
+ void __iomem *base = host->ioaddr + (reg & ~0x3);
+ u32 shift = (reg & 0x3) * 8;
+
+ writel(((readl(base) & ~(mask << shift)) | (val << shift)), base);
+}
+
+static u16 esdhc_readw_le(struct sdhci_host *host, int reg)
+{
+ if (unlikely(reg == SDHCI_HOST_VERSION))
+ reg ^= 2;
+
+ return readw(host->ioaddr + reg);
+}
+
+static void esdhc_writew_le(struct sdhci_host *host, u16 val, int reg)
+{
+ struct sdhci_pltfm_host *pltfm_host = sdhci_priv(host);
+
+ switch (reg) {
+ case SDHCI_TRANSFER_MODE:
+ /*
+ * Postpone this write, we must do it together with a
+ * command write that is down below.
+ */
+ pltfm_host->scratchpad = val;
+ return;
+ case SDHCI_COMMAND:
+ writel(val << 16 | pltfm_host->scratchpad,
+ host->ioaddr + SDHCI_TRANSFER_MODE);
+ return;
+ case SDHCI_BLOCK_SIZE:
+ val &= ~SDHCI_MAKE_BLKSZ(0x7, 0);
+ break;
+ }
+ esdhc_clrset_le(host, 0xffff, val, reg);
+}
+
+static void esdhc_writeb_le(struct sdhci_host *host, u8 val, int reg)
+{
+ u32 new_val;
+
+ switch (reg) {
+ case SDHCI_POWER_CONTROL:
+ /*
+ * FSL put some DMA bits here
+ * If your board has a regulator, code should be here
+ */
+ return;
+ case SDHCI_HOST_CONTROL:
+ /* FSL messed up here, so we can just keep those two */
+ new_val = val & (SDHCI_CTRL_LED | SDHCI_CTRL_4BITBUS);
+ /* ensure the endianess */
+ new_val |= ESDHC_HOST_CONTROL_LE;
+ /* DMA mode bits are shifted */
+ new_val |= (val & SDHCI_CTRL_DMA_MASK) << 5;
+
+ esdhc_clrset_le(host, 0xffff, new_val, reg);
+ return;
+ }
+ esdhc_clrset_le(host, 0xff, val, reg);
+}
+
+static unsigned int esdhc_pltfm_get_max_clock(struct sdhci_host *host)
+{
+ struct sdhci_pltfm_host *pltfm_host = sdhci_priv(host);
+
+ return clk_get_rate(pltfm_host->clk);
+}
+
+static unsigned int esdhc_pltfm_get_min_clock(struct sdhci_host *host)
+{
+ struct sdhci_pltfm_host *pltfm_host = sdhci_priv(host);
+
+ return clk_get_rate(pltfm_host->clk) / 256 / 16;
+}
+
+static int esdhc_pltfm_init(struct sdhci_host *host, struct sdhci_pltfm_data *pdata)
+{
+ struct sdhci_pltfm_host *pltfm_host = sdhci_priv(host);
+ struct clk *clk;
+
+ clk = clk_get(mmc_dev(host->mmc), NULL);
+ if (IS_ERR(clk)) {
+ dev_err(mmc_dev(host->mmc), "clk err\n");
+ return -ENODEV;
+ }
+ clk_enable(clk);
+ pltfm_host->clk = clk;
+
+ return 0;
+}
+
+static void esdhc_pltfm_exit(struct sdhci_host *host)
+{
+ struct sdhci_pltfm_host *pltfm_host = sdhci_priv(host);
+
+ clk_disable(pltfm_host->clk);
+ clk_put(pltfm_host->clk);
+}
+
+static struct sdhci_ops sdhci_esdhc_ops = {
+ .read_w = esdhc_readw_le,
+ .write_w = esdhc_writew_le,
+ .write_b = esdhc_writeb_le,
+ .set_clock = esdhc_set_clock,
+ .get_max_clock = esdhc_pltfm_get_max_clock,
+ .get_min_clock = esdhc_pltfm_get_min_clock,
+};
+
+struct sdhci_pltfm_data sdhci_esdhc_imx_pdata = {
+ .quirks = ESDHC_DEFAULT_QUIRKS | SDHCI_QUIRK_NO_MULTIBLOCK
+ | SDHCI_QUIRK_BROKEN_ADMA,
+ /* ADMA has issues. Might be fixable */
+ /* NO_MULTIBLOCK might be MX35 only (Errata: ENGcm07207) */
+ .ops = &sdhci_esdhc_ops,
+ .init = esdhc_pltfm_init,
+ .exit = esdhc_pltfm_exit,
+};
diff --git a/drivers/mmc/host/sdhci-pltfm.c b/drivers/mmc/host/sdhci-pltfm.c
index 2b315e9..9ef7050 100644
--- a/drivers/mmc/host/sdhci-pltfm.c
+++ b/drivers/mmc/host/sdhci-pltfm.c
@@ -164,6 +164,9 @@ static const struct platform_device_id sdhci_pltfm_ids[] = {
#ifdef CONFIG_MMC_SDHCI_CNS3XXX
{ "sdhci-cns3xxx", (kernel_ulong_t)&sdhci_cns3xxx_pdata },
#endif
+#ifdef CONFIG_MMC_SDHCI_ESDHC_IMX
+ { "sdhci-esdhc-imx", (kernel_ulong_t)&sdhci_esdhc_imx_pdata },
+#endif
{ },
};
MODULE_DEVICE_TABLE(platform, sdhci_pltfm_ids);
diff --git a/drivers/mmc/host/sdhci-pltfm.h b/drivers/mmc/host/sdhci-pltfm.h
index 562b929..c1bfe48 100644
--- a/drivers/mmc/host/sdhci-pltfm.h
+++ b/drivers/mmc/host/sdhci-pltfm.h
@@ -21,5 +21,6 @@ struct sdhci_pltfm_host {
};
extern struct sdhci_pltfm_data sdhci_cns3xxx_pdata;
+extern struct sdhci_pltfm_data sdhci_esdhc_imx_pdata;
#endif /* _DRIVERS_MMC_SDHCI_PLTFM_H */
--
1.7.1
^ permalink raw reply related [flat|nested] 84+ messages in thread
* Re: [PATCH 6/6] mmc: sdhci-pltfm: add pltfm-driver for imx35/51
2010-09-29 20:08 ` Wolfram Sang
@ 2010-09-29 20:14 ` Chris Ball
-1 siblings, 0 replies; 84+ messages in thread
From: Chris Ball @ 2010-09-29 20:14 UTC (permalink / raw)
To: Wolfram Sang
Cc: linux-mmc, linux-arm-kernel, Anton Vorontsov, Zhu Richard-R65037,
zhangfei gao, Philip Rakity
Hi Wolfram,
On Wed, Sep 29, 2010 at 10:08:04PM +0200, Wolfram Sang wrote:
> This driver adds basic support for the esdhc-core found on e.g.
> imx35/51. It adds up to the pltfm-core.
>
> Signed-off-by: Wolfram Sang <w.sang@pengutronix.de>
> Acked-by: Anton Vorontsov <cbouatmailru@gmail.com>
> ---
>
> Changes since last version:
>
> * some more -imx suffixes added
> * reworked the clock-matching. Now matching the pdev
>
> drivers/mmc/host/Kconfig | 10 +++
> drivers/mmc/host/Makefile | 1 +
> drivers/mmc/host/sdhci-esdhc-imx.c | 143 ++++++++++++++++++++++++++++++++++++
> drivers/mmc/host/sdhci-pltfm.c | 3 +
> drivers/mmc/host/sdhci-pltfm.h | 1 +
> 5 files changed, 158 insertions(+), 0 deletions(-)
> create mode 100644 drivers/mmc/host/sdhci-esdhc-imx.c
>
> diff --git a/drivers/mmc/host/Kconfig b/drivers/mmc/host/Kconfig
> index 6f12d5d..3c8c286 100644
> --- a/drivers/mmc/host/Kconfig
> +++ b/drivers/mmc/host/Kconfig
> @@ -143,6 +143,16 @@ config MMC_SDHCI_MV
>
> If unsure, say N.
>
> +config MMC_SDHCI_ESDHC_IMX
> + bool "SDHCI platform support for the Freescale eSDHC i.MX controller"
> + depends on MMC_SDHCI_PLTFM
> + select MMC_SDHCI_IO_ACCESSORS
> + help
> + This selects the Freescale eSDHC controller support on the platform
> + bus, found on platforms like mx35/51.
> +
> + If unsure, say N.
> +
> config MMC_SDHCI_S3C
> tristate "SDHCI support on Samsung S3C SoC"
> depends on MMC_SDHCI && PLAT_SAMSUNG
> diff --git a/drivers/mmc/host/Makefile b/drivers/mmc/host/Makefile
> index ef32c32..5f283b5 100644
> --- a/drivers/mmc/host/Makefile
> +++ b/drivers/mmc/host/Makefile
> @@ -38,6 +38,7 @@ obj-$(CONFIG_MMC_USHC) += ushc.o
> obj-$(CONFIG_MMC_SDHCI_PLTFM) += sdhci-platform.o
> sdhci-platform-y := sdhci-pltfm.o
> sdhci-platform-$(CONFIG_MMC_SDHCI_CNS3XXX) += sdhci-cns3xxx.o
> +sdhci-platform-$(CONFIG_MMC_SDHCI_ESDHC_IMX) += sdhci-esdhc-imx.o
>
> obj-$(CONFIG_MMC_SDHCI_OF) += sdhci-of.o
> sdhci-of-y := sdhci-of-core.o
> diff --git a/drivers/mmc/host/sdhci-esdhc-imx.c b/drivers/mmc/host/sdhci-esdhc-imx.c
> new file mode 100644
> index 0000000..68cf78c
> --- /dev/null
> +++ b/drivers/mmc/host/sdhci-esdhc-imx.c
> @@ -0,0 +1,143 @@
> +/*
> + * Freescale eSDHC i.MX controller driver for the platform bus.
> + *
> + * derived from the OF-version.
> + *
> + * Copyright (c) 2010 Pengutronix e.K.
> + * Author: Wolfram Sang <w.sang@pengutronix.de>
> + *
> + * 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.
> + */
> +
> +#include <linux/io.h>
> +#include <linux/delay.h>
> +#include <linux/err.h>
> +#include <linux/clk.h>
> +#include <linux/mmc/host.h>
> +#include <linux/mmc/sdhci-pltfm.h>
> +#include "sdhci.h"
> +#include "sdhci-pltfm.h"
> +#include "sdhci-esdhc.h"
> +
> +static inline void esdhc_clrset_le(struct sdhci_host *host, u32 mask, u32 val, int reg)
> +{
> + void __iomem *base = host->ioaddr + (reg & ~0x3);
> + u32 shift = (reg & 0x3) * 8;
> +
> + writel(((readl(base) & ~(mask << shift)) | (val << shift)), base);
> +}
> +
> +static u16 esdhc_readw_le(struct sdhci_host *host, int reg)
> +{
> + if (unlikely(reg == SDHCI_HOST_VERSION))
> + reg ^= 2;
> +
> + return readw(host->ioaddr + reg);
> +}
> +
> +static void esdhc_writew_le(struct sdhci_host *host, u16 val, int reg)
> +{
> + struct sdhci_pltfm_host *pltfm_host = sdhci_priv(host);
> +
> + switch (reg) {
> + case SDHCI_TRANSFER_MODE:
> + /*
> + * Postpone this write, we must do it together with a
> + * command write that is down below.
> + */
> + pltfm_host->scratchpad = val;
> + return;
> + case SDHCI_COMMAND:
> + writel(val << 16 | pltfm_host->scratchpad,
> + host->ioaddr + SDHCI_TRANSFER_MODE);
> + return;
> + case SDHCI_BLOCK_SIZE:
> + val &= ~SDHCI_MAKE_BLKSZ(0x7, 0);
> + break;
> + }
> + esdhc_clrset_le(host, 0xffff, val, reg);
> +}
> +
> +static void esdhc_writeb_le(struct sdhci_host *host, u8 val, int reg)
> +{
> + u32 new_val;
> +
> + switch (reg) {
> + case SDHCI_POWER_CONTROL:
> + /*
> + * FSL put some DMA bits here
> + * If your board has a regulator, code should be here
> + */
> + return;
> + case SDHCI_HOST_CONTROL:
> + /* FSL messed up here, so we can just keep those two */
> + new_val = val & (SDHCI_CTRL_LED | SDHCI_CTRL_4BITBUS);
> + /* ensure the endianess */
> + new_val |= ESDHC_HOST_CONTROL_LE;
> + /* DMA mode bits are shifted */
> + new_val |= (val & SDHCI_CTRL_DMA_MASK) << 5;
> +
> + esdhc_clrset_le(host, 0xffff, new_val, reg);
> + return;
> + }
> + esdhc_clrset_le(host, 0xff, val, reg);
> +}
> +
> +static unsigned int esdhc_pltfm_get_max_clock(struct sdhci_host *host)
> +{
> + struct sdhci_pltfm_host *pltfm_host = sdhci_priv(host);
> +
> + return clk_get_rate(pltfm_host->clk);
> +}
> +
> +static unsigned int esdhc_pltfm_get_min_clock(struct sdhci_host *host)
> +{
> + struct sdhci_pltfm_host *pltfm_host = sdhci_priv(host);
> +
> + return clk_get_rate(pltfm_host->clk) / 256 / 16;
> +}
> +
> +static int esdhc_pltfm_init(struct sdhci_host *host, struct sdhci_pltfm_data *pdata)
> +{
> + struct sdhci_pltfm_host *pltfm_host = sdhci_priv(host);
> + struct clk *clk;
> +
> + clk = clk_get(mmc_dev(host->mmc), NULL);
> + if (IS_ERR(clk)) {
> + dev_err(mmc_dev(host->mmc), "clk err\n");
> + return -ENODEV;
> + }
Is there a reason to return -ENODEV instead of PTR_ERR(clk)?
Patchset is looking good, thanks very much for keeping work going
on -pltfm,
--
Chris Ball <cjb@laptop.org> <http://printf.net/>
One Laptop Per Child
^ permalink raw reply [flat|nested] 84+ messages in thread
* [PATCH 6/6] mmc: sdhci-pltfm: add pltfm-driver for imx35/51
@ 2010-09-29 20:14 ` Chris Ball
0 siblings, 0 replies; 84+ messages in thread
From: Chris Ball @ 2010-09-29 20:14 UTC (permalink / raw)
To: linux-arm-kernel
Hi Wolfram,
On Wed, Sep 29, 2010 at 10:08:04PM +0200, Wolfram Sang wrote:
> This driver adds basic support for the esdhc-core found on e.g.
> imx35/51. It adds up to the pltfm-core.
>
> Signed-off-by: Wolfram Sang <w.sang@pengutronix.de>
> Acked-by: Anton Vorontsov <cbouatmailru@gmail.com>
> ---
>
> Changes since last version:
>
> * some more -imx suffixes added
> * reworked the clock-matching. Now matching the pdev
>
> drivers/mmc/host/Kconfig | 10 +++
> drivers/mmc/host/Makefile | 1 +
> drivers/mmc/host/sdhci-esdhc-imx.c | 143 ++++++++++++++++++++++++++++++++++++
> drivers/mmc/host/sdhci-pltfm.c | 3 +
> drivers/mmc/host/sdhci-pltfm.h | 1 +
> 5 files changed, 158 insertions(+), 0 deletions(-)
> create mode 100644 drivers/mmc/host/sdhci-esdhc-imx.c
>
> diff --git a/drivers/mmc/host/Kconfig b/drivers/mmc/host/Kconfig
> index 6f12d5d..3c8c286 100644
> --- a/drivers/mmc/host/Kconfig
> +++ b/drivers/mmc/host/Kconfig
> @@ -143,6 +143,16 @@ config MMC_SDHCI_MV
>
> If unsure, say N.
>
> +config MMC_SDHCI_ESDHC_IMX
> + bool "SDHCI platform support for the Freescale eSDHC i.MX controller"
> + depends on MMC_SDHCI_PLTFM
> + select MMC_SDHCI_IO_ACCESSORS
> + help
> + This selects the Freescale eSDHC controller support on the platform
> + bus, found on platforms like mx35/51.
> +
> + If unsure, say N.
> +
> config MMC_SDHCI_S3C
> tristate "SDHCI support on Samsung S3C SoC"
> depends on MMC_SDHCI && PLAT_SAMSUNG
> diff --git a/drivers/mmc/host/Makefile b/drivers/mmc/host/Makefile
> index ef32c32..5f283b5 100644
> --- a/drivers/mmc/host/Makefile
> +++ b/drivers/mmc/host/Makefile
> @@ -38,6 +38,7 @@ obj-$(CONFIG_MMC_USHC) += ushc.o
> obj-$(CONFIG_MMC_SDHCI_PLTFM) += sdhci-platform.o
> sdhci-platform-y := sdhci-pltfm.o
> sdhci-platform-$(CONFIG_MMC_SDHCI_CNS3XXX) += sdhci-cns3xxx.o
> +sdhci-platform-$(CONFIG_MMC_SDHCI_ESDHC_IMX) += sdhci-esdhc-imx.o
>
> obj-$(CONFIG_MMC_SDHCI_OF) += sdhci-of.o
> sdhci-of-y := sdhci-of-core.o
> diff --git a/drivers/mmc/host/sdhci-esdhc-imx.c b/drivers/mmc/host/sdhci-esdhc-imx.c
> new file mode 100644
> index 0000000..68cf78c
> --- /dev/null
> +++ b/drivers/mmc/host/sdhci-esdhc-imx.c
> @@ -0,0 +1,143 @@
> +/*
> + * Freescale eSDHC i.MX controller driver for the platform bus.
> + *
> + * derived from the OF-version.
> + *
> + * Copyright (c) 2010 Pengutronix e.K.
> + * Author: Wolfram Sang <w.sang@pengutronix.de>
> + *
> + * 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.
> + */
> +
> +#include <linux/io.h>
> +#include <linux/delay.h>
> +#include <linux/err.h>
> +#include <linux/clk.h>
> +#include <linux/mmc/host.h>
> +#include <linux/mmc/sdhci-pltfm.h>
> +#include "sdhci.h"
> +#include "sdhci-pltfm.h"
> +#include "sdhci-esdhc.h"
> +
> +static inline void esdhc_clrset_le(struct sdhci_host *host, u32 mask, u32 val, int reg)
> +{
> + void __iomem *base = host->ioaddr + (reg & ~0x3);
> + u32 shift = (reg & 0x3) * 8;
> +
> + writel(((readl(base) & ~(mask << shift)) | (val << shift)), base);
> +}
> +
> +static u16 esdhc_readw_le(struct sdhci_host *host, int reg)
> +{
> + if (unlikely(reg == SDHCI_HOST_VERSION))
> + reg ^= 2;
> +
> + return readw(host->ioaddr + reg);
> +}
> +
> +static void esdhc_writew_le(struct sdhci_host *host, u16 val, int reg)
> +{
> + struct sdhci_pltfm_host *pltfm_host = sdhci_priv(host);
> +
> + switch (reg) {
> + case SDHCI_TRANSFER_MODE:
> + /*
> + * Postpone this write, we must do it together with a
> + * command write that is down below.
> + */
> + pltfm_host->scratchpad = val;
> + return;
> + case SDHCI_COMMAND:
> + writel(val << 16 | pltfm_host->scratchpad,
> + host->ioaddr + SDHCI_TRANSFER_MODE);
> + return;
> + case SDHCI_BLOCK_SIZE:
> + val &= ~SDHCI_MAKE_BLKSZ(0x7, 0);
> + break;
> + }
> + esdhc_clrset_le(host, 0xffff, val, reg);
> +}
> +
> +static void esdhc_writeb_le(struct sdhci_host *host, u8 val, int reg)
> +{
> + u32 new_val;
> +
> + switch (reg) {
> + case SDHCI_POWER_CONTROL:
> + /*
> + * FSL put some DMA bits here
> + * If your board has a regulator, code should be here
> + */
> + return;
> + case SDHCI_HOST_CONTROL:
> + /* FSL messed up here, so we can just keep those two */
> + new_val = val & (SDHCI_CTRL_LED | SDHCI_CTRL_4BITBUS);
> + /* ensure the endianess */
> + new_val |= ESDHC_HOST_CONTROL_LE;
> + /* DMA mode bits are shifted */
> + new_val |= (val & SDHCI_CTRL_DMA_MASK) << 5;
> +
> + esdhc_clrset_le(host, 0xffff, new_val, reg);
> + return;
> + }
> + esdhc_clrset_le(host, 0xff, val, reg);
> +}
> +
> +static unsigned int esdhc_pltfm_get_max_clock(struct sdhci_host *host)
> +{
> + struct sdhci_pltfm_host *pltfm_host = sdhci_priv(host);
> +
> + return clk_get_rate(pltfm_host->clk);
> +}
> +
> +static unsigned int esdhc_pltfm_get_min_clock(struct sdhci_host *host)
> +{
> + struct sdhci_pltfm_host *pltfm_host = sdhci_priv(host);
> +
> + return clk_get_rate(pltfm_host->clk) / 256 / 16;
> +}
> +
> +static int esdhc_pltfm_init(struct sdhci_host *host, struct sdhci_pltfm_data *pdata)
> +{
> + struct sdhci_pltfm_host *pltfm_host = sdhci_priv(host);
> + struct clk *clk;
> +
> + clk = clk_get(mmc_dev(host->mmc), NULL);
> + if (IS_ERR(clk)) {
> + dev_err(mmc_dev(host->mmc), "clk err\n");
> + return -ENODEV;
> + }
Is there a reason to return -ENODEV instead of PTR_ERR(clk)?
Patchset is looking good, thanks very much for keeping work going
on -pltfm,
--
Chris Ball <cjb@laptop.org> <http://printf.net/>
One Laptop Per Child
^ permalink raw reply [flat|nested] 84+ messages in thread
* [PATCH 0/6] SD/MMC driver for MX25/35/51
@ 2010-10-11 14:21 ` Wolfram Sang
0 siblings, 0 replies; 84+ messages in thread
From: Wolfram Sang @ 2010-10-11 14:21 UTC (permalink / raw)
To: linux-mmc; +Cc: linux-arm-kernel, Zhu Richard-R65037, Wolfram Sang
Here is the hopefully final (famous last words) version of my patch series. The
first four are still updates/improvements for sdhci and sdhci-pltfm and are of
generic interest, too. Thanks to Eric for the tests on MX25/35. Looking forward
to comments/applied-to-mmc-next-messages ;)
The series is based on mmc-next as of today and also available at
git://git.pengutronix.de/git/wsa/linux-2.6.git pcm043-mmc
Thanks,
Wolfram
Wolfram Sang (6):
mmc: sdhci-pltfm: Add structure for host-specific data
mmc: sdhci-pltfm: move .h-file into apropriate subdir
mmc: sdhci: introduce private get_ro
mmc: sdhci_pltfm: pass more data on custom init-call
mmc: sdhci-of-esdhc: factor out common stuff
mmc: sdhci-pltfm: add pltfm-driver for imx35/51
drivers/mmc/host/Kconfig | 10 +++
drivers/mmc/host/Makefile | 1 +
drivers/mmc/host/sdhci-cns3xxx.c | 2 +-
drivers/mmc/host/sdhci-esdhc-imx.c | 143 ++++++++++++++++++++++++++++++++++++
drivers/mmc/host/sdhci-esdhc.h | 81 ++++++++++++++++++++
drivers/mmc/host/sdhci-of-esdhc.c | 70 ++----------------
drivers/mmc/host/sdhci-pltfm.c | 23 ++++--
drivers/mmc/host/sdhci-pltfm.h | 10 ++-
drivers/mmc/host/sdhci.c | 11 ++-
drivers/mmc/host/sdhci.h | 1 +
include/linux/mmc/sdhci-pltfm.h | 35 +++++++++
include/linux/sdhci-pltfm.h | 35 ---------
12 files changed, 312 insertions(+), 110 deletions(-)
create mode 100644 drivers/mmc/host/sdhci-esdhc-imx.c
create mode 100644 drivers/mmc/host/sdhci-esdhc.h
create mode 100644 include/linux/mmc/sdhci-pltfm.h
delete mode 100644 include/linux/sdhci-pltfm.h
^ permalink raw reply [flat|nested] 84+ messages in thread
* [PATCH 0/6] SD/MMC driver for MX25/35/51
@ 2010-10-11 14:21 ` Wolfram Sang
0 siblings, 0 replies; 84+ messages in thread
From: Wolfram Sang @ 2010-10-11 14:21 UTC (permalink / raw)
To: linux-arm-kernel
Here is the hopefully final (famous last words) version of my patch series. The
first four are still updates/improvements for sdhci and sdhci-pltfm and are of
generic interest, too. Thanks to Eric for the tests on MX25/35. Looking forward
to comments/applied-to-mmc-next-messages ;)
The series is based on mmc-next as of today and also available at
git://git.pengutronix.de/git/wsa/linux-2.6.git pcm043-mmc
Thanks,
Wolfram
Wolfram Sang (6):
mmc: sdhci-pltfm: Add structure for host-specific data
mmc: sdhci-pltfm: move .h-file into apropriate subdir
mmc: sdhci: introduce private get_ro
mmc: sdhci_pltfm: pass more data on custom init-call
mmc: sdhci-of-esdhc: factor out common stuff
mmc: sdhci-pltfm: add pltfm-driver for imx35/51
drivers/mmc/host/Kconfig | 10 +++
drivers/mmc/host/Makefile | 1 +
drivers/mmc/host/sdhci-cns3xxx.c | 2 +-
drivers/mmc/host/sdhci-esdhc-imx.c | 143 ++++++++++++++++++++++++++++++++++++
drivers/mmc/host/sdhci-esdhc.h | 81 ++++++++++++++++++++
drivers/mmc/host/sdhci-of-esdhc.c | 70 ++----------------
drivers/mmc/host/sdhci-pltfm.c | 23 ++++--
drivers/mmc/host/sdhci-pltfm.h | 10 ++-
drivers/mmc/host/sdhci.c | 11 ++-
drivers/mmc/host/sdhci.h | 1 +
include/linux/mmc/sdhci-pltfm.h | 35 +++++++++
include/linux/sdhci-pltfm.h | 35 ---------
12 files changed, 312 insertions(+), 110 deletions(-)
create mode 100644 drivers/mmc/host/sdhci-esdhc-imx.c
create mode 100644 drivers/mmc/host/sdhci-esdhc.h
create mode 100644 include/linux/mmc/sdhci-pltfm.h
delete mode 100644 include/linux/sdhci-pltfm.h
^ permalink raw reply [flat|nested] 84+ messages in thread
* [PATCH 1/6] mmc: sdhci-pltfm: Add structure for host-specific data
2010-10-11 14:21 ` Wolfram Sang
@ 2010-10-11 14:21 ` Wolfram Sang
-1 siblings, 0 replies; 84+ messages in thread
From: Wolfram Sang @ 2010-10-11 14:21 UTC (permalink / raw)
To: linux-mmc
Cc: linux-arm-kernel, Zhu Richard-R65037, Wolfram Sang,
Richard Röjfors
We need to carry some information per host, e.g. the clock. Add a
structure for it and initialize it in the generic part. Also improve
the check for a parent.
Signed-off-by: Wolfram Sang <w.sang@pengutronix.de>
Cc: Richard Röjfors <richard.rojfors.ext@mocean-labs.com>
---
Changes since last version:
* Improved detection of a "real" parent device
drivers/mmc/host/sdhci-pltfm.c | 10 +++++++---
drivers/mmc/host/sdhci-pltfm.h | 7 +++++++
2 files changed, 14 insertions(+), 3 deletions(-)
diff --git a/drivers/mmc/host/sdhci-pltfm.c b/drivers/mmc/host/sdhci-pltfm.c
index 4f126de..730fdf5 100644
--- a/drivers/mmc/host/sdhci-pltfm.c
+++ b/drivers/mmc/host/sdhci-pltfm.c
@@ -55,6 +55,7 @@ static int __devinit sdhci_pltfm_probe(struct platform_device *pdev)
struct sdhci_pltfm_data *pdata = pdev->dev.platform_data;
const struct platform_device_id *platid = platform_get_device_id(pdev);
struct sdhci_host *host;
+ struct sdhci_pltfm_host *pltfm_host;
struct resource *iomem;
int ret;
@@ -71,16 +72,19 @@ static int __devinit sdhci_pltfm_probe(struct platform_device *pdev)
dev_err(&pdev->dev, "Invalid iomem size. You may "
"experience problems.\n");
- if (pdev->dev.parent)
- host = sdhci_alloc_host(pdev->dev.parent, 0);
+ /* Some PCI-based MFD need the parent here */
+ if (pdev->dev.parent != &platform_bus)
+ host = sdhci_alloc_host(pdev->dev.parent, sizeof(*pltfm_host));
else
- host = sdhci_alloc_host(&pdev->dev, 0);
+ host = sdhci_alloc_host(&pdev->dev, sizeof(*pltfm_host));
if (IS_ERR(host)) {
ret = PTR_ERR(host);
goto err;
}
+ pltfm_host = sdhci_priv(host);
+
host->hw_name = "platform";
if (pdata && pdata->ops)
host->ops = pdata->ops;
diff --git a/drivers/mmc/host/sdhci-pltfm.h b/drivers/mmc/host/sdhci-pltfm.h
index 900f329..93a0319 100644
--- a/drivers/mmc/host/sdhci-pltfm.h
+++ b/drivers/mmc/host/sdhci-pltfm.h
@@ -11,8 +11,15 @@
#ifndef _DRIVERS_MMC_SDHCI_PLTFM_H
#define _DRIVERS_MMC_SDHCI_PLTFM_H
+#include <linux/clk.h>
+#include <linux/types.h>
#include <linux/sdhci-pltfm.h>
+struct sdhci_pltfm_host {
+ struct clk *clk;
+ u32 scratchpad; /* to handle quirks across io-accessor calls */
+};
+
extern struct sdhci_pltfm_data sdhci_cns3xxx_pdata;
#endif /* _DRIVERS_MMC_SDHCI_PLTFM_H */
--
1.7.1
^ permalink raw reply related [flat|nested] 84+ messages in thread
* [PATCH 1/6] mmc: sdhci-pltfm: Add structure for host-specific data
@ 2010-10-11 14:21 ` Wolfram Sang
0 siblings, 0 replies; 84+ messages in thread
From: Wolfram Sang @ 2010-10-11 14:21 UTC (permalink / raw)
To: linux-arm-kernel
We need to carry some information per host, e.g. the clock. Add a
structure for it and initialize it in the generic part. Also improve
the check for a parent.
Signed-off-by: Wolfram Sang <w.sang@pengutronix.de>
Cc: Richard R?jfors <richard.rojfors.ext@mocean-labs.com>
---
Changes since last version:
* Improved detection of a "real" parent device
drivers/mmc/host/sdhci-pltfm.c | 10 +++++++---
drivers/mmc/host/sdhci-pltfm.h | 7 +++++++
2 files changed, 14 insertions(+), 3 deletions(-)
diff --git a/drivers/mmc/host/sdhci-pltfm.c b/drivers/mmc/host/sdhci-pltfm.c
index 4f126de..730fdf5 100644
--- a/drivers/mmc/host/sdhci-pltfm.c
+++ b/drivers/mmc/host/sdhci-pltfm.c
@@ -55,6 +55,7 @@ static int __devinit sdhci_pltfm_probe(struct platform_device *pdev)
struct sdhci_pltfm_data *pdata = pdev->dev.platform_data;
const struct platform_device_id *platid = platform_get_device_id(pdev);
struct sdhci_host *host;
+ struct sdhci_pltfm_host *pltfm_host;
struct resource *iomem;
int ret;
@@ -71,16 +72,19 @@ static int __devinit sdhci_pltfm_probe(struct platform_device *pdev)
dev_err(&pdev->dev, "Invalid iomem size. You may "
"experience problems.\n");
- if (pdev->dev.parent)
- host = sdhci_alloc_host(pdev->dev.parent, 0);
+ /* Some PCI-based MFD need the parent here */
+ if (pdev->dev.parent != &platform_bus)
+ host = sdhci_alloc_host(pdev->dev.parent, sizeof(*pltfm_host));
else
- host = sdhci_alloc_host(&pdev->dev, 0);
+ host = sdhci_alloc_host(&pdev->dev, sizeof(*pltfm_host));
if (IS_ERR(host)) {
ret = PTR_ERR(host);
goto err;
}
+ pltfm_host = sdhci_priv(host);
+
host->hw_name = "platform";
if (pdata && pdata->ops)
host->ops = pdata->ops;
diff --git a/drivers/mmc/host/sdhci-pltfm.h b/drivers/mmc/host/sdhci-pltfm.h
index 900f329..93a0319 100644
--- a/drivers/mmc/host/sdhci-pltfm.h
+++ b/drivers/mmc/host/sdhci-pltfm.h
@@ -11,8 +11,15 @@
#ifndef _DRIVERS_MMC_SDHCI_PLTFM_H
#define _DRIVERS_MMC_SDHCI_PLTFM_H
+#include <linux/clk.h>
+#include <linux/types.h>
#include <linux/sdhci-pltfm.h>
+struct sdhci_pltfm_host {
+ struct clk *clk;
+ u32 scratchpad; /* to handle quirks across io-accessor calls */
+};
+
extern struct sdhci_pltfm_data sdhci_cns3xxx_pdata;
#endif /* _DRIVERS_MMC_SDHCI_PLTFM_H */
--
1.7.1
^ permalink raw reply related [flat|nested] 84+ messages in thread
* [PATCH 2/6] mmc: sdhci-pltfm: move .h-file into apropriate subdir
2010-10-11 14:21 ` Wolfram Sang
@ 2010-10-11 14:21 ` Wolfram Sang
-1 siblings, 0 replies; 84+ messages in thread
From: Wolfram Sang @ 2010-10-11 14:21 UTC (permalink / raw)
To: linux-mmc; +Cc: linux-arm-kernel, Zhu Richard-R65037, Wolfram Sang
Make use of the mmc-directory.
Signed-off-by: Wolfram Sang <w.sang@pengutronix.de>
Acked-by: Anton Vorontsov <cbouatmailru@gmail.com>
Tested-by : Eric Bénard <eric@eukrea.com>
---
drivers/mmc/host/sdhci-cns3xxx.c | 2 +-
drivers/mmc/host/sdhci-pltfm.c | 2 +-
drivers/mmc/host/sdhci-pltfm.h | 2 +-
include/linux/mmc/sdhci-pltfm.h | 35 +++++++++++++++++++++++++++++++++++
include/linux/sdhci-pltfm.h | 35 -----------------------------------
5 files changed, 38 insertions(+), 38 deletions(-)
create mode 100644 include/linux/mmc/sdhci-pltfm.h
delete mode 100644 include/linux/sdhci-pltfm.h
diff --git a/drivers/mmc/host/sdhci-cns3xxx.c b/drivers/mmc/host/sdhci-cns3xxx.c
index b7050b3..9ebd1d7 100644
--- a/drivers/mmc/host/sdhci-cns3xxx.c
+++ b/drivers/mmc/host/sdhci-cns3xxx.c
@@ -15,7 +15,7 @@
#include <linux/delay.h>
#include <linux/device.h>
#include <linux/mmc/host.h>
-#include <linux/sdhci-pltfm.h>
+#include <linux/mmc/sdhci-pltfm.h>
#include <mach/cns3xxx.h>
#include "sdhci.h"
#include "sdhci-pltfm.h"
diff --git a/drivers/mmc/host/sdhci-pltfm.c b/drivers/mmc/host/sdhci-pltfm.c
index 730fdf5..685202b 100644
--- a/drivers/mmc/host/sdhci-pltfm.c
+++ b/drivers/mmc/host/sdhci-pltfm.c
@@ -30,7 +30,7 @@
#include <linux/mmc/host.h>
#include <linux/io.h>
-#include <linux/sdhci-pltfm.h>
+#include <linux/mmc/sdhci-pltfm.h>
#include "sdhci.h"
#include "sdhci-pltfm.h"
diff --git a/drivers/mmc/host/sdhci-pltfm.h b/drivers/mmc/host/sdhci-pltfm.h
index 93a0319..562b929 100644
--- a/drivers/mmc/host/sdhci-pltfm.h
+++ b/drivers/mmc/host/sdhci-pltfm.h
@@ -13,7 +13,7 @@
#include <linux/clk.h>
#include <linux/types.h>
-#include <linux/sdhci-pltfm.h>
+#include <linux/mmc/sdhci-pltfm.h>
struct sdhci_pltfm_host {
struct clk *clk;
diff --git a/include/linux/mmc/sdhci-pltfm.h b/include/linux/mmc/sdhci-pltfm.h
new file mode 100644
index 0000000..0239bd7
--- /dev/null
+++ b/include/linux/mmc/sdhci-pltfm.h
@@ -0,0 +1,35 @@
+/*
+ * Platform data declarations for the sdhci-pltfm driver.
+ *
+ * Copyright (c) 2010 MontaVista Software, LLC.
+ *
+ * Author: Anton Vorontsov <avorontsov@ru.mvista.com>
+ *
+ * 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_PLTFM_H
+#define _SDHCI_PLTFM_H
+
+struct sdhci_ops;
+struct sdhci_host;
+
+/**
+ * struct sdhci_pltfm_data - SDHCI platform-specific information & hooks
+ * @ops: optional pointer to the platform-provided SDHCI ops
+ * @quirks: optional SDHCI quirks
+ * @init: optional hook that is called during device probe, before the
+ * driver tries to access any SDHCI registers
+ * @exit: optional hook that is called during device removal
+ */
+struct sdhci_pltfm_data {
+ struct sdhci_ops *ops;
+ unsigned int quirks;
+ int (*init)(struct sdhci_host *host);
+ void (*exit)(struct sdhci_host *host);
+};
+
+#endif /* _SDHCI_PLTFM_H */
diff --git a/include/linux/sdhci-pltfm.h b/include/linux/sdhci-pltfm.h
deleted file mode 100644
index 0239bd7..0000000
--- a/include/linux/sdhci-pltfm.h
+++ /dev/null
@@ -1,35 +0,0 @@
-/*
- * Platform data declarations for the sdhci-pltfm driver.
- *
- * Copyright (c) 2010 MontaVista Software, LLC.
- *
- * Author: Anton Vorontsov <avorontsov@ru.mvista.com>
- *
- * 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_PLTFM_H
-#define _SDHCI_PLTFM_H
-
-struct sdhci_ops;
-struct sdhci_host;
-
-/**
- * struct sdhci_pltfm_data - SDHCI platform-specific information & hooks
- * @ops: optional pointer to the platform-provided SDHCI ops
- * @quirks: optional SDHCI quirks
- * @init: optional hook that is called during device probe, before the
- * driver tries to access any SDHCI registers
- * @exit: optional hook that is called during device removal
- */
-struct sdhci_pltfm_data {
- struct sdhci_ops *ops;
- unsigned int quirks;
- int (*init)(struct sdhci_host *host);
- void (*exit)(struct sdhci_host *host);
-};
-
-#endif /* _SDHCI_PLTFM_H */
--
1.7.1
^ permalink raw reply related [flat|nested] 84+ messages in thread
* [PATCH 2/6] mmc: sdhci-pltfm: move .h-file into apropriate subdir
@ 2010-10-11 14:21 ` Wolfram Sang
0 siblings, 0 replies; 84+ messages in thread
From: Wolfram Sang @ 2010-10-11 14:21 UTC (permalink / raw)
To: linux-arm-kernel
Make use of the mmc-directory.
Signed-off-by: Wolfram Sang <w.sang@pengutronix.de>
Acked-by: Anton Vorontsov <cbouatmailru@gmail.com>
Tested-by : Eric B?nard <eric@eukrea.com>
---
drivers/mmc/host/sdhci-cns3xxx.c | 2 +-
drivers/mmc/host/sdhci-pltfm.c | 2 +-
drivers/mmc/host/sdhci-pltfm.h | 2 +-
include/linux/mmc/sdhci-pltfm.h | 35 +++++++++++++++++++++++++++++++++++
include/linux/sdhci-pltfm.h | 35 -----------------------------------
5 files changed, 38 insertions(+), 38 deletions(-)
create mode 100644 include/linux/mmc/sdhci-pltfm.h
delete mode 100644 include/linux/sdhci-pltfm.h
diff --git a/drivers/mmc/host/sdhci-cns3xxx.c b/drivers/mmc/host/sdhci-cns3xxx.c
index b7050b3..9ebd1d7 100644
--- a/drivers/mmc/host/sdhci-cns3xxx.c
+++ b/drivers/mmc/host/sdhci-cns3xxx.c
@@ -15,7 +15,7 @@
#include <linux/delay.h>
#include <linux/device.h>
#include <linux/mmc/host.h>
-#include <linux/sdhci-pltfm.h>
+#include <linux/mmc/sdhci-pltfm.h>
#include <mach/cns3xxx.h>
#include "sdhci.h"
#include "sdhci-pltfm.h"
diff --git a/drivers/mmc/host/sdhci-pltfm.c b/drivers/mmc/host/sdhci-pltfm.c
index 730fdf5..685202b 100644
--- a/drivers/mmc/host/sdhci-pltfm.c
+++ b/drivers/mmc/host/sdhci-pltfm.c
@@ -30,7 +30,7 @@
#include <linux/mmc/host.h>
#include <linux/io.h>
-#include <linux/sdhci-pltfm.h>
+#include <linux/mmc/sdhci-pltfm.h>
#include "sdhci.h"
#include "sdhci-pltfm.h"
diff --git a/drivers/mmc/host/sdhci-pltfm.h b/drivers/mmc/host/sdhci-pltfm.h
index 93a0319..562b929 100644
--- a/drivers/mmc/host/sdhci-pltfm.h
+++ b/drivers/mmc/host/sdhci-pltfm.h
@@ -13,7 +13,7 @@
#include <linux/clk.h>
#include <linux/types.h>
-#include <linux/sdhci-pltfm.h>
+#include <linux/mmc/sdhci-pltfm.h>
struct sdhci_pltfm_host {
struct clk *clk;
diff --git a/include/linux/mmc/sdhci-pltfm.h b/include/linux/mmc/sdhci-pltfm.h
new file mode 100644
index 0000000..0239bd7
--- /dev/null
+++ b/include/linux/mmc/sdhci-pltfm.h
@@ -0,0 +1,35 @@
+/*
+ * Platform data declarations for the sdhci-pltfm driver.
+ *
+ * Copyright (c) 2010 MontaVista Software, LLC.
+ *
+ * Author: Anton Vorontsov <avorontsov@ru.mvista.com>
+ *
+ * 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_PLTFM_H
+#define _SDHCI_PLTFM_H
+
+struct sdhci_ops;
+struct sdhci_host;
+
+/**
+ * struct sdhci_pltfm_data - SDHCI platform-specific information & hooks
+ * @ops: optional pointer to the platform-provided SDHCI ops
+ * @quirks: optional SDHCI quirks
+ * @init: optional hook that is called during device probe, before the
+ * driver tries to access any SDHCI registers
+ * @exit: optional hook that is called during device removal
+ */
+struct sdhci_pltfm_data {
+ struct sdhci_ops *ops;
+ unsigned int quirks;
+ int (*init)(struct sdhci_host *host);
+ void (*exit)(struct sdhci_host *host);
+};
+
+#endif /* _SDHCI_PLTFM_H */
diff --git a/include/linux/sdhci-pltfm.h b/include/linux/sdhci-pltfm.h
deleted file mode 100644
index 0239bd7..0000000
--- a/include/linux/sdhci-pltfm.h
+++ /dev/null
@@ -1,35 +0,0 @@
-/*
- * Platform data declarations for the sdhci-pltfm driver.
- *
- * Copyright (c) 2010 MontaVista Software, LLC.
- *
- * Author: Anton Vorontsov <avorontsov@ru.mvista.com>
- *
- * 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_PLTFM_H
-#define _SDHCI_PLTFM_H
-
-struct sdhci_ops;
-struct sdhci_host;
-
-/**
- * struct sdhci_pltfm_data - SDHCI platform-specific information & hooks
- * @ops: optional pointer to the platform-provided SDHCI ops
- * @quirks: optional SDHCI quirks
- * @init: optional hook that is called during device probe, before the
- * driver tries to access any SDHCI registers
- * @exit: optional hook that is called during device removal
- */
-struct sdhci_pltfm_data {
- struct sdhci_ops *ops;
- unsigned int quirks;
- int (*init)(struct sdhci_host *host);
- void (*exit)(struct sdhci_host *host);
-};
-
-#endif /* _SDHCI_PLTFM_H */
--
1.7.1
^ permalink raw reply related [flat|nested] 84+ messages in thread
* [PATCH 3/6] mmc: sdhci: introduce private get_ro
2010-10-11 14:21 ` Wolfram Sang
@ 2010-10-11 14:21 ` Wolfram Sang
-1 siblings, 0 replies; 84+ messages in thread
From: Wolfram Sang @ 2010-10-11 14:21 UTC (permalink / raw)
To: linux-mmc; +Cc: linux-arm-kernel, Zhu Richard-R65037, Wolfram Sang
Some controllers handle their write-protection differently. Introduce a
callback to be able to handle it, ensuring the same locking takes place
for it.
Signed-off-by: Wolfram Sang <w.sang@pengutronix.de>
Tested-by : Eric Bénard <eric@eukrea.com>
---
drivers/mmc/host/sdhci.c | 11 +++++++----
drivers/mmc/host/sdhci.h | 1 +
2 files changed, 8 insertions(+), 4 deletions(-)
diff --git a/drivers/mmc/host/sdhci.c b/drivers/mmc/host/sdhci.c
index 9cb60ba..970110a 100644
--- a/drivers/mmc/host/sdhci.c
+++ b/drivers/mmc/host/sdhci.c
@@ -1231,14 +1231,17 @@ static int sdhci_get_ro(struct mmc_host *mmc)
if (host->flags & SDHCI_DEVICE_DEAD)
present = 0;
+ else if (host->ops->get_ro)
+ present = host->ops->get_ro(host);
else
- present = sdhci_readl(host, SDHCI_PRESENT_STATE);
+ present = !(sdhci_readl(host, SDHCI_PRESENT_STATE)
+ & SDHCI_WRITE_PROTECT);
spin_unlock_irqrestore(&host->lock, flags);
- if (host->quirks & SDHCI_QUIRK_INVERTED_WRITE_PROTECT)
- return !!(present & SDHCI_WRITE_PROTECT);
- return !(present & SDHCI_WRITE_PROTECT);
+ /* This quirk needs to be replaced by a callback-function later */
+ return host->quirks & SDHCI_QUIRK_INVERTED_WRITE_PROTECT ?
+ !present : present;
}
static void sdhci_enable_sdio_irq(struct mmc_host *mmc, int enable)
diff --git a/drivers/mmc/host/sdhci.h b/drivers/mmc/host/sdhci.h
index bfcd611..b7b8a3b 100644
--- a/drivers/mmc/host/sdhci.h
+++ b/drivers/mmc/host/sdhci.h
@@ -214,6 +214,7 @@ struct sdhci_ops {
unsigned int (*get_timeout_clock)(struct sdhci_host *host);
void (*platform_send_init_74_clocks)(struct sdhci_host *host,
u8 power_mode);
+ unsigned int (*get_ro)(struct sdhci_host *host);
};
#ifdef CONFIG_MMC_SDHCI_IO_ACCESSORS
--
1.7.1
^ permalink raw reply related [flat|nested] 84+ messages in thread
* [PATCH 3/6] mmc: sdhci: introduce private get_ro
@ 2010-10-11 14:21 ` Wolfram Sang
0 siblings, 0 replies; 84+ messages in thread
From: Wolfram Sang @ 2010-10-11 14:21 UTC (permalink / raw)
To: linux-arm-kernel
Some controllers handle their write-protection differently. Introduce a
callback to be able to handle it, ensuring the same locking takes place
for it.
Signed-off-by: Wolfram Sang <w.sang@pengutronix.de>
Tested-by : Eric B?nard <eric@eukrea.com>
---
drivers/mmc/host/sdhci.c | 11 +++++++----
drivers/mmc/host/sdhci.h | 1 +
2 files changed, 8 insertions(+), 4 deletions(-)
diff --git a/drivers/mmc/host/sdhci.c b/drivers/mmc/host/sdhci.c
index 9cb60ba..970110a 100644
--- a/drivers/mmc/host/sdhci.c
+++ b/drivers/mmc/host/sdhci.c
@@ -1231,14 +1231,17 @@ static int sdhci_get_ro(struct mmc_host *mmc)
if (host->flags & SDHCI_DEVICE_DEAD)
present = 0;
+ else if (host->ops->get_ro)
+ present = host->ops->get_ro(host);
else
- present = sdhci_readl(host, SDHCI_PRESENT_STATE);
+ present = !(sdhci_readl(host, SDHCI_PRESENT_STATE)
+ & SDHCI_WRITE_PROTECT);
spin_unlock_irqrestore(&host->lock, flags);
- if (host->quirks & SDHCI_QUIRK_INVERTED_WRITE_PROTECT)
- return !!(present & SDHCI_WRITE_PROTECT);
- return !(present & SDHCI_WRITE_PROTECT);
+ /* This quirk needs to be replaced by a callback-function later */
+ return host->quirks & SDHCI_QUIRK_INVERTED_WRITE_PROTECT ?
+ !present : present;
}
static void sdhci_enable_sdio_irq(struct mmc_host *mmc, int enable)
diff --git a/drivers/mmc/host/sdhci.h b/drivers/mmc/host/sdhci.h
index bfcd611..b7b8a3b 100644
--- a/drivers/mmc/host/sdhci.h
+++ b/drivers/mmc/host/sdhci.h
@@ -214,6 +214,7 @@ struct sdhci_ops {
unsigned int (*get_timeout_clock)(struct sdhci_host *host);
void (*platform_send_init_74_clocks)(struct sdhci_host *host,
u8 power_mode);
+ unsigned int (*get_ro)(struct sdhci_host *host);
};
#ifdef CONFIG_MMC_SDHCI_IO_ACCESSORS
--
1.7.1
^ permalink raw reply related [flat|nested] 84+ messages in thread
* [PATCH 4/6] mmc: sdhci_pltfm: pass more data on custom init-call
2010-10-11 14:21 ` Wolfram Sang
@ 2010-10-11 14:21 ` Wolfram Sang
-1 siblings, 0 replies; 84+ messages in thread
From: Wolfram Sang @ 2010-10-11 14:21 UTC (permalink / raw)
To: linux-mmc; +Cc: linux-arm-kernel, Zhu Richard-R65037, Wolfram Sang
The custom init call may need more data to perform its job, so we pass
it a pointer to pdata, too. Also, always use the platform_id specific
data even if platform_data is present. Doing that, platform_data can
additionally be parsed by init() for board-specific information (via
sdhci->mmc->parent).
(Note: the old behaviour was that you could override the platform_id
specific data with your own. However, one can still do this by using the
"sdhci" id instead of "sdhci-<something>".)
Signed-off-by: Wolfram Sang <w.sang@pengutronix.de>
Tested-by : Eric Bénard <eric@eukrea.com>
---
drivers/mmc/host/sdhci-pltfm.c | 8 +++++---
include/linux/mmc/sdhci-pltfm.h | 2 +-
2 files changed, 6 insertions(+), 4 deletions(-)
diff --git a/drivers/mmc/host/sdhci-pltfm.c b/drivers/mmc/host/sdhci-pltfm.c
index 685202b..00e8a8a 100644
--- a/drivers/mmc/host/sdhci-pltfm.c
+++ b/drivers/mmc/host/sdhci-pltfm.c
@@ -52,15 +52,17 @@ static struct sdhci_ops sdhci_pltfm_ops = {
static int __devinit sdhci_pltfm_probe(struct platform_device *pdev)
{
- struct sdhci_pltfm_data *pdata = pdev->dev.platform_data;
const struct platform_device_id *platid = platform_get_device_id(pdev);
+ struct sdhci_pltfm_data *pdata;
struct sdhci_host *host;
struct sdhci_pltfm_host *pltfm_host;
struct resource *iomem;
int ret;
- if (!pdata && platid && platid->driver_data)
+ if (platid && platid->driver_data)
pdata = (void *)platid->driver_data;
+ else
+ pdata = pdev->dev.platform_data;
iomem = platform_get_resource(pdev, IORESOURCE_MEM, 0);
if (!iomem) {
@@ -109,7 +111,7 @@ static int __devinit sdhci_pltfm_probe(struct platform_device *pdev)
}
if (pdata && pdata->init) {
- ret = pdata->init(host);
+ ret = pdata->init(host, pdata);
if (ret)
goto err_plat_init;
}
diff --git a/include/linux/mmc/sdhci-pltfm.h b/include/linux/mmc/sdhci-pltfm.h
index 0239bd7..548d59d 100644
--- a/include/linux/mmc/sdhci-pltfm.h
+++ b/include/linux/mmc/sdhci-pltfm.h
@@ -28,7 +28,7 @@ struct sdhci_host;
struct sdhci_pltfm_data {
struct sdhci_ops *ops;
unsigned int quirks;
- int (*init)(struct sdhci_host *host);
+ int (*init)(struct sdhci_host *host, struct sdhci_pltfm_data *pdata);
void (*exit)(struct sdhci_host *host);
};
--
1.7.1
^ permalink raw reply related [flat|nested] 84+ messages in thread
* [PATCH 4/6] mmc: sdhci_pltfm: pass more data on custom init-call
@ 2010-10-11 14:21 ` Wolfram Sang
0 siblings, 0 replies; 84+ messages in thread
From: Wolfram Sang @ 2010-10-11 14:21 UTC (permalink / raw)
To: linux-arm-kernel
The custom init call may need more data to perform its job, so we pass
it a pointer to pdata, too. Also, always use the platform_id specific
data even if platform_data is present. Doing that, platform_data can
additionally be parsed by init() for board-specific information (via
sdhci->mmc->parent).
(Note: the old behaviour was that you could override the platform_id
specific data with your own. However, one can still do this by using the
"sdhci" id instead of "sdhci-<something>".)
Signed-off-by: Wolfram Sang <w.sang@pengutronix.de>
Tested-by : Eric B?nard <eric@eukrea.com>
---
drivers/mmc/host/sdhci-pltfm.c | 8 +++++---
include/linux/mmc/sdhci-pltfm.h | 2 +-
2 files changed, 6 insertions(+), 4 deletions(-)
diff --git a/drivers/mmc/host/sdhci-pltfm.c b/drivers/mmc/host/sdhci-pltfm.c
index 685202b..00e8a8a 100644
--- a/drivers/mmc/host/sdhci-pltfm.c
+++ b/drivers/mmc/host/sdhci-pltfm.c
@@ -52,15 +52,17 @@ static struct sdhci_ops sdhci_pltfm_ops = {
static int __devinit sdhci_pltfm_probe(struct platform_device *pdev)
{
- struct sdhci_pltfm_data *pdata = pdev->dev.platform_data;
const struct platform_device_id *platid = platform_get_device_id(pdev);
+ struct sdhci_pltfm_data *pdata;
struct sdhci_host *host;
struct sdhci_pltfm_host *pltfm_host;
struct resource *iomem;
int ret;
- if (!pdata && platid && platid->driver_data)
+ if (platid && platid->driver_data)
pdata = (void *)platid->driver_data;
+ else
+ pdata = pdev->dev.platform_data;
iomem = platform_get_resource(pdev, IORESOURCE_MEM, 0);
if (!iomem) {
@@ -109,7 +111,7 @@ static int __devinit sdhci_pltfm_probe(struct platform_device *pdev)
}
if (pdata && pdata->init) {
- ret = pdata->init(host);
+ ret = pdata->init(host, pdata);
if (ret)
goto err_plat_init;
}
diff --git a/include/linux/mmc/sdhci-pltfm.h b/include/linux/mmc/sdhci-pltfm.h
index 0239bd7..548d59d 100644
--- a/include/linux/mmc/sdhci-pltfm.h
+++ b/include/linux/mmc/sdhci-pltfm.h
@@ -28,7 +28,7 @@ struct sdhci_host;
struct sdhci_pltfm_data {
struct sdhci_ops *ops;
unsigned int quirks;
- int (*init)(struct sdhci_host *host);
+ int (*init)(struct sdhci_host *host, struct sdhci_pltfm_data *pdata);
void (*exit)(struct sdhci_host *host);
};
--
1.7.1
^ permalink raw reply related [flat|nested] 84+ messages in thread
* [PATCH 5/6] mmc: sdhci-of-esdhc: factor out common stuff
2010-10-11 14:21 ` Wolfram Sang
@ 2010-10-11 14:21 ` Wolfram Sang
-1 siblings, 0 replies; 84+ messages in thread
From: Wolfram Sang @ 2010-10-11 14:21 UTC (permalink / raw)
To: linux-mmc; +Cc: linux-arm-kernel, Zhu Richard-R65037, Wolfram Sang
Put everything which can be shared between the OF and platform version
of this driver into a local .h-file.
Signed-off-by: Wolfram Sang <w.sang@pengutronix.de>
Tested-by : Eric Bénard <eric@eukrea.com>
---
drivers/mmc/host/sdhci-esdhc.h | 81 +++++++++++++++++++++++++++++++++++++
drivers/mmc/host/sdhci-of-esdhc.c | 70 ++++----------------------------
2 files changed, 89 insertions(+), 62 deletions(-)
create mode 100644 drivers/mmc/host/sdhci-esdhc.h
diff --git a/drivers/mmc/host/sdhci-esdhc.h b/drivers/mmc/host/sdhci-esdhc.h
new file mode 100644
index 0000000..7ccc8cb
--- /dev/null
+++ b/drivers/mmc/host/sdhci-esdhc.h
@@ -0,0 +1,81 @@
+/*
+ * Freescale eSDHC controller driver generics for OF and pltfm.
+ *
+ * Copyright (c) 2007 Freescale Semiconductor, Inc.
+ * Copyright (c) 2009 MontaVista Software, Inc.
+ * Copyright (c) 2010 Pengutronix e.K.
+ * Author: Wolfram Sang <w.sang@pengutronix.de>
+ *
+ * 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.
+ */
+
+#ifndef _DRIVERS_MMC_SDHCI_ESDHC_H
+#define _DRIVERS_MMC_SDHCI_ESDHC_H
+
+/*
+ * Ops and quirks for the Freescale eSDHC controller.
+ */
+
+#define ESDHC_DEFAULT_QUIRKS (SDHCI_QUIRK_FORCE_BLK_SZ_2048 | \
+ SDHCI_QUIRK_BROKEN_CARD_DETECTION | \
+ SDHCI_QUIRK_NO_BUSY_IRQ | \
+ SDHCI_QUIRK_NONSTANDARD_CLOCK | \
+ SDHCI_QUIRK_DATA_TIMEOUT_USES_SDCLK | \
+ SDHCI_QUIRK_PIO_NEEDS_DELAY | \
+ SDHCI_QUIRK_RESTORE_IRQS_AFTER_RESET | \
+ SDHCI_QUIRK_NO_CARD_NO_RESET)
+
+#define ESDHC_SYSTEM_CONTROL 0x2c
+#define ESDHC_CLOCK_MASK 0x0000fff0
+#define ESDHC_PREDIV_SHIFT 8
+#define ESDHC_DIVIDER_SHIFT 4
+#define ESDHC_CLOCK_PEREN 0x00000004
+#define ESDHC_CLOCK_HCKEN 0x00000002
+#define ESDHC_CLOCK_IPGEN 0x00000001
+
+/* pltfm-specific */
+#define ESDHC_HOST_CONTROL_LE 0x20
+
+/* OF-specific */
+#define ESDHC_DMA_SYSCTL 0x40c
+#define ESDHC_DMA_SNOOP 0x00000040
+
+#define ESDHC_HOST_CONTROL_RES 0x05
+
+static inline void esdhc_set_clock(struct sdhci_host *host, unsigned int clock)
+{
+ int pre_div = 2;
+ int div = 1;
+ u32 temp;
+
+ temp = sdhci_readl(host, ESDHC_SYSTEM_CONTROL);
+ temp &= ~(ESDHC_CLOCK_IPGEN | ESDHC_CLOCK_HCKEN | ESDHC_CLOCK_PEREN | ESDHC_CLOCK_MASK);
+ sdhci_writel(host, temp, ESDHC_SYSTEM_CONTROL);
+
+ if (clock == 0)
+ goto out;
+
+ while (host->max_clk / pre_div / 16 > clock && pre_div < 256)
+ pre_div *= 2;
+
+ while (host->max_clk / pre_div / div > clock && div < 16)
+ div++;
+
+ dev_dbg(mmc_dev(host->mmc), "desired SD clock: %d, actual: %d\n",
+ clock, host->max_clk / pre_div / div);
+
+ pre_div >>= 1;
+ div--;
+
+ temp = sdhci_readl(host, ESDHC_SYSTEM_CONTROL);
+ temp |= (ESDHC_CLOCK_IPGEN | ESDHC_CLOCK_HCKEN | ESDHC_CLOCK_PEREN |
+ (div << ESDHC_DIVIDER_SHIFT) | (pre_div << ESDHC_PREDIV_SHIFT));
+ sdhci_writel(host, temp, ESDHC_SYSTEM_CONTROL);
+ mdelay(100);
+out:
+ host->clock = clock;
+}
+
+#endif /* _DRIVERS_MMC_SDHCI_ESDHC_H */
diff --git a/drivers/mmc/host/sdhci-of-esdhc.c b/drivers/mmc/host/sdhci-of-esdhc.c
index c8623de..277fcb9 100644
--- a/drivers/mmc/host/sdhci-of-esdhc.c
+++ b/drivers/mmc/host/sdhci-of-esdhc.c
@@ -18,23 +18,7 @@
#include <linux/mmc/host.h>
#include "sdhci-of.h"
#include "sdhci.h"
-
-/*
- * Ops and quirks for the Freescale eSDHC controller.
- */
-
-#define ESDHC_DMA_SYSCTL 0x40c
-#define ESDHC_DMA_SNOOP 0x00000040
-
-#define ESDHC_SYSTEM_CONTROL 0x2c
-#define ESDHC_CLOCK_MASK 0x0000fff0
-#define ESDHC_PREDIV_SHIFT 8
-#define ESDHC_DIVIDER_SHIFT 4
-#define ESDHC_CLOCK_PEREN 0x00000004
-#define ESDHC_CLOCK_HCKEN 0x00000002
-#define ESDHC_CLOCK_IPGEN 0x00000001
-
-#define ESDHC_HOST_CONTROL_RES 0x05
+#include "sdhci-esdhc.c"
static u16 esdhc_readw(struct sdhci_host *host, int reg)
{
@@ -68,51 +52,20 @@ static void esdhc_writeb(struct sdhci_host *host, u8 val, int reg)
sdhci_be32bs_writeb(host, val, reg);
}
-static void esdhc_set_clock(struct sdhci_host *host, unsigned int clock)
-{
- int pre_div = 2;
- int div = 1;
-
- clrbits32(host->ioaddr + ESDHC_SYSTEM_CONTROL, ESDHC_CLOCK_IPGEN |
- ESDHC_CLOCK_HCKEN | ESDHC_CLOCK_PEREN | ESDHC_CLOCK_MASK);
-
- if (clock == 0)
- goto out;
-
- while (host->max_clk / pre_div / 16 > clock && pre_div < 256)
- pre_div *= 2;
-
- while (host->max_clk / pre_div / div > clock && div < 16)
- div++;
-
- dev_dbg(mmc_dev(host->mmc), "desired SD clock: %d, actual: %d\n",
- clock, host->max_clk / pre_div / div);
-
- pre_div >>= 1;
- div--;
-
- setbits32(host->ioaddr + ESDHC_SYSTEM_CONTROL, ESDHC_CLOCK_IPGEN |
- ESDHC_CLOCK_HCKEN | ESDHC_CLOCK_PEREN |
- div << ESDHC_DIVIDER_SHIFT | pre_div << ESDHC_PREDIV_SHIFT);
- mdelay(100);
-out:
- host->clock = clock;
-}
-
-static int esdhc_enable_dma(struct sdhci_host *host)
+static int esdhc_of_enable_dma(struct sdhci_host *host)
{
setbits32(host->ioaddr + ESDHC_DMA_SYSCTL, ESDHC_DMA_SNOOP);
return 0;
}
-static unsigned int esdhc_get_max_clock(struct sdhci_host *host)
+static unsigned int esdhc_of_get_max_clock(struct sdhci_host *host)
{
struct sdhci_of_host *of_host = sdhci_priv(host);
return of_host->clock;
}
-static unsigned int esdhc_get_min_clock(struct sdhci_host *host)
+static unsigned int esdhc_of_get_min_clock(struct sdhci_host *host)
{
struct sdhci_of_host *of_host = sdhci_priv(host);
@@ -120,14 +73,7 @@ static unsigned int esdhc_get_min_clock(struct sdhci_host *host)
}
struct sdhci_of_data sdhci_esdhc = {
- .quirks = SDHCI_QUIRK_FORCE_BLK_SZ_2048 |
- SDHCI_QUIRK_BROKEN_CARD_DETECTION |
- SDHCI_QUIRK_NO_BUSY_IRQ |
- SDHCI_QUIRK_NONSTANDARD_CLOCK |
- SDHCI_QUIRK_DATA_TIMEOUT_USES_SDCLK |
- SDHCI_QUIRK_PIO_NEEDS_DELAY |
- SDHCI_QUIRK_RESTORE_IRQS_AFTER_RESET |
- SDHCI_QUIRK_NO_CARD_NO_RESET,
+ .quirks = ESDHC_DEFAULT_QUIRKS,
.ops = {
.read_l = sdhci_be32bs_readl,
.read_w = esdhc_readw,
@@ -136,8 +82,8 @@ struct sdhci_of_data sdhci_esdhc = {
.write_w = esdhc_writew,
.write_b = esdhc_writeb,
.set_clock = esdhc_set_clock,
- .enable_dma = esdhc_enable_dma,
- .get_max_clock = esdhc_get_max_clock,
- .get_min_clock = esdhc_get_min_clock,
+ .enable_dma = esdhc_of_enable_dma,
+ .get_max_clock = esdhc_of_get_max_clock,
+ .get_min_clock = esdhc_of_get_min_clock,
},
};
--
1.7.1
^ permalink raw reply related [flat|nested] 84+ messages in thread
* [PATCH 5/6] mmc: sdhci-of-esdhc: factor out common stuff
@ 2010-10-11 14:21 ` Wolfram Sang
0 siblings, 0 replies; 84+ messages in thread
From: Wolfram Sang @ 2010-10-11 14:21 UTC (permalink / raw)
To: linux-arm-kernel
Put everything which can be shared between the OF and platform version
of this driver into a local .h-file.
Signed-off-by: Wolfram Sang <w.sang@pengutronix.de>
Tested-by : Eric B?nard <eric@eukrea.com>
---
drivers/mmc/host/sdhci-esdhc.h | 81 +++++++++++++++++++++++++++++++++++++
drivers/mmc/host/sdhci-of-esdhc.c | 70 ++++----------------------------
2 files changed, 89 insertions(+), 62 deletions(-)
create mode 100644 drivers/mmc/host/sdhci-esdhc.h
diff --git a/drivers/mmc/host/sdhci-esdhc.h b/drivers/mmc/host/sdhci-esdhc.h
new file mode 100644
index 0000000..7ccc8cb
--- /dev/null
+++ b/drivers/mmc/host/sdhci-esdhc.h
@@ -0,0 +1,81 @@
+/*
+ * Freescale eSDHC controller driver generics for OF and pltfm.
+ *
+ * Copyright (c) 2007 Freescale Semiconductor, Inc.
+ * Copyright (c) 2009 MontaVista Software, Inc.
+ * Copyright (c) 2010 Pengutronix e.K.
+ * Author: Wolfram Sang <w.sang@pengutronix.de>
+ *
+ * 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.
+ */
+
+#ifndef _DRIVERS_MMC_SDHCI_ESDHC_H
+#define _DRIVERS_MMC_SDHCI_ESDHC_H
+
+/*
+ * Ops and quirks for the Freescale eSDHC controller.
+ */
+
+#define ESDHC_DEFAULT_QUIRKS (SDHCI_QUIRK_FORCE_BLK_SZ_2048 | \
+ SDHCI_QUIRK_BROKEN_CARD_DETECTION | \
+ SDHCI_QUIRK_NO_BUSY_IRQ | \
+ SDHCI_QUIRK_NONSTANDARD_CLOCK | \
+ SDHCI_QUIRK_DATA_TIMEOUT_USES_SDCLK | \
+ SDHCI_QUIRK_PIO_NEEDS_DELAY | \
+ SDHCI_QUIRK_RESTORE_IRQS_AFTER_RESET | \
+ SDHCI_QUIRK_NO_CARD_NO_RESET)
+
+#define ESDHC_SYSTEM_CONTROL 0x2c
+#define ESDHC_CLOCK_MASK 0x0000fff0
+#define ESDHC_PREDIV_SHIFT 8
+#define ESDHC_DIVIDER_SHIFT 4
+#define ESDHC_CLOCK_PEREN 0x00000004
+#define ESDHC_CLOCK_HCKEN 0x00000002
+#define ESDHC_CLOCK_IPGEN 0x00000001
+
+/* pltfm-specific */
+#define ESDHC_HOST_CONTROL_LE 0x20
+
+/* OF-specific */
+#define ESDHC_DMA_SYSCTL 0x40c
+#define ESDHC_DMA_SNOOP 0x00000040
+
+#define ESDHC_HOST_CONTROL_RES 0x05
+
+static inline void esdhc_set_clock(struct sdhci_host *host, unsigned int clock)
+{
+ int pre_div = 2;
+ int div = 1;
+ u32 temp;
+
+ temp = sdhci_readl(host, ESDHC_SYSTEM_CONTROL);
+ temp &= ~(ESDHC_CLOCK_IPGEN | ESDHC_CLOCK_HCKEN | ESDHC_CLOCK_PEREN | ESDHC_CLOCK_MASK);
+ sdhci_writel(host, temp, ESDHC_SYSTEM_CONTROL);
+
+ if (clock == 0)
+ goto out;
+
+ while (host->max_clk / pre_div / 16 > clock && pre_div < 256)
+ pre_div *= 2;
+
+ while (host->max_clk / pre_div / div > clock && div < 16)
+ div++;
+
+ dev_dbg(mmc_dev(host->mmc), "desired SD clock: %d, actual: %d\n",
+ clock, host->max_clk / pre_div / div);
+
+ pre_div >>= 1;
+ div--;
+
+ temp = sdhci_readl(host, ESDHC_SYSTEM_CONTROL);
+ temp |= (ESDHC_CLOCK_IPGEN | ESDHC_CLOCK_HCKEN | ESDHC_CLOCK_PEREN |
+ (div << ESDHC_DIVIDER_SHIFT) | (pre_div << ESDHC_PREDIV_SHIFT));
+ sdhci_writel(host, temp, ESDHC_SYSTEM_CONTROL);
+ mdelay(100);
+out:
+ host->clock = clock;
+}
+
+#endif /* _DRIVERS_MMC_SDHCI_ESDHC_H */
diff --git a/drivers/mmc/host/sdhci-of-esdhc.c b/drivers/mmc/host/sdhci-of-esdhc.c
index c8623de..277fcb9 100644
--- a/drivers/mmc/host/sdhci-of-esdhc.c
+++ b/drivers/mmc/host/sdhci-of-esdhc.c
@@ -18,23 +18,7 @@
#include <linux/mmc/host.h>
#include "sdhci-of.h"
#include "sdhci.h"
-
-/*
- * Ops and quirks for the Freescale eSDHC controller.
- */
-
-#define ESDHC_DMA_SYSCTL 0x40c
-#define ESDHC_DMA_SNOOP 0x00000040
-
-#define ESDHC_SYSTEM_CONTROL 0x2c
-#define ESDHC_CLOCK_MASK 0x0000fff0
-#define ESDHC_PREDIV_SHIFT 8
-#define ESDHC_DIVIDER_SHIFT 4
-#define ESDHC_CLOCK_PEREN 0x00000004
-#define ESDHC_CLOCK_HCKEN 0x00000002
-#define ESDHC_CLOCK_IPGEN 0x00000001
-
-#define ESDHC_HOST_CONTROL_RES 0x05
+#include "sdhci-esdhc.c"
static u16 esdhc_readw(struct sdhci_host *host, int reg)
{
@@ -68,51 +52,20 @@ static void esdhc_writeb(struct sdhci_host *host, u8 val, int reg)
sdhci_be32bs_writeb(host, val, reg);
}
-static void esdhc_set_clock(struct sdhci_host *host, unsigned int clock)
-{
- int pre_div = 2;
- int div = 1;
-
- clrbits32(host->ioaddr + ESDHC_SYSTEM_CONTROL, ESDHC_CLOCK_IPGEN |
- ESDHC_CLOCK_HCKEN | ESDHC_CLOCK_PEREN | ESDHC_CLOCK_MASK);
-
- if (clock == 0)
- goto out;
-
- while (host->max_clk / pre_div / 16 > clock && pre_div < 256)
- pre_div *= 2;
-
- while (host->max_clk / pre_div / div > clock && div < 16)
- div++;
-
- dev_dbg(mmc_dev(host->mmc), "desired SD clock: %d, actual: %d\n",
- clock, host->max_clk / pre_div / div);
-
- pre_div >>= 1;
- div--;
-
- setbits32(host->ioaddr + ESDHC_SYSTEM_CONTROL, ESDHC_CLOCK_IPGEN |
- ESDHC_CLOCK_HCKEN | ESDHC_CLOCK_PEREN |
- div << ESDHC_DIVIDER_SHIFT | pre_div << ESDHC_PREDIV_SHIFT);
- mdelay(100);
-out:
- host->clock = clock;
-}
-
-static int esdhc_enable_dma(struct sdhci_host *host)
+static int esdhc_of_enable_dma(struct sdhci_host *host)
{
setbits32(host->ioaddr + ESDHC_DMA_SYSCTL, ESDHC_DMA_SNOOP);
return 0;
}
-static unsigned int esdhc_get_max_clock(struct sdhci_host *host)
+static unsigned int esdhc_of_get_max_clock(struct sdhci_host *host)
{
struct sdhci_of_host *of_host = sdhci_priv(host);
return of_host->clock;
}
-static unsigned int esdhc_get_min_clock(struct sdhci_host *host)
+static unsigned int esdhc_of_get_min_clock(struct sdhci_host *host)
{
struct sdhci_of_host *of_host = sdhci_priv(host);
@@ -120,14 +73,7 @@ static unsigned int esdhc_get_min_clock(struct sdhci_host *host)
}
struct sdhci_of_data sdhci_esdhc = {
- .quirks = SDHCI_QUIRK_FORCE_BLK_SZ_2048 |
- SDHCI_QUIRK_BROKEN_CARD_DETECTION |
- SDHCI_QUIRK_NO_BUSY_IRQ |
- SDHCI_QUIRK_NONSTANDARD_CLOCK |
- SDHCI_QUIRK_DATA_TIMEOUT_USES_SDCLK |
- SDHCI_QUIRK_PIO_NEEDS_DELAY |
- SDHCI_QUIRK_RESTORE_IRQS_AFTER_RESET |
- SDHCI_QUIRK_NO_CARD_NO_RESET,
+ .quirks = ESDHC_DEFAULT_QUIRKS,
.ops = {
.read_l = sdhci_be32bs_readl,
.read_w = esdhc_readw,
@@ -136,8 +82,8 @@ struct sdhci_of_data sdhci_esdhc = {
.write_w = esdhc_writew,
.write_b = esdhc_writeb,
.set_clock = esdhc_set_clock,
- .enable_dma = esdhc_enable_dma,
- .get_max_clock = esdhc_get_max_clock,
- .get_min_clock = esdhc_get_min_clock,
+ .enable_dma = esdhc_of_enable_dma,
+ .get_max_clock = esdhc_of_get_max_clock,
+ .get_min_clock = esdhc_of_get_min_clock,
},
};
--
1.7.1
^ permalink raw reply related [flat|nested] 84+ messages in thread
* [PATCH 6/6] mmc: sdhci-pltfm: add pltfm-driver for imx35/51
2010-10-11 14:21 ` Wolfram Sang
@ 2010-10-11 14:21 ` Wolfram Sang
-1 siblings, 0 replies; 84+ messages in thread
From: Wolfram Sang @ 2010-10-11 14:21 UTC (permalink / raw)
To: linux-mmc; +Cc: linux-arm-kernel, Zhu Richard-R65037, Wolfram Sang
This driver adds basic support for the esdhc-core found on e.g.
imx35/51. It adds up to the pltfm-core.
Signed-off-by: Wolfram Sang <w.sang@pengutronix.de>
Acked-by: Anton Vorontsov <cbouatmailru@gmail.com>
Tested-by : Eric Bénard <eric@eukrea.com>
---
Changes since last version:
* use PTR_ERR if clk_get failed
drivers/mmc/host/Kconfig | 10 +++
drivers/mmc/host/Makefile | 1 +
drivers/mmc/host/sdhci-esdhc-imx.c | 143 ++++++++++++++++++++++++++++++++++++
drivers/mmc/host/sdhci-pltfm.c | 3 +
drivers/mmc/host/sdhci-pltfm.h | 1 +
5 files changed, 158 insertions(+), 0 deletions(-)
create mode 100644 drivers/mmc/host/sdhci-esdhc-imx.c
diff --git a/drivers/mmc/host/Kconfig b/drivers/mmc/host/Kconfig
index 8de7b9e..7b07f10 100644
--- a/drivers/mmc/host/Kconfig
+++ b/drivers/mmc/host/Kconfig
@@ -130,6 +130,16 @@ config MMC_SDHCI_CNS3XXX
If unsure, say N.
+config MMC_SDHCI_ESDHC_IMX
+ bool "SDHCI platform support for the Freescale eSDHC i.MX controller"
+ depends on MMC_SDHCI_PLTFM
+ select MMC_SDHCI_IO_ACCESSORS
+ help
+ This selects the Freescale eSDHC controller support on the platform
+ bus, found on platforms like mx35/51.
+
+ If unsure, say N.
+
config MMC_SDHCI_S3C
tristate "SDHCI support on Samsung S3C SoC"
depends on MMC_SDHCI && PLAT_SAMSUNG
diff --git a/drivers/mmc/host/Makefile b/drivers/mmc/host/Makefile
index eae5d62..6c4ac67 100644
--- a/drivers/mmc/host/Makefile
+++ b/drivers/mmc/host/Makefile
@@ -37,6 +37,7 @@ obj-$(CONFIG_MMC_USHC) += ushc.o
obj-$(CONFIG_MMC_SDHCI_PLTFM) += sdhci-platform.o
sdhci-platform-y := sdhci-pltfm.o
sdhci-platform-$(CONFIG_MMC_SDHCI_CNS3XXX) += sdhci-cns3xxx.o
+sdhci-platform-$(CONFIG_MMC_SDHCI_ESDHC_IMX) += sdhci-esdhc-imx.o
obj-$(CONFIG_MMC_SDHCI_OF) += sdhci-of.o
sdhci-of-y := sdhci-of-core.o
diff --git a/drivers/mmc/host/sdhci-esdhc-imx.c b/drivers/mmc/host/sdhci-esdhc-imx.c
new file mode 100644
index 0000000..2e9cca1
--- /dev/null
+++ b/drivers/mmc/host/sdhci-esdhc-imx.c
@@ -0,0 +1,143 @@
+/*
+ * Freescale eSDHC i.MX controller driver for the platform bus.
+ *
+ * derived from the OF-version.
+ *
+ * Copyright (c) 2010 Pengutronix e.K.
+ * Author: Wolfram Sang <w.sang@pengutronix.de>
+ *
+ * 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.
+ */
+
+#include <linux/io.h>
+#include <linux/delay.h>
+#include <linux/err.h>
+#include <linux/clk.h>
+#include <linux/mmc/host.h>
+#include <linux/mmc/sdhci-pltfm.h>
+#include "sdhci.h"
+#include "sdhci-pltfm.h"
+#include "sdhci-esdhc.h"
+
+static inline void esdhc_clrset_le(struct sdhci_host *host, u32 mask, u32 val, int reg)
+{
+ void __iomem *base = host->ioaddr + (reg & ~0x3);
+ u32 shift = (reg & 0x3) * 8;
+
+ writel(((readl(base) & ~(mask << shift)) | (val << shift)), base);
+}
+
+static u16 esdhc_readw_le(struct sdhci_host *host, int reg)
+{
+ if (unlikely(reg == SDHCI_HOST_VERSION))
+ reg ^= 2;
+
+ return readw(host->ioaddr + reg);
+}
+
+static void esdhc_writew_le(struct sdhci_host *host, u16 val, int reg)
+{
+ struct sdhci_pltfm_host *pltfm_host = sdhci_priv(host);
+
+ switch (reg) {
+ case SDHCI_TRANSFER_MODE:
+ /*
+ * Postpone this write, we must do it together with a
+ * command write that is down below.
+ */
+ pltfm_host->scratchpad = val;
+ return;
+ case SDHCI_COMMAND:
+ writel(val << 16 | pltfm_host->scratchpad,
+ host->ioaddr + SDHCI_TRANSFER_MODE);
+ return;
+ case SDHCI_BLOCK_SIZE:
+ val &= ~SDHCI_MAKE_BLKSZ(0x7, 0);
+ break;
+ }
+ esdhc_clrset_le(host, 0xffff, val, reg);
+}
+
+static void esdhc_writeb_le(struct sdhci_host *host, u8 val, int reg)
+{
+ u32 new_val;
+
+ switch (reg) {
+ case SDHCI_POWER_CONTROL:
+ /*
+ * FSL put some DMA bits here
+ * If your board has a regulator, code should be here
+ */
+ return;
+ case SDHCI_HOST_CONTROL:
+ /* FSL messed up here, so we can just keep those two */
+ new_val = val & (SDHCI_CTRL_LED | SDHCI_CTRL_4BITBUS);
+ /* ensure the endianess */
+ new_val |= ESDHC_HOST_CONTROL_LE;
+ /* DMA mode bits are shifted */
+ new_val |= (val & SDHCI_CTRL_DMA_MASK) << 5;
+
+ esdhc_clrset_le(host, 0xffff, new_val, reg);
+ return;
+ }
+ esdhc_clrset_le(host, 0xff, val, reg);
+}
+
+static unsigned int esdhc_pltfm_get_max_clock(struct sdhci_host *host)
+{
+ struct sdhci_pltfm_host *pltfm_host = sdhci_priv(host);
+
+ return clk_get_rate(pltfm_host->clk);
+}
+
+static unsigned int esdhc_pltfm_get_min_clock(struct sdhci_host *host)
+{
+ struct sdhci_pltfm_host *pltfm_host = sdhci_priv(host);
+
+ return clk_get_rate(pltfm_host->clk) / 256 / 16;
+}
+
+static int esdhc_pltfm_init(struct sdhci_host *host, struct sdhci_pltfm_data *pdata)
+{
+ struct sdhci_pltfm_host *pltfm_host = sdhci_priv(host);
+ struct clk *clk;
+
+ clk = clk_get(mmc_dev(host->mmc), NULL);
+ if (IS_ERR(clk)) {
+ dev_err(mmc_dev(host->mmc), "clk err\n");
+ return PTR_ERR(clk);
+ }
+ clk_enable(clk);
+ pltfm_host->clk = clk;
+
+ return 0;
+}
+
+static void esdhc_pltfm_exit(struct sdhci_host *host)
+{
+ struct sdhci_pltfm_host *pltfm_host = sdhci_priv(host);
+
+ clk_disable(pltfm_host->clk);
+ clk_put(pltfm_host->clk);
+}
+
+static struct sdhci_ops sdhci_esdhc_ops = {
+ .read_w = esdhc_readw_le,
+ .write_w = esdhc_writew_le,
+ .write_b = esdhc_writeb_le,
+ .set_clock = esdhc_set_clock,
+ .get_max_clock = esdhc_pltfm_get_max_clock,
+ .get_min_clock = esdhc_pltfm_get_min_clock,
+};
+
+struct sdhci_pltfm_data sdhci_esdhc_imx_pdata = {
+ .quirks = ESDHC_DEFAULT_QUIRKS | SDHCI_QUIRK_NO_MULTIBLOCK
+ | SDHCI_QUIRK_BROKEN_ADMA,
+ /* ADMA has issues. Might be fixable */
+ /* NO_MULTIBLOCK might be MX35 only (Errata: ENGcm07207) */
+ .ops = &sdhci_esdhc_ops,
+ .init = esdhc_pltfm_init,
+ .exit = esdhc_pltfm_exit,
+};
diff --git a/drivers/mmc/host/sdhci-pltfm.c b/drivers/mmc/host/sdhci-pltfm.c
index 00e8a8a..0502f89 100644
--- a/drivers/mmc/host/sdhci-pltfm.c
+++ b/drivers/mmc/host/sdhci-pltfm.c
@@ -167,6 +167,9 @@ static const struct platform_device_id sdhci_pltfm_ids[] = {
#ifdef CONFIG_MMC_SDHCI_CNS3XXX
{ "sdhci-cns3xxx", (kernel_ulong_t)&sdhci_cns3xxx_pdata },
#endif
+#ifdef CONFIG_MMC_SDHCI_ESDHC_IMX
+ { "sdhci-esdhc-imx", (kernel_ulong_t)&sdhci_esdhc_imx_pdata },
+#endif
{ },
};
MODULE_DEVICE_TABLE(platform, sdhci_pltfm_ids);
diff --git a/drivers/mmc/host/sdhci-pltfm.h b/drivers/mmc/host/sdhci-pltfm.h
index 562b929..c1bfe48 100644
--- a/drivers/mmc/host/sdhci-pltfm.h
+++ b/drivers/mmc/host/sdhci-pltfm.h
@@ -21,5 +21,6 @@ struct sdhci_pltfm_host {
};
extern struct sdhci_pltfm_data sdhci_cns3xxx_pdata;
+extern struct sdhci_pltfm_data sdhci_esdhc_imx_pdata;
#endif /* _DRIVERS_MMC_SDHCI_PLTFM_H */
--
1.7.1
^ permalink raw reply related [flat|nested] 84+ messages in thread
* [PATCH 6/6] mmc: sdhci-pltfm: add pltfm-driver for imx35/51
@ 2010-10-11 14:21 ` Wolfram Sang
0 siblings, 0 replies; 84+ messages in thread
From: Wolfram Sang @ 2010-10-11 14:21 UTC (permalink / raw)
To: linux-arm-kernel
This driver adds basic support for the esdhc-core found on e.g.
imx35/51. It adds up to the pltfm-core.
Signed-off-by: Wolfram Sang <w.sang@pengutronix.de>
Acked-by: Anton Vorontsov <cbouatmailru@gmail.com>
Tested-by : Eric B?nard <eric@eukrea.com>
---
Changes since last version:
* use PTR_ERR if clk_get failed
drivers/mmc/host/Kconfig | 10 +++
drivers/mmc/host/Makefile | 1 +
drivers/mmc/host/sdhci-esdhc-imx.c | 143 ++++++++++++++++++++++++++++++++++++
drivers/mmc/host/sdhci-pltfm.c | 3 +
drivers/mmc/host/sdhci-pltfm.h | 1 +
5 files changed, 158 insertions(+), 0 deletions(-)
create mode 100644 drivers/mmc/host/sdhci-esdhc-imx.c
diff --git a/drivers/mmc/host/Kconfig b/drivers/mmc/host/Kconfig
index 8de7b9e..7b07f10 100644
--- a/drivers/mmc/host/Kconfig
+++ b/drivers/mmc/host/Kconfig
@@ -130,6 +130,16 @@ config MMC_SDHCI_CNS3XXX
If unsure, say N.
+config MMC_SDHCI_ESDHC_IMX
+ bool "SDHCI platform support for the Freescale eSDHC i.MX controller"
+ depends on MMC_SDHCI_PLTFM
+ select MMC_SDHCI_IO_ACCESSORS
+ help
+ This selects the Freescale eSDHC controller support on the platform
+ bus, found on platforms like mx35/51.
+
+ If unsure, say N.
+
config MMC_SDHCI_S3C
tristate "SDHCI support on Samsung S3C SoC"
depends on MMC_SDHCI && PLAT_SAMSUNG
diff --git a/drivers/mmc/host/Makefile b/drivers/mmc/host/Makefile
index eae5d62..6c4ac67 100644
--- a/drivers/mmc/host/Makefile
+++ b/drivers/mmc/host/Makefile
@@ -37,6 +37,7 @@ obj-$(CONFIG_MMC_USHC) += ushc.o
obj-$(CONFIG_MMC_SDHCI_PLTFM) += sdhci-platform.o
sdhci-platform-y := sdhci-pltfm.o
sdhci-platform-$(CONFIG_MMC_SDHCI_CNS3XXX) += sdhci-cns3xxx.o
+sdhci-platform-$(CONFIG_MMC_SDHCI_ESDHC_IMX) += sdhci-esdhc-imx.o
obj-$(CONFIG_MMC_SDHCI_OF) += sdhci-of.o
sdhci-of-y := sdhci-of-core.o
diff --git a/drivers/mmc/host/sdhci-esdhc-imx.c b/drivers/mmc/host/sdhci-esdhc-imx.c
new file mode 100644
index 0000000..2e9cca1
--- /dev/null
+++ b/drivers/mmc/host/sdhci-esdhc-imx.c
@@ -0,0 +1,143 @@
+/*
+ * Freescale eSDHC i.MX controller driver for the platform bus.
+ *
+ * derived from the OF-version.
+ *
+ * Copyright (c) 2010 Pengutronix e.K.
+ * Author: Wolfram Sang <w.sang@pengutronix.de>
+ *
+ * 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.
+ */
+
+#include <linux/io.h>
+#include <linux/delay.h>
+#include <linux/err.h>
+#include <linux/clk.h>
+#include <linux/mmc/host.h>
+#include <linux/mmc/sdhci-pltfm.h>
+#include "sdhci.h"
+#include "sdhci-pltfm.h"
+#include "sdhci-esdhc.h"
+
+static inline void esdhc_clrset_le(struct sdhci_host *host, u32 mask, u32 val, int reg)
+{
+ void __iomem *base = host->ioaddr + (reg & ~0x3);
+ u32 shift = (reg & 0x3) * 8;
+
+ writel(((readl(base) & ~(mask << shift)) | (val << shift)), base);
+}
+
+static u16 esdhc_readw_le(struct sdhci_host *host, int reg)
+{
+ if (unlikely(reg == SDHCI_HOST_VERSION))
+ reg ^= 2;
+
+ return readw(host->ioaddr + reg);
+}
+
+static void esdhc_writew_le(struct sdhci_host *host, u16 val, int reg)
+{
+ struct sdhci_pltfm_host *pltfm_host = sdhci_priv(host);
+
+ switch (reg) {
+ case SDHCI_TRANSFER_MODE:
+ /*
+ * Postpone this write, we must do it together with a
+ * command write that is down below.
+ */
+ pltfm_host->scratchpad = val;
+ return;
+ case SDHCI_COMMAND:
+ writel(val << 16 | pltfm_host->scratchpad,
+ host->ioaddr + SDHCI_TRANSFER_MODE);
+ return;
+ case SDHCI_BLOCK_SIZE:
+ val &= ~SDHCI_MAKE_BLKSZ(0x7, 0);
+ break;
+ }
+ esdhc_clrset_le(host, 0xffff, val, reg);
+}
+
+static void esdhc_writeb_le(struct sdhci_host *host, u8 val, int reg)
+{
+ u32 new_val;
+
+ switch (reg) {
+ case SDHCI_POWER_CONTROL:
+ /*
+ * FSL put some DMA bits here
+ * If your board has a regulator, code should be here
+ */
+ return;
+ case SDHCI_HOST_CONTROL:
+ /* FSL messed up here, so we can just keep those two */
+ new_val = val & (SDHCI_CTRL_LED | SDHCI_CTRL_4BITBUS);
+ /* ensure the endianess */
+ new_val |= ESDHC_HOST_CONTROL_LE;
+ /* DMA mode bits are shifted */
+ new_val |= (val & SDHCI_CTRL_DMA_MASK) << 5;
+
+ esdhc_clrset_le(host, 0xffff, new_val, reg);
+ return;
+ }
+ esdhc_clrset_le(host, 0xff, val, reg);
+}
+
+static unsigned int esdhc_pltfm_get_max_clock(struct sdhci_host *host)
+{
+ struct sdhci_pltfm_host *pltfm_host = sdhci_priv(host);
+
+ return clk_get_rate(pltfm_host->clk);
+}
+
+static unsigned int esdhc_pltfm_get_min_clock(struct sdhci_host *host)
+{
+ struct sdhci_pltfm_host *pltfm_host = sdhci_priv(host);
+
+ return clk_get_rate(pltfm_host->clk) / 256 / 16;
+}
+
+static int esdhc_pltfm_init(struct sdhci_host *host, struct sdhci_pltfm_data *pdata)
+{
+ struct sdhci_pltfm_host *pltfm_host = sdhci_priv(host);
+ struct clk *clk;
+
+ clk = clk_get(mmc_dev(host->mmc), NULL);
+ if (IS_ERR(clk)) {
+ dev_err(mmc_dev(host->mmc), "clk err\n");
+ return PTR_ERR(clk);
+ }
+ clk_enable(clk);
+ pltfm_host->clk = clk;
+
+ return 0;
+}
+
+static void esdhc_pltfm_exit(struct sdhci_host *host)
+{
+ struct sdhci_pltfm_host *pltfm_host = sdhci_priv(host);
+
+ clk_disable(pltfm_host->clk);
+ clk_put(pltfm_host->clk);
+}
+
+static struct sdhci_ops sdhci_esdhc_ops = {
+ .read_w = esdhc_readw_le,
+ .write_w = esdhc_writew_le,
+ .write_b = esdhc_writeb_le,
+ .set_clock = esdhc_set_clock,
+ .get_max_clock = esdhc_pltfm_get_max_clock,
+ .get_min_clock = esdhc_pltfm_get_min_clock,
+};
+
+struct sdhci_pltfm_data sdhci_esdhc_imx_pdata = {
+ .quirks = ESDHC_DEFAULT_QUIRKS | SDHCI_QUIRK_NO_MULTIBLOCK
+ | SDHCI_QUIRK_BROKEN_ADMA,
+ /* ADMA has issues. Might be fixable */
+ /* NO_MULTIBLOCK might be MX35 only (Errata: ENGcm07207) */
+ .ops = &sdhci_esdhc_ops,
+ .init = esdhc_pltfm_init,
+ .exit = esdhc_pltfm_exit,
+};
diff --git a/drivers/mmc/host/sdhci-pltfm.c b/drivers/mmc/host/sdhci-pltfm.c
index 00e8a8a..0502f89 100644
--- a/drivers/mmc/host/sdhci-pltfm.c
+++ b/drivers/mmc/host/sdhci-pltfm.c
@@ -167,6 +167,9 @@ static const struct platform_device_id sdhci_pltfm_ids[] = {
#ifdef CONFIG_MMC_SDHCI_CNS3XXX
{ "sdhci-cns3xxx", (kernel_ulong_t)&sdhci_cns3xxx_pdata },
#endif
+#ifdef CONFIG_MMC_SDHCI_ESDHC_IMX
+ { "sdhci-esdhc-imx", (kernel_ulong_t)&sdhci_esdhc_imx_pdata },
+#endif
{ },
};
MODULE_DEVICE_TABLE(platform, sdhci_pltfm_ids);
diff --git a/drivers/mmc/host/sdhci-pltfm.h b/drivers/mmc/host/sdhci-pltfm.h
index 562b929..c1bfe48 100644
--- a/drivers/mmc/host/sdhci-pltfm.h
+++ b/drivers/mmc/host/sdhci-pltfm.h
@@ -21,5 +21,6 @@ struct sdhci_pltfm_host {
};
extern struct sdhci_pltfm_data sdhci_cns3xxx_pdata;
+extern struct sdhci_pltfm_data sdhci_esdhc_imx_pdata;
#endif /* _DRIVERS_MMC_SDHCI_PLTFM_H */
--
1.7.1
^ permalink raw reply related [flat|nested] 84+ messages in thread
* Re: [PATCH 0/6] SD/MMC driver for MX25/35/51
2010-10-11 14:21 ` Wolfram Sang
@ 2010-10-11 16:32 ` Chris Ball
-1 siblings, 0 replies; 84+ messages in thread
From: Chris Ball @ 2010-10-11 16:32 UTC (permalink / raw)
To: Wolfram Sang; +Cc: linux-mmc, linux-arm-kernel, Zhu Richard-R65037
Hi Wolfram,
On Mon, Oct 11, 2010 at 04:21:00PM +0200, Wolfram Sang wrote:
> Wolfram Sang (6):
> mmc: sdhci-pltfm: Add structure for host-specific data
> mmc: sdhci-pltfm: move .h-file into apropriate subdir
> mmc: sdhci: introduce private get_ro
> mmc: sdhci_pltfm: pass more data on custom init-call
> mmc: sdhci-of-esdhc: factor out common stuff
> mmc: sdhci-pltfm: add pltfm-driver for imx35/51
Mind fixing up the >80 char lines in the last two patches? It's just:
WARNING: line over 80 characters
#79: FILE: drivers/mmc/host/sdhci-esdhc.h:54:
+ temp &= ~(ESDHC_CLOCK_IPGEN | ESDHC_CLOCK_HCKEN | ESDHC_CLOCK_PEREN | ESDHC_CLOCK_MASK);
WARNING: line over 80 characters
#99: FILE: drivers/mmc/host/sdhci-esdhc.h:74:
+ (div << ESDHC_DIVIDER_SHIFT) | (pre_div << ESDHC_PREDIV_SHIFT));
WARNING: line over 80 characters
#86: FILE: drivers/mmc/host/sdhci-esdhc-imx.c:24:
+static inline void esdhc_clrset_le(struct sdhci_host *host, u32 mask, u32 val, int reg)
WARNING: line over 80 characters
#164: FILE: drivers/mmc/host/sdhci-esdhc-imx.c:102:
+static int esdhc_pltfm_init(struct sdhci_host *host, struct sdhci_pltfm_data *pdata)
Thanks,
--
Chris Ball <cjb@laptop.org> <http://printf.net/>
One Laptop Per Child
^ permalink raw reply [flat|nested] 84+ messages in thread
* [PATCH 0/6] SD/MMC driver for MX25/35/51
@ 2010-10-11 16:32 ` Chris Ball
0 siblings, 0 replies; 84+ messages in thread
From: Chris Ball @ 2010-10-11 16:32 UTC (permalink / raw)
To: linux-arm-kernel
Hi Wolfram,
On Mon, Oct 11, 2010 at 04:21:00PM +0200, Wolfram Sang wrote:
> Wolfram Sang (6):
> mmc: sdhci-pltfm: Add structure for host-specific data
> mmc: sdhci-pltfm: move .h-file into apropriate subdir
> mmc: sdhci: introduce private get_ro
> mmc: sdhci_pltfm: pass more data on custom init-call
> mmc: sdhci-of-esdhc: factor out common stuff
> mmc: sdhci-pltfm: add pltfm-driver for imx35/51
Mind fixing up the >80 char lines in the last two patches? It's just:
WARNING: line over 80 characters
#79: FILE: drivers/mmc/host/sdhci-esdhc.h:54:
+ temp &= ~(ESDHC_CLOCK_IPGEN | ESDHC_CLOCK_HCKEN | ESDHC_CLOCK_PEREN | ESDHC_CLOCK_MASK);
WARNING: line over 80 characters
#99: FILE: drivers/mmc/host/sdhci-esdhc.h:74:
+ (div << ESDHC_DIVIDER_SHIFT) | (pre_div << ESDHC_PREDIV_SHIFT));
WARNING: line over 80 characters
#86: FILE: drivers/mmc/host/sdhci-esdhc-imx.c:24:
+static inline void esdhc_clrset_le(struct sdhci_host *host, u32 mask, u32 val, int reg)
WARNING: line over 80 characters
#164: FILE: drivers/mmc/host/sdhci-esdhc-imx.c:102:
+static int esdhc_pltfm_init(struct sdhci_host *host, struct sdhci_pltfm_data *pdata)
Thanks,
--
Chris Ball <cjb@laptop.org> <http://printf.net/>
One Laptop Per Child
^ permalink raw reply [flat|nested] 84+ messages in thread
* Re: [PATCH 0/6] SD/MMC driver for MX25/35/51
2010-10-11 16:32 ` Chris Ball
@ 2010-10-11 16:44 ` Wolfram Sang
-1 siblings, 0 replies; 84+ messages in thread
From: Wolfram Sang @ 2010-10-11 16:44 UTC (permalink / raw)
To: Chris Ball; +Cc: linux-mmc, linux-arm-kernel, Zhu Richard-R65037
[-- Attachment #1: Type: text/plain, Size: 691 bytes --]
> > Wolfram Sang (6):
> > mmc: sdhci-pltfm: Add structure for host-specific data
> > mmc: sdhci-pltfm: move .h-file into apropriate subdir
> > mmc: sdhci: introduce private get_ro
> > mmc: sdhci_pltfm: pass more data on custom init-call
> > mmc: sdhci-of-esdhc: factor out common stuff
> > mmc: sdhci-pltfm: add pltfm-driver for imx35/51
>
> Mind fixing up the >80 char lines in the last two patches? It's just:
Sigh, I don't think it will help the readability of the code, but if it can't
be helped...
--
Pengutronix e.K. | Wolfram Sang |
Industrial Linux Solutions | http://www.pengutronix.de/ |
[-- Attachment #2: Digital signature --]
[-- Type: application/pgp-signature, Size: 197 bytes --]
^ permalink raw reply [flat|nested] 84+ messages in thread
* [PATCH 0/6] SD/MMC driver for MX25/35/51
@ 2010-10-11 16:44 ` Wolfram Sang
0 siblings, 0 replies; 84+ messages in thread
From: Wolfram Sang @ 2010-10-11 16:44 UTC (permalink / raw)
To: linux-arm-kernel
> > Wolfram Sang (6):
> > mmc: sdhci-pltfm: Add structure for host-specific data
> > mmc: sdhci-pltfm: move .h-file into apropriate subdir
> > mmc: sdhci: introduce private get_ro
> > mmc: sdhci_pltfm: pass more data on custom init-call
> > mmc: sdhci-of-esdhc: factor out common stuff
> > mmc: sdhci-pltfm: add pltfm-driver for imx35/51
>
> Mind fixing up the >80 char lines in the last two patches? It's just:
Sigh, I don't think it will help the readability of the code, but if it can't
be helped...
--
Pengutronix e.K. | Wolfram Sang |
Industrial Linux Solutions | http://www.pengutronix.de/ |
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 197 bytes
Desc: Digital signature
URL: <http://lists.infradead.org/pipermail/linux-arm-kernel/attachments/20101011/10b93013/attachment.sig>
^ permalink raw reply [flat|nested] 84+ messages in thread
* Re: [PATCH 0/6] SD/MMC driver for MX25/35/51
2010-10-11 16:44 ` Wolfram Sang
@ 2010-10-11 16:59 ` Chris Ball
-1 siblings, 0 replies; 84+ messages in thread
From: Chris Ball @ 2010-10-11 16:59 UTC (permalink / raw)
To: Wolfram Sang; +Cc: linux-mmc, linux-arm-kernel, Zhu Richard-R65037
Hi Wolfram,
On Mon, Oct 11, 2010 at 06:44:59PM +0200, Wolfram Sang wrote:
> > Mind fixing up the >80 char lines in the last two patches? It's just:
>
> Sigh, I don't think it will help the readability of the code, but if it can't
> be helped...
Okay. Perhaps as a compromise, just reflow the two lines in 5/6 and
leave the long prototypes in 6/6 as they are? (For the second hunk
in 5/6, you could just pull the start of the line back two cols.)
Thanks,
--
Chris Ball <cjb@laptop.org> <http://printf.net/>
One Laptop Per Child
^ permalink raw reply [flat|nested] 84+ messages in thread
* [PATCH 0/6] SD/MMC driver for MX25/35/51
@ 2010-10-11 16:59 ` Chris Ball
0 siblings, 0 replies; 84+ messages in thread
From: Chris Ball @ 2010-10-11 16:59 UTC (permalink / raw)
To: linux-arm-kernel
Hi Wolfram,
On Mon, Oct 11, 2010 at 06:44:59PM +0200, Wolfram Sang wrote:
> > Mind fixing up the >80 char lines in the last two patches? It's just:
>
> Sigh, I don't think it will help the readability of the code, but if it can't
> be helped...
Okay. Perhaps as a compromise, just reflow the two lines in 5/6 and
leave the long prototypes in 6/6 as they are? (For the second hunk
in 5/6, you could just pull the start of the line back two cols.)
Thanks,
--
Chris Ball <cjb@laptop.org> <http://printf.net/>
One Laptop Per Child
^ permalink raw reply [flat|nested] 84+ messages in thread
* [PATCH v2 5/6] mmc: sdhci-of-esdhc: factor out common stuff
2010-10-11 14:21 ` Wolfram Sang
@ 2010-10-11 17:10 ` Wolfram Sang
-1 siblings, 0 replies; 84+ messages in thread
From: Wolfram Sang @ 2010-10-11 17:10 UTC (permalink / raw)
To: linux-mmc; +Cc: linux-arm-kernel, Zhu Richard-R65037, Chris Ball, Wolfram Sang
Put everything which can be shared between the OF and platform version
of this driver into a local .h-file.
Signed-off-by: Wolfram Sang <w.sang@pengutronix.de>
Tested-by : Eric Bénard <eric@eukrea.com>
---
80 char/line fixed. Untested as of now, can only test tomorrow again.
Should be safe changes, though (famous last words again ;)))
drivers/mmc/host/sdhci-esdhc.h | 83 +++++++++++++++++++++++++++++++++++++
drivers/mmc/host/sdhci-of-esdhc.c | 70 ++++---------------------------
2 files changed, 91 insertions(+), 62 deletions(-)
create mode 100644 drivers/mmc/host/sdhci-esdhc.h
diff --git a/drivers/mmc/host/sdhci-esdhc.h b/drivers/mmc/host/sdhci-esdhc.h
new file mode 100644
index 0000000..afaf1bc
--- /dev/null
+++ b/drivers/mmc/host/sdhci-esdhc.h
@@ -0,0 +1,83 @@
+/*
+ * Freescale eSDHC controller driver generics for OF and pltfm.
+ *
+ * Copyright (c) 2007 Freescale Semiconductor, Inc.
+ * Copyright (c) 2009 MontaVista Software, Inc.
+ * Copyright (c) 2010 Pengutronix e.K.
+ * Author: Wolfram Sang <w.sang@pengutronix.de>
+ *
+ * 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.
+ */
+
+#ifndef _DRIVERS_MMC_SDHCI_ESDHC_H
+#define _DRIVERS_MMC_SDHCI_ESDHC_H
+
+/*
+ * Ops and quirks for the Freescale eSDHC controller.
+ */
+
+#define ESDHC_DEFAULT_QUIRKS (SDHCI_QUIRK_FORCE_BLK_SZ_2048 | \
+ SDHCI_QUIRK_BROKEN_CARD_DETECTION | \
+ SDHCI_QUIRK_NO_BUSY_IRQ | \
+ SDHCI_QUIRK_NONSTANDARD_CLOCK | \
+ SDHCI_QUIRK_DATA_TIMEOUT_USES_SDCLK | \
+ SDHCI_QUIRK_PIO_NEEDS_DELAY | \
+ SDHCI_QUIRK_RESTORE_IRQS_AFTER_RESET | \
+ SDHCI_QUIRK_NO_CARD_NO_RESET)
+
+#define ESDHC_SYSTEM_CONTROL 0x2c
+#define ESDHC_CLOCK_MASK 0x0000fff0
+#define ESDHC_PREDIV_SHIFT 8
+#define ESDHC_DIVIDER_SHIFT 4
+#define ESDHC_CLOCK_PEREN 0x00000004
+#define ESDHC_CLOCK_HCKEN 0x00000002
+#define ESDHC_CLOCK_IPGEN 0x00000001
+
+/* pltfm-specific */
+#define ESDHC_HOST_CONTROL_LE 0x20
+
+/* OF-specific */
+#define ESDHC_DMA_SYSCTL 0x40c
+#define ESDHC_DMA_SNOOP 0x00000040
+
+#define ESDHC_HOST_CONTROL_RES 0x05
+
+static inline void esdhc_set_clock(struct sdhci_host *host, unsigned int clock)
+{
+ int pre_div = 2;
+ int div = 1;
+ u32 temp;
+
+ temp = sdhci_readl(host, ESDHC_SYSTEM_CONTROL);
+ temp &= ~(ESDHC_CLOCK_IPGEN | ESDHC_CLOCK_HCKEN | ESDHC_CLOCK_PEREN
+ | ESDHC_CLOCK_MASK);
+ sdhci_writel(host, temp, ESDHC_SYSTEM_CONTROL);
+
+ if (clock == 0)
+ goto out;
+
+ while (host->max_clk / pre_div / 16 > clock && pre_div < 256)
+ pre_div *= 2;
+
+ while (host->max_clk / pre_div / div > clock && div < 16)
+ div++;
+
+ dev_dbg(mmc_dev(host->mmc), "desired SD clock: %d, actual: %d\n",
+ clock, host->max_clk / pre_div / div);
+
+ pre_div >>= 1;
+ div--;
+
+ temp = sdhci_readl(host, ESDHC_SYSTEM_CONTROL);
+ temp |= (ESDHC_CLOCK_IPGEN | ESDHC_CLOCK_HCKEN | ESDHC_CLOCK_PEREN
+ | (div << ESDHC_DIVIDER_SHIFT)
+ | (pre_div << ESDHC_PREDIV_SHIFT));
+ sdhci_writel(host, temp, ESDHC_SYSTEM_CONTROL);
+ mdelay(100);
+out:
+ host->clock = clock;
+}
+
+#endif /* _DRIVERS_MMC_SDHCI_ESDHC_H */
diff --git a/drivers/mmc/host/sdhci-of-esdhc.c b/drivers/mmc/host/sdhci-of-esdhc.c
index c8623de..277fcb9 100644
--- a/drivers/mmc/host/sdhci-of-esdhc.c
+++ b/drivers/mmc/host/sdhci-of-esdhc.c
@@ -18,23 +18,7 @@
#include <linux/mmc/host.h>
#include "sdhci-of.h"
#include "sdhci.h"
-
-/*
- * Ops and quirks for the Freescale eSDHC controller.
- */
-
-#define ESDHC_DMA_SYSCTL 0x40c
-#define ESDHC_DMA_SNOOP 0x00000040
-
-#define ESDHC_SYSTEM_CONTROL 0x2c
-#define ESDHC_CLOCK_MASK 0x0000fff0
-#define ESDHC_PREDIV_SHIFT 8
-#define ESDHC_DIVIDER_SHIFT 4
-#define ESDHC_CLOCK_PEREN 0x00000004
-#define ESDHC_CLOCK_HCKEN 0x00000002
-#define ESDHC_CLOCK_IPGEN 0x00000001
-
-#define ESDHC_HOST_CONTROL_RES 0x05
+#include "sdhci-esdhc.c"
static u16 esdhc_readw(struct sdhci_host *host, int reg)
{
@@ -68,51 +52,20 @@ static void esdhc_writeb(struct sdhci_host *host, u8 val, int reg)
sdhci_be32bs_writeb(host, val, reg);
}
-static void esdhc_set_clock(struct sdhci_host *host, unsigned int clock)
-{
- int pre_div = 2;
- int div = 1;
-
- clrbits32(host->ioaddr + ESDHC_SYSTEM_CONTROL, ESDHC_CLOCK_IPGEN |
- ESDHC_CLOCK_HCKEN | ESDHC_CLOCK_PEREN | ESDHC_CLOCK_MASK);
-
- if (clock == 0)
- goto out;
-
- while (host->max_clk / pre_div / 16 > clock && pre_div < 256)
- pre_div *= 2;
-
- while (host->max_clk / pre_div / div > clock && div < 16)
- div++;
-
- dev_dbg(mmc_dev(host->mmc), "desired SD clock: %d, actual: %d\n",
- clock, host->max_clk / pre_div / div);
-
- pre_div >>= 1;
- div--;
-
- setbits32(host->ioaddr + ESDHC_SYSTEM_CONTROL, ESDHC_CLOCK_IPGEN |
- ESDHC_CLOCK_HCKEN | ESDHC_CLOCK_PEREN |
- div << ESDHC_DIVIDER_SHIFT | pre_div << ESDHC_PREDIV_SHIFT);
- mdelay(100);
-out:
- host->clock = clock;
-}
-
-static int esdhc_enable_dma(struct sdhci_host *host)
+static int esdhc_of_enable_dma(struct sdhci_host *host)
{
setbits32(host->ioaddr + ESDHC_DMA_SYSCTL, ESDHC_DMA_SNOOP);
return 0;
}
-static unsigned int esdhc_get_max_clock(struct sdhci_host *host)
+static unsigned int esdhc_of_get_max_clock(struct sdhci_host *host)
{
struct sdhci_of_host *of_host = sdhci_priv(host);
return of_host->clock;
}
-static unsigned int esdhc_get_min_clock(struct sdhci_host *host)
+static unsigned int esdhc_of_get_min_clock(struct sdhci_host *host)
{
struct sdhci_of_host *of_host = sdhci_priv(host);
@@ -120,14 +73,7 @@ static unsigned int esdhc_get_min_clock(struct sdhci_host *host)
}
struct sdhci_of_data sdhci_esdhc = {
- .quirks = SDHCI_QUIRK_FORCE_BLK_SZ_2048 |
- SDHCI_QUIRK_BROKEN_CARD_DETECTION |
- SDHCI_QUIRK_NO_BUSY_IRQ |
- SDHCI_QUIRK_NONSTANDARD_CLOCK |
- SDHCI_QUIRK_DATA_TIMEOUT_USES_SDCLK |
- SDHCI_QUIRK_PIO_NEEDS_DELAY |
- SDHCI_QUIRK_RESTORE_IRQS_AFTER_RESET |
- SDHCI_QUIRK_NO_CARD_NO_RESET,
+ .quirks = ESDHC_DEFAULT_QUIRKS,
.ops = {
.read_l = sdhci_be32bs_readl,
.read_w = esdhc_readw,
@@ -136,8 +82,8 @@ struct sdhci_of_data sdhci_esdhc = {
.write_w = esdhc_writew,
.write_b = esdhc_writeb,
.set_clock = esdhc_set_clock,
- .enable_dma = esdhc_enable_dma,
- .get_max_clock = esdhc_get_max_clock,
- .get_min_clock = esdhc_get_min_clock,
+ .enable_dma = esdhc_of_enable_dma,
+ .get_max_clock = esdhc_of_get_max_clock,
+ .get_min_clock = esdhc_of_get_min_clock,
},
};
--
1.7.1
^ permalink raw reply related [flat|nested] 84+ messages in thread
* [PATCH v2 5/6] mmc: sdhci-of-esdhc: factor out common stuff
@ 2010-10-11 17:10 ` Wolfram Sang
0 siblings, 0 replies; 84+ messages in thread
From: Wolfram Sang @ 2010-10-11 17:10 UTC (permalink / raw)
To: linux-arm-kernel
Put everything which can be shared between the OF and platform version
of this driver into a local .h-file.
Signed-off-by: Wolfram Sang <w.sang@pengutronix.de>
Tested-by : Eric B?nard <eric@eukrea.com>
---
80 char/line fixed. Untested as of now, can only test tomorrow again.
Should be safe changes, though (famous last words again ;)))
drivers/mmc/host/sdhci-esdhc.h | 83 +++++++++++++++++++++++++++++++++++++
drivers/mmc/host/sdhci-of-esdhc.c | 70 ++++---------------------------
2 files changed, 91 insertions(+), 62 deletions(-)
create mode 100644 drivers/mmc/host/sdhci-esdhc.h
diff --git a/drivers/mmc/host/sdhci-esdhc.h b/drivers/mmc/host/sdhci-esdhc.h
new file mode 100644
index 0000000..afaf1bc
--- /dev/null
+++ b/drivers/mmc/host/sdhci-esdhc.h
@@ -0,0 +1,83 @@
+/*
+ * Freescale eSDHC controller driver generics for OF and pltfm.
+ *
+ * Copyright (c) 2007 Freescale Semiconductor, Inc.
+ * Copyright (c) 2009 MontaVista Software, Inc.
+ * Copyright (c) 2010 Pengutronix e.K.
+ * Author: Wolfram Sang <w.sang@pengutronix.de>
+ *
+ * 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.
+ */
+
+#ifndef _DRIVERS_MMC_SDHCI_ESDHC_H
+#define _DRIVERS_MMC_SDHCI_ESDHC_H
+
+/*
+ * Ops and quirks for the Freescale eSDHC controller.
+ */
+
+#define ESDHC_DEFAULT_QUIRKS (SDHCI_QUIRK_FORCE_BLK_SZ_2048 | \
+ SDHCI_QUIRK_BROKEN_CARD_DETECTION | \
+ SDHCI_QUIRK_NO_BUSY_IRQ | \
+ SDHCI_QUIRK_NONSTANDARD_CLOCK | \
+ SDHCI_QUIRK_DATA_TIMEOUT_USES_SDCLK | \
+ SDHCI_QUIRK_PIO_NEEDS_DELAY | \
+ SDHCI_QUIRK_RESTORE_IRQS_AFTER_RESET | \
+ SDHCI_QUIRK_NO_CARD_NO_RESET)
+
+#define ESDHC_SYSTEM_CONTROL 0x2c
+#define ESDHC_CLOCK_MASK 0x0000fff0
+#define ESDHC_PREDIV_SHIFT 8
+#define ESDHC_DIVIDER_SHIFT 4
+#define ESDHC_CLOCK_PEREN 0x00000004
+#define ESDHC_CLOCK_HCKEN 0x00000002
+#define ESDHC_CLOCK_IPGEN 0x00000001
+
+/* pltfm-specific */
+#define ESDHC_HOST_CONTROL_LE 0x20
+
+/* OF-specific */
+#define ESDHC_DMA_SYSCTL 0x40c
+#define ESDHC_DMA_SNOOP 0x00000040
+
+#define ESDHC_HOST_CONTROL_RES 0x05
+
+static inline void esdhc_set_clock(struct sdhci_host *host, unsigned int clock)
+{
+ int pre_div = 2;
+ int div = 1;
+ u32 temp;
+
+ temp = sdhci_readl(host, ESDHC_SYSTEM_CONTROL);
+ temp &= ~(ESDHC_CLOCK_IPGEN | ESDHC_CLOCK_HCKEN | ESDHC_CLOCK_PEREN
+ | ESDHC_CLOCK_MASK);
+ sdhci_writel(host, temp, ESDHC_SYSTEM_CONTROL);
+
+ if (clock == 0)
+ goto out;
+
+ while (host->max_clk / pre_div / 16 > clock && pre_div < 256)
+ pre_div *= 2;
+
+ while (host->max_clk / pre_div / div > clock && div < 16)
+ div++;
+
+ dev_dbg(mmc_dev(host->mmc), "desired SD clock: %d, actual: %d\n",
+ clock, host->max_clk / pre_div / div);
+
+ pre_div >>= 1;
+ div--;
+
+ temp = sdhci_readl(host, ESDHC_SYSTEM_CONTROL);
+ temp |= (ESDHC_CLOCK_IPGEN | ESDHC_CLOCK_HCKEN | ESDHC_CLOCK_PEREN
+ | (div << ESDHC_DIVIDER_SHIFT)
+ | (pre_div << ESDHC_PREDIV_SHIFT));
+ sdhci_writel(host, temp, ESDHC_SYSTEM_CONTROL);
+ mdelay(100);
+out:
+ host->clock = clock;
+}
+
+#endif /* _DRIVERS_MMC_SDHCI_ESDHC_H */
diff --git a/drivers/mmc/host/sdhci-of-esdhc.c b/drivers/mmc/host/sdhci-of-esdhc.c
index c8623de..277fcb9 100644
--- a/drivers/mmc/host/sdhci-of-esdhc.c
+++ b/drivers/mmc/host/sdhci-of-esdhc.c
@@ -18,23 +18,7 @@
#include <linux/mmc/host.h>
#include "sdhci-of.h"
#include "sdhci.h"
-
-/*
- * Ops and quirks for the Freescale eSDHC controller.
- */
-
-#define ESDHC_DMA_SYSCTL 0x40c
-#define ESDHC_DMA_SNOOP 0x00000040
-
-#define ESDHC_SYSTEM_CONTROL 0x2c
-#define ESDHC_CLOCK_MASK 0x0000fff0
-#define ESDHC_PREDIV_SHIFT 8
-#define ESDHC_DIVIDER_SHIFT 4
-#define ESDHC_CLOCK_PEREN 0x00000004
-#define ESDHC_CLOCK_HCKEN 0x00000002
-#define ESDHC_CLOCK_IPGEN 0x00000001
-
-#define ESDHC_HOST_CONTROL_RES 0x05
+#include "sdhci-esdhc.c"
static u16 esdhc_readw(struct sdhci_host *host, int reg)
{
@@ -68,51 +52,20 @@ static void esdhc_writeb(struct sdhci_host *host, u8 val, int reg)
sdhci_be32bs_writeb(host, val, reg);
}
-static void esdhc_set_clock(struct sdhci_host *host, unsigned int clock)
-{
- int pre_div = 2;
- int div = 1;
-
- clrbits32(host->ioaddr + ESDHC_SYSTEM_CONTROL, ESDHC_CLOCK_IPGEN |
- ESDHC_CLOCK_HCKEN | ESDHC_CLOCK_PEREN | ESDHC_CLOCK_MASK);
-
- if (clock == 0)
- goto out;
-
- while (host->max_clk / pre_div / 16 > clock && pre_div < 256)
- pre_div *= 2;
-
- while (host->max_clk / pre_div / div > clock && div < 16)
- div++;
-
- dev_dbg(mmc_dev(host->mmc), "desired SD clock: %d, actual: %d\n",
- clock, host->max_clk / pre_div / div);
-
- pre_div >>= 1;
- div--;
-
- setbits32(host->ioaddr + ESDHC_SYSTEM_CONTROL, ESDHC_CLOCK_IPGEN |
- ESDHC_CLOCK_HCKEN | ESDHC_CLOCK_PEREN |
- div << ESDHC_DIVIDER_SHIFT | pre_div << ESDHC_PREDIV_SHIFT);
- mdelay(100);
-out:
- host->clock = clock;
-}
-
-static int esdhc_enable_dma(struct sdhci_host *host)
+static int esdhc_of_enable_dma(struct sdhci_host *host)
{
setbits32(host->ioaddr + ESDHC_DMA_SYSCTL, ESDHC_DMA_SNOOP);
return 0;
}
-static unsigned int esdhc_get_max_clock(struct sdhci_host *host)
+static unsigned int esdhc_of_get_max_clock(struct sdhci_host *host)
{
struct sdhci_of_host *of_host = sdhci_priv(host);
return of_host->clock;
}
-static unsigned int esdhc_get_min_clock(struct sdhci_host *host)
+static unsigned int esdhc_of_get_min_clock(struct sdhci_host *host)
{
struct sdhci_of_host *of_host = sdhci_priv(host);
@@ -120,14 +73,7 @@ static unsigned int esdhc_get_min_clock(struct sdhci_host *host)
}
struct sdhci_of_data sdhci_esdhc = {
- .quirks = SDHCI_QUIRK_FORCE_BLK_SZ_2048 |
- SDHCI_QUIRK_BROKEN_CARD_DETECTION |
- SDHCI_QUIRK_NO_BUSY_IRQ |
- SDHCI_QUIRK_NONSTANDARD_CLOCK |
- SDHCI_QUIRK_DATA_TIMEOUT_USES_SDCLK |
- SDHCI_QUIRK_PIO_NEEDS_DELAY |
- SDHCI_QUIRK_RESTORE_IRQS_AFTER_RESET |
- SDHCI_QUIRK_NO_CARD_NO_RESET,
+ .quirks = ESDHC_DEFAULT_QUIRKS,
.ops = {
.read_l = sdhci_be32bs_readl,
.read_w = esdhc_readw,
@@ -136,8 +82,8 @@ struct sdhci_of_data sdhci_esdhc = {
.write_w = esdhc_writew,
.write_b = esdhc_writeb,
.set_clock = esdhc_set_clock,
- .enable_dma = esdhc_enable_dma,
- .get_max_clock = esdhc_get_max_clock,
- .get_min_clock = esdhc_get_min_clock,
+ .enable_dma = esdhc_of_enable_dma,
+ .get_max_clock = esdhc_of_get_max_clock,
+ .get_min_clock = esdhc_of_get_min_clock,
},
};
--
1.7.1
^ permalink raw reply related [flat|nested] 84+ messages in thread
* Re: [PATCH v2 5/6] mmc: sdhci-of-esdhc: factor out common stuff
2010-10-11 17:10 ` Wolfram Sang
@ 2010-10-11 18:33 ` Chris Ball
-1 siblings, 0 replies; 84+ messages in thread
From: Chris Ball @ 2010-10-11 18:33 UTC (permalink / raw)
To: Wolfram Sang; +Cc: linux-mmc, linux-arm-kernel, Zhu Richard-R65037
Hi Wolfram,
On Mon, Oct 11, 2010 at 07:10:32PM +0200, Wolfram Sang wrote:
> +static inline void esdhc_set_clock(struct sdhci_host *host, unsigned int clock)
> +{
> + int pre_div = 2;
> + int div = 1;
> + u32 temp;
> +
> + temp = sdhci_readl(host, ESDHC_SYSTEM_CONTROL);
> + temp &= ~(ESDHC_CLOCK_IPGEN | ESDHC_CLOCK_HCKEN | ESDHC_CLOCK_PEREN
> + | ESDHC_CLOCK_MASK);
> + sdhci_writel(host, temp, ESDHC_SYSTEM_CONTROL);
> +
> + if (clock == 0)
> + goto out;
> +
> + while (host->max_clk / pre_div / 16 > clock && pre_div < 256)
> + pre_div *= 2;
> +
> + while (host->max_clk / pre_div / div > clock && div < 16)
> + div++;
> +
> + dev_dbg(mmc_dev(host->mmc), "desired SD clock: %d, actual: %d\n",
> + clock, host->max_clk / pre_div / div);
> +
> + pre_div >>= 1;
> + div--;
> +
> + temp = sdhci_readl(host, ESDHC_SYSTEM_CONTROL);
> + temp |= (ESDHC_CLOCK_IPGEN | ESDHC_CLOCK_HCKEN | ESDHC_CLOCK_PEREN
> + | (div << ESDHC_DIVIDER_SHIFT)
> + | (pre_div << ESDHC_PREDIV_SHIFT));
> + sdhci_writel(host, temp, ESDHC_SYSTEM_CONTROL);
> + mdelay(100);
This isn't directly related to this patchset (the code was there
beforehand), but it would be nice to rework the mdelay(100).
Thanks,
--
Chris Ball <cjb@laptop.org> <http://printf.net/>
One Laptop Per Child
^ permalink raw reply [flat|nested] 84+ messages in thread
* [PATCH v2 5/6] mmc: sdhci-of-esdhc: factor out common stuff
@ 2010-10-11 18:33 ` Chris Ball
0 siblings, 0 replies; 84+ messages in thread
From: Chris Ball @ 2010-10-11 18:33 UTC (permalink / raw)
To: linux-arm-kernel
Hi Wolfram,
On Mon, Oct 11, 2010 at 07:10:32PM +0200, Wolfram Sang wrote:
> +static inline void esdhc_set_clock(struct sdhci_host *host, unsigned int clock)
> +{
> + int pre_div = 2;
> + int div = 1;
> + u32 temp;
> +
> + temp = sdhci_readl(host, ESDHC_SYSTEM_CONTROL);
> + temp &= ~(ESDHC_CLOCK_IPGEN | ESDHC_CLOCK_HCKEN | ESDHC_CLOCK_PEREN
> + | ESDHC_CLOCK_MASK);
> + sdhci_writel(host, temp, ESDHC_SYSTEM_CONTROL);
> +
> + if (clock == 0)
> + goto out;
> +
> + while (host->max_clk / pre_div / 16 > clock && pre_div < 256)
> + pre_div *= 2;
> +
> + while (host->max_clk / pre_div / div > clock && div < 16)
> + div++;
> +
> + dev_dbg(mmc_dev(host->mmc), "desired SD clock: %d, actual: %d\n",
> + clock, host->max_clk / pre_div / div);
> +
> + pre_div >>= 1;
> + div--;
> +
> + temp = sdhci_readl(host, ESDHC_SYSTEM_CONTROL);
> + temp |= (ESDHC_CLOCK_IPGEN | ESDHC_CLOCK_HCKEN | ESDHC_CLOCK_PEREN
> + | (div << ESDHC_DIVIDER_SHIFT)
> + | (pre_div << ESDHC_PREDIV_SHIFT));
> + sdhci_writel(host, temp, ESDHC_SYSTEM_CONTROL);
> + mdelay(100);
This isn't directly related to this patchset (the code was there
beforehand), but it would be nice to rework the mdelay(100).
Thanks,
--
Chris Ball <cjb@laptop.org> <http://printf.net/>
One Laptop Per Child
^ permalink raw reply [flat|nested] 84+ messages in thread
* Re: [PATCH 0/6] SD/MMC driver for MX25/35/51
2010-10-11 14:21 ` Wolfram Sang
@ 2010-10-12 22:06 ` Arnaud Patard (Rtp)
-1 siblings, 0 replies; 84+ messages in thread
From: Arnaud Patard @ 2010-10-12 22:06 UTC (permalink / raw)
To: Wolfram Sang; +Cc: linux-mmc, Zhu Richard-R65037, linux-arm-kernel
Wolfram Sang <w.sang@pengutronix.de> writes:
Hi,
> Here is the hopefully final (famous last words) version of my patch series. The
> first four are still updates/improvements for sdhci and sdhci-pltfm and are of
> generic interest, too. Thanks to Eric for the tests on MX25/35. Looking forward
> to comments/applied-to-mmc-next-messages ;)
>
> The series is based on mmc-next as of today and also available at
>
> git://git.pengutronix.de/git/wsa/linux-2.6.git pcm043-mmc
I've tried it on a efika mx (to2 version) and I've a problem with the
write-protect. It's on a GPIO and I don't see any way to configure the
esdhc-imx driver to use it. Any idea on how it should be done ?
thanks,
Arnaud
^ permalink raw reply [flat|nested] 84+ messages in thread
* [PATCH 0/6] SD/MMC driver for MX25/35/51
@ 2010-10-12 22:06 ` Arnaud Patard (Rtp)
0 siblings, 0 replies; 84+ messages in thread
From: Arnaud Patard (Rtp) @ 2010-10-12 22:06 UTC (permalink / raw)
To: linux-arm-kernel
Wolfram Sang <w.sang@pengutronix.de> writes:
Hi,
> Here is the hopefully final (famous last words) version of my patch series. The
> first four are still updates/improvements for sdhci and sdhci-pltfm and are of
> generic interest, too. Thanks to Eric for the tests on MX25/35. Looking forward
> to comments/applied-to-mmc-next-messages ;)
>
> The series is based on mmc-next as of today and also available at
>
> git://git.pengutronix.de/git/wsa/linux-2.6.git pcm043-mmc
I've tried it on a efika mx (to2 version) and I've a problem with the
write-protect. It's on a GPIO and I don't see any way to configure the
esdhc-imx driver to use it. Any idea on how it should be done ?
thanks,
Arnaud
^ permalink raw reply [flat|nested] 84+ messages in thread
* Re: [PATCH 0/6] SD/MMC driver for MX25/35/51
2010-10-12 22:06 ` Arnaud Patard (Rtp)
@ 2010-10-13 8:15 ` Eric Bénard
-1 siblings, 0 replies; 84+ messages in thread
From: Eric Bénard @ 2010-10-13 8:15 UTC (permalink / raw)
To: Arnaud Patard (Rtp)
Cc: Wolfram Sang, Zhu Richard-R65037, linux-mmc, linux-arm-kernel
Hi,
Le 13/10/2010 00:06, Arnaud Patard (Rtp) a écrit :
> Wolfram Sang<w.sang@pengutronix.de> writes:
>> Here is the hopefully final (famous last words) version of my patch series. The
>> first four are still updates/improvements for sdhci and sdhci-pltfm and are of
>> generic interest, too. Thanks to Eric for the tests on MX25/35. Looking forward
>> to comments/applied-to-mmc-next-messages ;)
>>
>> The series is based on mmc-next as of today and also available at
>>
>> git://git.pengutronix.de/git/wsa/linux-2.6.git pcm043-mmc
>
> I've tried it on a efika mx (to2 version) and I've a problem with the
> write-protect. It's on a GPIO and I don't see any way to configure the
> esdhc-imx driver to use it. Any idea on how it should be done ?
>
it's actually not yet supported by the driver. There is a wp_gpio in
struct esdhc_platform_data (arch/arm/plat-mxc/include/mach/esdhc.h)
but it's not yet used by the driver.
Also card detect using a GPIO is not implemented and card detect if
actually done by polling.
Eric
^ permalink raw reply [flat|nested] 84+ messages in thread
* [PATCH 0/6] SD/MMC driver for MX25/35/51
@ 2010-10-13 8:15 ` Eric Bénard
0 siblings, 0 replies; 84+ messages in thread
From: Eric Bénard @ 2010-10-13 8:15 UTC (permalink / raw)
To: linux-arm-kernel
Hi,
Le 13/10/2010 00:06, Arnaud Patard (Rtp) a ?crit :
> Wolfram Sang<w.sang@pengutronix.de> writes:
>> Here is the hopefully final (famous last words) version of my patch series. The
>> first four are still updates/improvements for sdhci and sdhci-pltfm and are of
>> generic interest, too. Thanks to Eric for the tests on MX25/35. Looking forward
>> to comments/applied-to-mmc-next-messages ;)
>>
>> The series is based on mmc-next as of today and also available at
>>
>> git://git.pengutronix.de/git/wsa/linux-2.6.git pcm043-mmc
>
> I've tried it on a efika mx (to2 version) and I've a problem with the
> write-protect. It's on a GPIO and I don't see any way to configure the
> esdhc-imx driver to use it. Any idea on how it should be done ?
>
it's actually not yet supported by the driver. There is a wp_gpio in
struct esdhc_platform_data (arch/arm/plat-mxc/include/mach/esdhc.h)
but it's not yet used by the driver.
Also card detect using a GPIO is not implemented and card detect if
actually done by polling.
Eric
^ permalink raw reply [flat|nested] 84+ messages in thread
* Re: [PATCH 0/6] SD/MMC driver for MX25/35/51
2010-10-13 8:15 ` Eric Bénard
@ 2010-10-13 8:29 ` Wolfram Sang
-1 siblings, 0 replies; 84+ messages in thread
From: Wolfram Sang @ 2010-10-13 8:29 UTC (permalink / raw)
To: Eric Bénard
Cc: Arnaud Patard (Rtp), Zhu Richard-R65037, linux-mmc,
linux-arm-kernel
[-- Attachment #1: Type: text/plain, Size: 692 bytes --]
On Wed, Oct 13, 2010 at 10:15:04AM +0200, Eric Bénard wrote:
> >I've tried it on a efika mx (to2 version) and I've a problem with the
> >write-protect. It's on a GPIO and I don't see any way to configure the
> >esdhc-imx driver to use it. Any idea on how it should be done ?
> >
> it's actually not yet supported by the driver. There is a wp_gpio in
> struct esdhc_platform_data (arch/arm/plat-mxc/include/mach/esdhc.h)
> but it's not yet used by the driver.
It's all prepared. I finally will have a look into it today.
--
Pengutronix e.K. | Wolfram Sang |
Industrial Linux Solutions | http://www.pengutronix.de/ |
[-- Attachment #2: Digital signature --]
[-- Type: application/pgp-signature, Size: 198 bytes --]
^ permalink raw reply [flat|nested] 84+ messages in thread
* [PATCH 0/6] SD/MMC driver for MX25/35/51
@ 2010-10-13 8:29 ` Wolfram Sang
0 siblings, 0 replies; 84+ messages in thread
From: Wolfram Sang @ 2010-10-13 8:29 UTC (permalink / raw)
To: linux-arm-kernel
On Wed, Oct 13, 2010 at 10:15:04AM +0200, Eric B?nard wrote:
> >I've tried it on a efika mx (to2 version) and I've a problem with the
> >write-protect. It's on a GPIO and I don't see any way to configure the
> >esdhc-imx driver to use it. Any idea on how it should be done ?
> >
> it's actually not yet supported by the driver. There is a wp_gpio in
> struct esdhc_platform_data (arch/arm/plat-mxc/include/mach/esdhc.h)
> but it's not yet used by the driver.
It's all prepared. I finally will have a look into it today.
--
Pengutronix e.K. | Wolfram Sang |
Industrial Linux Solutions | http://www.pengutronix.de/ |
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 198 bytes
Desc: Digital signature
URL: <http://lists.infradead.org/pipermail/linux-arm-kernel/attachments/20101013/55c7b3f3/attachment.sig>
^ permalink raw reply [flat|nested] 84+ messages in thread
* Re: [PATCH 0/6] SD/MMC driver for MX25/35/51
2010-10-13 8:29 ` Wolfram Sang
@ 2010-10-13 9:28 ` Arnaud Patard (Rtp)
-1 siblings, 0 replies; 84+ messages in thread
From: Arnaud Patard @ 2010-10-13 9:28 UTC (permalink / raw)
To: Wolfram Sang
Cc: Eric Bénard, Zhu Richard-R65037, linux-mmc, linux-arm-kernel
Wolfram Sang <w.sang@pengutronix.de> writes:
Hi,
> On Wed, Oct 13, 2010 at 10:15:04AM +0200, Eric Bénard wrote:
>
>> >I've tried it on a efika mx (to2 version) and I've a problem with the
>> >write-protect. It's on a GPIO and I don't see any way to configure the
>> >esdhc-imx driver to use it. Any idea on how it should be done ?
>> >
>> it's actually not yet supported by the driver. There is a wp_gpio in
>> struct esdhc_platform_data (arch/arm/plat-mxc/include/mach/esdhc.h)
>> but it's not yet used by the driver.
>
> It's all prepared. I finally will have a look into it today.
oh, great. I was thinking about doing it but I'll wait for your patches
then. I'm sure I need support for WP on GPIO but I may also need support
for CD on GPIO so I'll be happy to test any patch you have.
Thanks,
Arnaud
^ permalink raw reply [flat|nested] 84+ messages in thread
* [PATCH 0/6] SD/MMC driver for MX25/35/51
@ 2010-10-13 9:28 ` Arnaud Patard (Rtp)
0 siblings, 0 replies; 84+ messages in thread
From: Arnaud Patard (Rtp) @ 2010-10-13 9:28 UTC (permalink / raw)
To: linux-arm-kernel
Wolfram Sang <w.sang@pengutronix.de> writes:
Hi,
> On Wed, Oct 13, 2010 at 10:15:04AM +0200, Eric B?nard wrote:
>
>> >I've tried it on a efika mx (to2 version) and I've a problem with the
>> >write-protect. It's on a GPIO and I don't see any way to configure the
>> >esdhc-imx driver to use it. Any idea on how it should be done ?
>> >
>> it's actually not yet supported by the driver. There is a wp_gpio in
>> struct esdhc_platform_data (arch/arm/plat-mxc/include/mach/esdhc.h)
>> but it's not yet used by the driver.
>
> It's all prepared. I finally will have a look into it today.
oh, great. I was thinking about doing it but I'll wait for your patches
then. I'm sure I need support for WP on GPIO but I may also need support
for CD on GPIO so I'll be happy to test any patch you have.
Thanks,
Arnaud
^ permalink raw reply [flat|nested] 84+ messages in thread
* RE: [PATCH 0/6] SD/MMC driver for MX25/35/51
2010-10-13 9:28 ` Arnaud Patard (Rtp)
@ 2010-10-13 9:53 ` Zhu Richard-R65037
-1 siblings, 0 replies; 84+ messages in thread
From: Zhu Richard-R65037 @ 2010-10-13 9:53 UTC (permalink / raw)
To: Arnaud Patard, Wolfram Sang; +Cc: Eric Bénard, linux-mmc, linux-arm-kernel
Hi Arnaud:
The mechanism of the GPIO used as write protection pin is implemented ever, you can make a reference to the following suggestions.
The details pls refer to the [PATCH 3/6] mmc: sdhci: introduce private get_ro sent by wolfram.
and
http://lists.infradead.org/pipermail/linux-arm-kernel/2010-September/027269.html
The GPIO Card Detection solution maybe a little complex refer to the GPIO Write Protection,
since the CD irq should be configured, and the poll Of card detection should be disabled at the same time.
So the sdhc-pltfm.c maybe should be changed too.
Hi Eric:
Can you add this GPIO WP mechanism into your serial patches?
I can't access the external git repos because of the firewall.:(.
The GPIO WP solution had been implemented in my patches before, the details pls refer to the URL listed above.
The codes are simple, maybe the definition of the platform data should be considered.
Best Regards
Richard Zhu
> -----Original Message-----
> From: Arnaud Patard [mailto:arnaud.patard@rtp-net.org]
> Sent: Wednesday, October 13, 2010 5:28 PM
> To: Wolfram Sang
> Cc: Eric Bénard; Zhu Richard-R65037; linux-mmc@vger.kernel.org; linux-
> arm-kernel@lists.infradead.org
> Subject: Re: [PATCH 0/6] SD/MMC driver for MX25/35/51
>
> Wolfram Sang <w.sang@pengutronix.de> writes:
>
> Hi,
>
> > On Wed, Oct 13, 2010 at 10:15:04AM +0200, Eric Bénard wrote:
> >
> >> >I've tried it on a efika mx (to2 version) and I've a problem with
> >> >the write-protect. It's on a GPIO and I don't see any way to
> >> >configure the esdhc-imx driver to use it. Any idea on how it should
> be done ?
> >> >
> >> it's actually not yet supported by the driver. There is a wp_gpio in
> >> struct esdhc_platform_data (arch/arm/plat-mxc/include/mach/esdhc.h)
> >> but it's not yet used by the driver.
> >
> > It's all prepared. I finally will have a look into it today.
>
> oh, great. I was thinking about doing it but I'll wait for your patches
> then. I'm sure I need support for WP on GPIO but I may also need support
> for CD on GPIO so I'll be happy to test any patch you have.
>
>
> Thanks,
> Arnaud
^ permalink raw reply [flat|nested] 84+ messages in thread
* [PATCH 0/6] SD/MMC driver for MX25/35/51
@ 2010-10-13 9:53 ` Zhu Richard-R65037
0 siblings, 0 replies; 84+ messages in thread
From: Zhu Richard-R65037 @ 2010-10-13 9:53 UTC (permalink / raw)
To: linux-arm-kernel
Hi Arnaud:
The mechanism of the GPIO used as write protection pin is implemented ever, you can make a reference to the following suggestions.
The details pls refer to the [PATCH 3/6] mmc: sdhci: introduce private get_ro sent by wolfram.
and
http://lists.infradead.org/pipermail/linux-arm-kernel/2010-September/027269.html
The GPIO Card Detection solution maybe a little complex refer to the GPIO Write Protection,
since the CD irq should be configured, and the poll Of card detection should be disabled at the same time.
So the sdhc-pltfm.c maybe should be changed too.
Hi Eric:
Can you add this GPIO WP mechanism into your serial patches?
I can't access the external git repos because of the firewall.:(.
The GPIO WP solution had been implemented in my patches before, the details pls refer to the URL listed above.
The codes are simple, maybe the definition of the platform data should be considered.
Best Regards
Richard Zhu
> -----Original Message-----
> From: Arnaud Patard [mailto:arnaud.patard at rtp-net.org]
> Sent: Wednesday, October 13, 2010 5:28 PM
> To: Wolfram Sang
> Cc: Eric B?nard; Zhu Richard-R65037; linux-mmc at vger.kernel.org; linux-
> arm-kernel at lists.infradead.org
> Subject: Re: [PATCH 0/6] SD/MMC driver for MX25/35/51
>
> Wolfram Sang <w.sang@pengutronix.de> writes:
>
> Hi,
>
> > On Wed, Oct 13, 2010 at 10:15:04AM +0200, Eric B?nard wrote:
> >
> >> >I've tried it on a efika mx (to2 version) and I've a problem with
> >> >the write-protect. It's on a GPIO and I don't see any way to
> >> >configure the esdhc-imx driver to use it. Any idea on how it should
> be done ?
> >> >
> >> it's actually not yet supported by the driver. There is a wp_gpio in
> >> struct esdhc_platform_data (arch/arm/plat-mxc/include/mach/esdhc.h)
> >> but it's not yet used by the driver.
> >
> > It's all prepared. I finally will have a look into it today.
>
> oh, great. I was thinking about doing it but I'll wait for your patches
> then. I'm sure I need support for WP on GPIO but I may also need support
> for CD on GPIO so I'll be happy to test any patch you have.
>
>
> Thanks,
> Arnaud
^ permalink raw reply [flat|nested] 84+ messages in thread
* Re: [PATCH 0/6] SD/MMC driver for MX25/35/51
2010-10-13 9:53 ` Zhu Richard-R65037
@ 2010-10-13 10:06 ` Wolfram Sang
-1 siblings, 0 replies; 84+ messages in thread
From: Wolfram Sang @ 2010-10-13 10:06 UTC (permalink / raw)
To: Zhu Richard-R65037
Cc: Arnaud Patard, Eric Bénard, linux-mmc, linux-arm-kernel
[-- Attachment #1: Type: text/plain, Size: 533 bytes --]
Hi Richard,
great to have you back! Did you have the chance to test my latest
patch-series? And can you help Eric with the comments for the
clock-calculation on MX51?
> I can't access the external git repos because of the firewall.:(.
Ouch! I hope you already complained ;) At least my repo should be
accessible via HTTP by the way...
Regards,
Wolfram
--
Pengutronix e.K. | Wolfram Sang |
Industrial Linux Solutions | http://www.pengutronix.de/ |
[-- Attachment #2: Digital signature --]
[-- Type: application/pgp-signature, Size: 198 bytes --]
^ permalink raw reply [flat|nested] 84+ messages in thread
* [PATCH 0/6] SD/MMC driver for MX25/35/51
@ 2010-10-13 10:06 ` Wolfram Sang
0 siblings, 0 replies; 84+ messages in thread
From: Wolfram Sang @ 2010-10-13 10:06 UTC (permalink / raw)
To: linux-arm-kernel
Hi Richard,
great to have you back! Did you have the chance to test my latest
patch-series? And can you help Eric with the comments for the
clock-calculation on MX51?
> I can't access the external git repos because of the firewall.:(.
Ouch! I hope you already complained ;) At least my repo should be
accessible via HTTP by the way...
Regards,
Wolfram
--
Pengutronix e.K. | Wolfram Sang |
Industrial Linux Solutions | http://www.pengutronix.de/ |
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 198 bytes
Desc: Digital signature
URL: <http://lists.infradead.org/pipermail/linux-arm-kernel/attachments/20101013/bcf36423/attachment.sig>
^ permalink raw reply [flat|nested] 84+ messages in thread
* Re: [PATCH 0/6] SD/MMC driver for MX25/35/51
2010-10-13 10:06 ` Wolfram Sang
@ 2010-10-13 10:09 ` Eric Bénard
-1 siblings, 0 replies; 84+ messages in thread
From: Eric Bénard @ 2010-10-13 10:09 UTC (permalink / raw)
To: Wolfram Sang
Cc: Zhu Richard-R65037, Arnaud Patard, linux-mmc, linux-arm-kernel
Hi Wolfram,
Le 13/10/2010 12:06, Wolfram Sang a écrit :
> great to have you back! Did you have the chance to test my latest
> patch-series? And can you help Eric with the comments for the
> clock-calculation on MX51?
>
that's solved in the latest version of the patch (and the max value
checks in the function were improved at the same time).
Eric
^ permalink raw reply [flat|nested] 84+ messages in thread
* [PATCH 0/6] SD/MMC driver for MX25/35/51
@ 2010-10-13 10:09 ` Eric Bénard
0 siblings, 0 replies; 84+ messages in thread
From: Eric Bénard @ 2010-10-13 10:09 UTC (permalink / raw)
To: linux-arm-kernel
Hi Wolfram,
Le 13/10/2010 12:06, Wolfram Sang a ?crit :
> great to have you back! Did you have the chance to test my latest
> patch-series? And can you help Eric with the comments for the
> clock-calculation on MX51?
>
that's solved in the latest version of the patch (and the max value
checks in the function were improved at the same time).
Eric
^ permalink raw reply [flat|nested] 84+ messages in thread
* RE: [PATCH 0/6] SD/MMC driver for MX25/35/51
2010-10-13 10:09 ` Eric Bénard
@ 2010-10-13 10:13 ` Zhu Richard-R65037
-1 siblings, 0 replies; 84+ messages in thread
From: Zhu Richard-R65037 @ 2010-10-13 10:13 UTC (permalink / raw)
To: Eric Bénard, Wolfram Sang; +Cc: Arnaud Patard, linux-mmc, linux-arm-kernel
Hi Wolfram&Eric:
I take one day leave yesterday for one examination that had been booked a few days ago,
and missed Eric's patches, so regretful.
Best Regards
Richard Zhu
> -----Original Message-----
> From: Eric Bénard [mailto:eric@eukrea.com]
> Sent: Wednesday, October 13, 2010 6:10 PM
> To: Wolfram Sang
> Cc: Zhu Richard-R65037; Arnaud Patard; linux-mmc@vger.kernel.org; linux-
> arm-kernel@lists.infradead.org
> Subject: Re: [PATCH 0/6] SD/MMC driver for MX25/35/51
>
> Hi Wolfram,
>
> Le 13/10/2010 12:06, Wolfram Sang a écrit :
> > great to have you back! Did you have the chance to test my latest
> > patch-series? And can you help Eric with the comments for the
> > clock-calculation on MX51?
> >
> that's solved in the latest version of the patch (and the max value
> checks in the function were improved at the same time).
>
> Eric
^ permalink raw reply [flat|nested] 84+ messages in thread
* [PATCH 0/6] SD/MMC driver for MX25/35/51
@ 2010-10-13 10:13 ` Zhu Richard-R65037
0 siblings, 0 replies; 84+ messages in thread
From: Zhu Richard-R65037 @ 2010-10-13 10:13 UTC (permalink / raw)
To: linux-arm-kernel
Hi Wolfram&Eric:
I take one day leave yesterday for one examination that had been booked a few days ago,
and missed Eric's patches, so regretful.
Best Regards
Richard Zhu
> -----Original Message-----
> From: Eric B?nard [mailto:eric at eukrea.com]
> Sent: Wednesday, October 13, 2010 6:10 PM
> To: Wolfram Sang
> Cc: Zhu Richard-R65037; Arnaud Patard; linux-mmc at vger.kernel.org; linux-
> arm-kernel at lists.infradead.org
> Subject: Re: [PATCH 0/6] SD/MMC driver for MX25/35/51
>
> Hi Wolfram,
>
> Le 13/10/2010 12:06, Wolfram Sang a ?crit :
> > great to have you back! Did you have the chance to test my latest
> > patch-series? And can you help Eric with the comments for the
> > clock-calculation on MX51?
> >
> that's solved in the latest version of the patch (and the max value
> checks in the function were improved at the same time).
>
> Eric
^ permalink raw reply [flat|nested] 84+ messages in thread
* Re: [PATCH 0/6] SD/MMC driver for MX25/35/51
2010-10-13 10:13 ` Zhu Richard-R65037
@ 2010-10-13 10:20 ` Wolfram Sang
-1 siblings, 0 replies; 84+ messages in thread
From: Wolfram Sang @ 2010-10-13 10:20 UTC (permalink / raw)
To: Zhu Richard-R65037
Cc: Eric Bénard, Arnaud Patard, linux-mmc, linux-arm-kernel
[-- Attachment #1: Type: text/plain, Size: 407 bytes --]
> I take one day leave yesterday for one examination that had been booked a few days ago,
> and missed Eric's patches, so regretful.
No problem, such things happen. If you'd have time to review those
patches now, that would be great, too.
--
Pengutronix e.K. | Wolfram Sang |
Industrial Linux Solutions | http://www.pengutronix.de/ |
[-- Attachment #2: Digital signature --]
[-- Type: application/pgp-signature, Size: 198 bytes --]
^ permalink raw reply [flat|nested] 84+ messages in thread
* [PATCH 0/6] SD/MMC driver for MX25/35/51
@ 2010-10-13 10:20 ` Wolfram Sang
0 siblings, 0 replies; 84+ messages in thread
From: Wolfram Sang @ 2010-10-13 10:20 UTC (permalink / raw)
To: linux-arm-kernel
> I take one day leave yesterday for one examination that had been booked a few days ago,
> and missed Eric's patches, so regretful.
No problem, such things happen. If you'd have time to review those
patches now, that would be great, too.
--
Pengutronix e.K. | Wolfram Sang |
Industrial Linux Solutions | http://www.pengutronix.de/ |
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 198 bytes
Desc: Digital signature
URL: <http://lists.infradead.org/pipermail/linux-arm-kernel/attachments/20101013/933dd515/attachment.sig>
^ permalink raw reply [flat|nested] 84+ messages in thread
* RE: [PATCH v2 5/6] mmc: sdhci-of-esdhc: factor out common stuff
2010-10-11 18:33 ` Chris Ball
@ 2010-10-13 10:22 ` Zhu Richard-R65037
-1 siblings, 0 replies; 84+ messages in thread
From: Zhu Richard-R65037 @ 2010-10-13 10:22 UTC (permalink / raw)
To: Chris Ball, Wolfram Sang; +Cc: linux-mmc, linux-arm-kernel
Hi Wolfram:
It's better that the mdelay(100) is replaced by some litter value such
as 10ms and so on,
since I encounter one bug ever when this values is set to 100. The
audio playback would
be noised by the sd/mmc insertion/extraction operations.
Best Regards
Richard Zhu
> -----Original Message-----
> From: Chris Ball [mailto:cjb@laptop.org]
> Sent: Tuesday, October 12, 2010 2:33 AM
> To: Wolfram Sang
> Cc: linux-mmc@vger.kernel.org; linux-arm-kernel@lists.infradead.org;
Zhu
> Richard-R65037
> Subject: Re: [PATCH v2 5/6] mmc: sdhci-of-esdhc: factor out common
stuff
>
> Hi Wolfram,
>
> On Mon, Oct 11, 2010 at 07:10:32PM +0200, Wolfram Sang wrote:
> > +static inline void esdhc_set_clock(struct sdhci_host *host,
unsigned
> > +int clock) {
> > + int pre_div = 2;
> > + int div = 1;
> > + u32 temp;
> > +
> > + temp = sdhci_readl(host, ESDHC_SYSTEM_CONTROL);
> > + temp &= ~(ESDHC_CLOCK_IPGEN | ESDHC_CLOCK_HCKEN |
ESDHC_CLOCK_PEREN
> > + | ESDHC_CLOCK_MASK);
> > + sdhci_writel(host, temp, ESDHC_SYSTEM_CONTROL);
> > +
> > + if (clock == 0)
> > + goto out;
> > +
> > + while (host->max_clk / pre_div / 16 > clock && pre_div < 256)
> > + pre_div *= 2;
> > +
> > + while (host->max_clk / pre_div / div > clock && div < 16)
> > + div++;
> > +
> > + dev_dbg(mmc_dev(host->mmc), "desired SD clock: %d, actual:
%d\n",
> > + clock, host->max_clk / pre_div / div);
> > +
> > + pre_div >>= 1;
> > + div--;
> > +
> > + temp = sdhci_readl(host, ESDHC_SYSTEM_CONTROL);
> > + temp |= (ESDHC_CLOCK_IPGEN | ESDHC_CLOCK_HCKEN |
ESDHC_CLOCK_PEREN
> > + | (div << ESDHC_DIVIDER_SHIFT)
> > + | (pre_div << ESDHC_PREDIV_SHIFT));
> > + sdhci_writel(host, temp, ESDHC_SYSTEM_CONTROL);
> > + mdelay(100);
>
> This isn't directly related to this patchset (the code was there
> beforehand), but it would be nice to rework the mdelay(100).
>
> Thanks,
>
> --
> Chris Ball <cjb@laptop.org> <http://printf.net/>
> One Laptop Per Child
^ permalink raw reply [flat|nested] 84+ messages in thread
* [PATCH v2 5/6] mmc: sdhci-of-esdhc: factor out common stuff
@ 2010-10-13 10:22 ` Zhu Richard-R65037
0 siblings, 0 replies; 84+ messages in thread
From: Zhu Richard-R65037 @ 2010-10-13 10:22 UTC (permalink / raw)
To: linux-arm-kernel
Hi Wolfram:
It's better that the mdelay(100) is replaced by some litter value such
as 10ms and so on,
since I encounter one bug ever when this values is set to 100. The
audio playback would
be noised by the sd/mmc insertion/extraction operations.
Best Regards
Richard Zhu
> -----Original Message-----
> From: Chris Ball [mailto:cjb at laptop.org]
> Sent: Tuesday, October 12, 2010 2:33 AM
> To: Wolfram Sang
> Cc: linux-mmc at vger.kernel.org; linux-arm-kernel at lists.infradead.org;
Zhu
> Richard-R65037
> Subject: Re: [PATCH v2 5/6] mmc: sdhci-of-esdhc: factor out common
stuff
>
> Hi Wolfram,
>
> On Mon, Oct 11, 2010 at 07:10:32PM +0200, Wolfram Sang wrote:
> > +static inline void esdhc_set_clock(struct sdhci_host *host,
unsigned
> > +int clock) {
> > + int pre_div = 2;
> > + int div = 1;
> > + u32 temp;
> > +
> > + temp = sdhci_readl(host, ESDHC_SYSTEM_CONTROL);
> > + temp &= ~(ESDHC_CLOCK_IPGEN | ESDHC_CLOCK_HCKEN |
ESDHC_CLOCK_PEREN
> > + | ESDHC_CLOCK_MASK);
> > + sdhci_writel(host, temp, ESDHC_SYSTEM_CONTROL);
> > +
> > + if (clock == 0)
> > + goto out;
> > +
> > + while (host->max_clk / pre_div / 16 > clock && pre_div < 256)
> > + pre_div *= 2;
> > +
> > + while (host->max_clk / pre_div / div > clock && div < 16)
> > + div++;
> > +
> > + dev_dbg(mmc_dev(host->mmc), "desired SD clock: %d, actual:
%d\n",
> > + clock, host->max_clk / pre_div / div);
> > +
> > + pre_div >>= 1;
> > + div--;
> > +
> > + temp = sdhci_readl(host, ESDHC_SYSTEM_CONTROL);
> > + temp |= (ESDHC_CLOCK_IPGEN | ESDHC_CLOCK_HCKEN |
ESDHC_CLOCK_PEREN
> > + | (div << ESDHC_DIVIDER_SHIFT)
> > + | (pre_div << ESDHC_PREDIV_SHIFT));
> > + sdhci_writel(host, temp, ESDHC_SYSTEM_CONTROL);
> > + mdelay(100);
>
> This isn't directly related to this patchset (the code was there
> beforehand), but it would be nice to rework the mdelay(100).
>
> Thanks,
>
> --
> Chris Ball <cjb@laptop.org> <http://printf.net/>
> One Laptop Per Child
^ permalink raw reply [flat|nested] 84+ messages in thread
* Re: [PATCH v2 5/6] mmc: sdhci-of-esdhc: factor out common stuff
2010-10-13 10:22 ` Zhu Richard-R65037
@ 2010-10-13 10:31 ` Wolfram Sang
-1 siblings, 0 replies; 84+ messages in thread
From: Wolfram Sang @ 2010-10-13 10:31 UTC (permalink / raw)
To: Zhu Richard-R65037; +Cc: Chris Ball, linux-mmc, linux-arm-kernel
[-- Attachment #1: Type: text/plain, Size: 546 bytes --]
On Wed, Oct 13, 2010 at 06:22:14PM +0800, Zhu Richard-R65037 wrote:
> It's better that the mdelay(100) is replaced by some litter value such
> as 10ms and so on,
> since I encounter one bug ever when this values is set to 100. The
> audio playback would
> be noised by the sd/mmc insertion/extraction operations.
Okay. Can you send a patch (as you seem to have a testcase)?
--
Pengutronix e.K. | Wolfram Sang |
Industrial Linux Solutions | http://www.pengutronix.de/ |
[-- Attachment #2: Digital signature --]
[-- Type: application/pgp-signature, Size: 198 bytes --]
^ permalink raw reply [flat|nested] 84+ messages in thread
* [PATCH v2 5/6] mmc: sdhci-of-esdhc: factor out common stuff
@ 2010-10-13 10:31 ` Wolfram Sang
0 siblings, 0 replies; 84+ messages in thread
From: Wolfram Sang @ 2010-10-13 10:31 UTC (permalink / raw)
To: linux-arm-kernel
On Wed, Oct 13, 2010 at 06:22:14PM +0800, Zhu Richard-R65037 wrote:
> It's better that the mdelay(100) is replaced by some litter value such
> as 10ms and so on,
> since I encounter one bug ever when this values is set to 100. The
> audio playback would
> be noised by the sd/mmc insertion/extraction operations.
Okay. Can you send a patch (as you seem to have a testcase)?
--
Pengutronix e.K. | Wolfram Sang |
Industrial Linux Solutions | http://www.pengutronix.de/ |
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 198 bytes
Desc: Digital signature
URL: <http://lists.infradead.org/pipermail/linux-arm-kernel/attachments/20101013/86a990e3/attachment.sig>
^ permalink raw reply [flat|nested] 84+ messages in thread
* Re: [PATCH 6/6] mmc: sdhci-pltfm: add pltfm-driver for imx35/51
2010-10-11 14:21 ` Wolfram Sang
@ 2010-10-14 3:07 ` Chris Ball
-1 siblings, 0 replies; 84+ messages in thread
From: Chris Ball @ 2010-10-14 3:07 UTC (permalink / raw)
To: Wolfram Sang; +Cc: linux-mmc, linux-arm-kernel, Zhu Richard-R65037
Hi Wolfram,
On Mon, Oct 11, 2010 at 04:21:06PM +0200, Wolfram Sang wrote:
> This driver adds basic support for the esdhc-core found on e.g.
> imx35/51. It adds up to the pltfm-core.
>
> Signed-off-by: Wolfram Sang <w.sang@pengutronix.de>
> Acked-by: Anton Vorontsov <cbouatmailru@gmail.com>
> Tested-by : Eric Bénard <eric@eukrea.com>
> ---
>
> Changes since last version:
>
> * use PTR_ERR if clk_get failed
>
> drivers/mmc/host/Kconfig | 10 +++
> drivers/mmc/host/Makefile | 1 +
> drivers/mmc/host/sdhci-esdhc-imx.c | 143 ++++++++++++++++++++++++++++++++++++
> drivers/mmc/host/sdhci-pltfm.c | 3 +
> drivers/mmc/host/sdhci-pltfm.h | 1 +
> 5 files changed, 158 insertions(+), 0 deletions(-)
> create mode 100644 drivers/mmc/host/sdhci-esdhc-imx.c
>
> diff --git a/drivers/mmc/host/Kconfig b/drivers/mmc/host/Kconfig
> index 8de7b9e..7b07f10 100644
> --- a/drivers/mmc/host/Kconfig
> +++ b/drivers/mmc/host/Kconfig
> @@ -130,6 +130,16 @@ config MMC_SDHCI_CNS3XXX
>
> If unsure, say N.
>
> +config MMC_SDHCI_ESDHC_IMX
> + bool "SDHCI platform support for the Freescale eSDHC i.MX controller"
> + depends on MMC_SDHCI_PLTFM
> + select MMC_SDHCI_IO_ACCESSORS
> + help
> + This selects the Freescale eSDHC controller support on the platform
> + bus, found on platforms like mx35/51.
> +
> + If unsure, say N.
> +
Could you add a machine dependency here? Otherwise this is going to
offer itself to x86 users, and then fail to compile due to lack of a
clk_* implementation.
Apart from that, looks ready for mmc-next -- the mdelay(100) fix can
come later, since that's orthogonal.
Thanks,
--
Chris Ball <cjb@laptop.org> <http://printf.net/>
One Laptop Per Child
^ permalink raw reply [flat|nested] 84+ messages in thread
* [PATCH 6/6] mmc: sdhci-pltfm: add pltfm-driver for imx35/51
@ 2010-10-14 3:07 ` Chris Ball
0 siblings, 0 replies; 84+ messages in thread
From: Chris Ball @ 2010-10-14 3:07 UTC (permalink / raw)
To: linux-arm-kernel
Hi Wolfram,
On Mon, Oct 11, 2010 at 04:21:06PM +0200, Wolfram Sang wrote:
> This driver adds basic support for the esdhc-core found on e.g.
> imx35/51. It adds up to the pltfm-core.
>
> Signed-off-by: Wolfram Sang <w.sang@pengutronix.de>
> Acked-by: Anton Vorontsov <cbouatmailru@gmail.com>
> Tested-by : Eric B?nard <eric@eukrea.com>
> ---
>
> Changes since last version:
>
> * use PTR_ERR if clk_get failed
>
> drivers/mmc/host/Kconfig | 10 +++
> drivers/mmc/host/Makefile | 1 +
> drivers/mmc/host/sdhci-esdhc-imx.c | 143 ++++++++++++++++++++++++++++++++++++
> drivers/mmc/host/sdhci-pltfm.c | 3 +
> drivers/mmc/host/sdhci-pltfm.h | 1 +
> 5 files changed, 158 insertions(+), 0 deletions(-)
> create mode 100644 drivers/mmc/host/sdhci-esdhc-imx.c
>
> diff --git a/drivers/mmc/host/Kconfig b/drivers/mmc/host/Kconfig
> index 8de7b9e..7b07f10 100644
> --- a/drivers/mmc/host/Kconfig
> +++ b/drivers/mmc/host/Kconfig
> @@ -130,6 +130,16 @@ config MMC_SDHCI_CNS3XXX
>
> If unsure, say N.
>
> +config MMC_SDHCI_ESDHC_IMX
> + bool "SDHCI platform support for the Freescale eSDHC i.MX controller"
> + depends on MMC_SDHCI_PLTFM
> + select MMC_SDHCI_IO_ACCESSORS
> + help
> + This selects the Freescale eSDHC controller support on the platform
> + bus, found on platforms like mx35/51.
> +
> + If unsure, say N.
> +
Could you add a machine dependency here? Otherwise this is going to
offer itself to x86 users, and then fail to compile due to lack of a
clk_* implementation.
Apart from that, looks ready for mmc-next -- the mdelay(100) fix can
come later, since that's orthogonal.
Thanks,
--
Chris Ball <cjb@laptop.org> <http://printf.net/>
One Laptop Per Child
^ permalink raw reply [flat|nested] 84+ messages in thread
* [PATCH 6/6] mmc: sdhci-pltfm: add pltfm-driver for imx35/51
2010-10-15 10:20 [PATCH V5 " Wolfram Sang
@ 2010-10-15 10:21 ` Wolfram Sang
0 siblings, 0 replies; 84+ messages in thread
From: Wolfram Sang @ 2010-10-15 10:21 UTC (permalink / raw)
To: linux-mmc; +Cc: linux-arm-kernel, Zhu Richard-R65037, Wolfram Sang
This driver adds basic support for the esdhc-core found on e.g.
imx35/51. It adds up to the pltfm-core.
Signed-off-by: Wolfram Sang <w.sang@pengutronix.de>
Acked-by: Anton Vorontsov <cbouatmailru@gmail.com>
Tested-by : Eric Bénard <eric@eukrea.com>
---
Change since last version:
* Add Kconfig dependency for imx-archs
drivers/mmc/host/Kconfig | 10 +++
drivers/mmc/host/Makefile | 1 +
drivers/mmc/host/sdhci-esdhc-imx.c | 143 ++++++++++++++++++++++++++++++++++++
drivers/mmc/host/sdhci-pltfm.c | 3 +
drivers/mmc/host/sdhci-pltfm.h | 1 +
5 files changed, 158 insertions(+), 0 deletions(-)
create mode 100644 drivers/mmc/host/sdhci-esdhc-imx.c
diff --git a/drivers/mmc/host/Kconfig b/drivers/mmc/host/Kconfig
index 0b7024a..c9c2520 100644
--- a/drivers/mmc/host/Kconfig
+++ b/drivers/mmc/host/Kconfig
@@ -130,6 +130,16 @@ config MMC_SDHCI_CNS3XXX
If unsure, say N.
+config MMC_SDHCI_ESDHC_IMX
+ bool "SDHCI platform support for the Freescale eSDHC i.MX controller"
+ depends on MMC_SDHCI_PLTFM && (ARCH_MX25 || ARCH_MX35 || ARCH_MX5)
+ select MMC_SDHCI_IO_ACCESSORS
+ help
+ This selects the Freescale eSDHC controller support on the platform
+ bus, found on platforms like mx35/51.
+
+ If unsure, say N.
+
config MMC_SDHCI_S3C
tristate "SDHCI support on Samsung S3C SoC"
depends on MMC_SDHCI && PLAT_SAMSUNG
diff --git a/drivers/mmc/host/Makefile b/drivers/mmc/host/Makefile
index eae5d62..6c4ac67 100644
--- a/drivers/mmc/host/Makefile
+++ b/drivers/mmc/host/Makefile
@@ -37,6 +37,7 @@ obj-$(CONFIG_MMC_USHC) += ushc.o
obj-$(CONFIG_MMC_SDHCI_PLTFM) += sdhci-platform.o
sdhci-platform-y := sdhci-pltfm.o
sdhci-platform-$(CONFIG_MMC_SDHCI_CNS3XXX) += sdhci-cns3xxx.o
+sdhci-platform-$(CONFIG_MMC_SDHCI_ESDHC_IMX) += sdhci-esdhc-imx.o
obj-$(CONFIG_MMC_SDHCI_OF) += sdhci-of.o
sdhci-of-y := sdhci-of-core.o
diff --git a/drivers/mmc/host/sdhci-esdhc-imx.c b/drivers/mmc/host/sdhci-esdhc-imx.c
new file mode 100644
index 0000000..2e9cca1
--- /dev/null
+++ b/drivers/mmc/host/sdhci-esdhc-imx.c
@@ -0,0 +1,143 @@
+/*
+ * Freescale eSDHC i.MX controller driver for the platform bus.
+ *
+ * derived from the OF-version.
+ *
+ * Copyright (c) 2010 Pengutronix e.K.
+ * Author: Wolfram Sang <w.sang@pengutronix.de>
+ *
+ * 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.
+ */
+
+#include <linux/io.h>
+#include <linux/delay.h>
+#include <linux/err.h>
+#include <linux/clk.h>
+#include <linux/mmc/host.h>
+#include <linux/mmc/sdhci-pltfm.h>
+#include "sdhci.h"
+#include "sdhci-pltfm.h"
+#include "sdhci-esdhc.h"
+
+static inline void esdhc_clrset_le(struct sdhci_host *host, u32 mask, u32 val, int reg)
+{
+ void __iomem *base = host->ioaddr + (reg & ~0x3);
+ u32 shift = (reg & 0x3) * 8;
+
+ writel(((readl(base) & ~(mask << shift)) | (val << shift)), base);
+}
+
+static u16 esdhc_readw_le(struct sdhci_host *host, int reg)
+{
+ if (unlikely(reg == SDHCI_HOST_VERSION))
+ reg ^= 2;
+
+ return readw(host->ioaddr + reg);
+}
+
+static void esdhc_writew_le(struct sdhci_host *host, u16 val, int reg)
+{
+ struct sdhci_pltfm_host *pltfm_host = sdhci_priv(host);
+
+ switch (reg) {
+ case SDHCI_TRANSFER_MODE:
+ /*
+ * Postpone this write, we must do it together with a
+ * command write that is down below.
+ */
+ pltfm_host->scratchpad = val;
+ return;
+ case SDHCI_COMMAND:
+ writel(val << 16 | pltfm_host->scratchpad,
+ host->ioaddr + SDHCI_TRANSFER_MODE);
+ return;
+ case SDHCI_BLOCK_SIZE:
+ val &= ~SDHCI_MAKE_BLKSZ(0x7, 0);
+ break;
+ }
+ esdhc_clrset_le(host, 0xffff, val, reg);
+}
+
+static void esdhc_writeb_le(struct sdhci_host *host, u8 val, int reg)
+{
+ u32 new_val;
+
+ switch (reg) {
+ case SDHCI_POWER_CONTROL:
+ /*
+ * FSL put some DMA bits here
+ * If your board has a regulator, code should be here
+ */
+ return;
+ case SDHCI_HOST_CONTROL:
+ /* FSL messed up here, so we can just keep those two */
+ new_val = val & (SDHCI_CTRL_LED | SDHCI_CTRL_4BITBUS);
+ /* ensure the endianess */
+ new_val |= ESDHC_HOST_CONTROL_LE;
+ /* DMA mode bits are shifted */
+ new_val |= (val & SDHCI_CTRL_DMA_MASK) << 5;
+
+ esdhc_clrset_le(host, 0xffff, new_val, reg);
+ return;
+ }
+ esdhc_clrset_le(host, 0xff, val, reg);
+}
+
+static unsigned int esdhc_pltfm_get_max_clock(struct sdhci_host *host)
+{
+ struct sdhci_pltfm_host *pltfm_host = sdhci_priv(host);
+
+ return clk_get_rate(pltfm_host->clk);
+}
+
+static unsigned int esdhc_pltfm_get_min_clock(struct sdhci_host *host)
+{
+ struct sdhci_pltfm_host *pltfm_host = sdhci_priv(host);
+
+ return clk_get_rate(pltfm_host->clk) / 256 / 16;
+}
+
+static int esdhc_pltfm_init(struct sdhci_host *host, struct sdhci_pltfm_data *pdata)
+{
+ struct sdhci_pltfm_host *pltfm_host = sdhci_priv(host);
+ struct clk *clk;
+
+ clk = clk_get(mmc_dev(host->mmc), NULL);
+ if (IS_ERR(clk)) {
+ dev_err(mmc_dev(host->mmc), "clk err\n");
+ return PTR_ERR(clk);
+ }
+ clk_enable(clk);
+ pltfm_host->clk = clk;
+
+ return 0;
+}
+
+static void esdhc_pltfm_exit(struct sdhci_host *host)
+{
+ struct sdhci_pltfm_host *pltfm_host = sdhci_priv(host);
+
+ clk_disable(pltfm_host->clk);
+ clk_put(pltfm_host->clk);
+}
+
+static struct sdhci_ops sdhci_esdhc_ops = {
+ .read_w = esdhc_readw_le,
+ .write_w = esdhc_writew_le,
+ .write_b = esdhc_writeb_le,
+ .set_clock = esdhc_set_clock,
+ .get_max_clock = esdhc_pltfm_get_max_clock,
+ .get_min_clock = esdhc_pltfm_get_min_clock,
+};
+
+struct sdhci_pltfm_data sdhci_esdhc_imx_pdata = {
+ .quirks = ESDHC_DEFAULT_QUIRKS | SDHCI_QUIRK_NO_MULTIBLOCK
+ | SDHCI_QUIRK_BROKEN_ADMA,
+ /* ADMA has issues. Might be fixable */
+ /* NO_MULTIBLOCK might be MX35 only (Errata: ENGcm07207) */
+ .ops = &sdhci_esdhc_ops,
+ .init = esdhc_pltfm_init,
+ .exit = esdhc_pltfm_exit,
+};
diff --git a/drivers/mmc/host/sdhci-pltfm.c b/drivers/mmc/host/sdhci-pltfm.c
index 00e8a8a..0502f89 100644
--- a/drivers/mmc/host/sdhci-pltfm.c
+++ b/drivers/mmc/host/sdhci-pltfm.c
@@ -167,6 +167,9 @@ static const struct platform_device_id sdhci_pltfm_ids[] = {
#ifdef CONFIG_MMC_SDHCI_CNS3XXX
{ "sdhci-cns3xxx", (kernel_ulong_t)&sdhci_cns3xxx_pdata },
#endif
+#ifdef CONFIG_MMC_SDHCI_ESDHC_IMX
+ { "sdhci-esdhc-imx", (kernel_ulong_t)&sdhci_esdhc_imx_pdata },
+#endif
{ },
};
MODULE_DEVICE_TABLE(platform, sdhci_pltfm_ids);
diff --git a/drivers/mmc/host/sdhci-pltfm.h b/drivers/mmc/host/sdhci-pltfm.h
index 562b929..c1bfe48 100644
--- a/drivers/mmc/host/sdhci-pltfm.h
+++ b/drivers/mmc/host/sdhci-pltfm.h
@@ -21,5 +21,6 @@ struct sdhci_pltfm_host {
};
extern struct sdhci_pltfm_data sdhci_cns3xxx_pdata;
+extern struct sdhci_pltfm_data sdhci_esdhc_imx_pdata;
#endif /* _DRIVERS_MMC_SDHCI_PLTFM_H */
--
1.7.1
^ permalink raw reply related [flat|nested] 84+ messages in thread
* [PATCH 6/6] mmc: sdhci-pltfm: add pltfm-driver for imx35/51
@ 2010-10-15 10:21 ` Wolfram Sang
0 siblings, 0 replies; 84+ messages in thread
From: Wolfram Sang @ 2010-10-15 10:21 UTC (permalink / raw)
To: linux-arm-kernel
This driver adds basic support for the esdhc-core found on e.g.
imx35/51. It adds up to the pltfm-core.
Signed-off-by: Wolfram Sang <w.sang@pengutronix.de>
Acked-by: Anton Vorontsov <cbouatmailru@gmail.com>
Tested-by : Eric B?nard <eric@eukrea.com>
---
Change since last version:
* Add Kconfig dependency for imx-archs
drivers/mmc/host/Kconfig | 10 +++
drivers/mmc/host/Makefile | 1 +
drivers/mmc/host/sdhci-esdhc-imx.c | 143 ++++++++++++++++++++++++++++++++++++
drivers/mmc/host/sdhci-pltfm.c | 3 +
drivers/mmc/host/sdhci-pltfm.h | 1 +
5 files changed, 158 insertions(+), 0 deletions(-)
create mode 100644 drivers/mmc/host/sdhci-esdhc-imx.c
diff --git a/drivers/mmc/host/Kconfig b/drivers/mmc/host/Kconfig
index 0b7024a..c9c2520 100644
--- a/drivers/mmc/host/Kconfig
+++ b/drivers/mmc/host/Kconfig
@@ -130,6 +130,16 @@ config MMC_SDHCI_CNS3XXX
If unsure, say N.
+config MMC_SDHCI_ESDHC_IMX
+ bool "SDHCI platform support for the Freescale eSDHC i.MX controller"
+ depends on MMC_SDHCI_PLTFM && (ARCH_MX25 || ARCH_MX35 || ARCH_MX5)
+ select MMC_SDHCI_IO_ACCESSORS
+ help
+ This selects the Freescale eSDHC controller support on the platform
+ bus, found on platforms like mx35/51.
+
+ If unsure, say N.
+
config MMC_SDHCI_S3C
tristate "SDHCI support on Samsung S3C SoC"
depends on MMC_SDHCI && PLAT_SAMSUNG
diff --git a/drivers/mmc/host/Makefile b/drivers/mmc/host/Makefile
index eae5d62..6c4ac67 100644
--- a/drivers/mmc/host/Makefile
+++ b/drivers/mmc/host/Makefile
@@ -37,6 +37,7 @@ obj-$(CONFIG_MMC_USHC) += ushc.o
obj-$(CONFIG_MMC_SDHCI_PLTFM) += sdhci-platform.o
sdhci-platform-y := sdhci-pltfm.o
sdhci-platform-$(CONFIG_MMC_SDHCI_CNS3XXX) += sdhci-cns3xxx.o
+sdhci-platform-$(CONFIG_MMC_SDHCI_ESDHC_IMX) += sdhci-esdhc-imx.o
obj-$(CONFIG_MMC_SDHCI_OF) += sdhci-of.o
sdhci-of-y := sdhci-of-core.o
diff --git a/drivers/mmc/host/sdhci-esdhc-imx.c b/drivers/mmc/host/sdhci-esdhc-imx.c
new file mode 100644
index 0000000..2e9cca1
--- /dev/null
+++ b/drivers/mmc/host/sdhci-esdhc-imx.c
@@ -0,0 +1,143 @@
+/*
+ * Freescale eSDHC i.MX controller driver for the platform bus.
+ *
+ * derived from the OF-version.
+ *
+ * Copyright (c) 2010 Pengutronix e.K.
+ * Author: Wolfram Sang <w.sang@pengutronix.de>
+ *
+ * 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.
+ */
+
+#include <linux/io.h>
+#include <linux/delay.h>
+#include <linux/err.h>
+#include <linux/clk.h>
+#include <linux/mmc/host.h>
+#include <linux/mmc/sdhci-pltfm.h>
+#include "sdhci.h"
+#include "sdhci-pltfm.h"
+#include "sdhci-esdhc.h"
+
+static inline void esdhc_clrset_le(struct sdhci_host *host, u32 mask, u32 val, int reg)
+{
+ void __iomem *base = host->ioaddr + (reg & ~0x3);
+ u32 shift = (reg & 0x3) * 8;
+
+ writel(((readl(base) & ~(mask << shift)) | (val << shift)), base);
+}
+
+static u16 esdhc_readw_le(struct sdhci_host *host, int reg)
+{
+ if (unlikely(reg == SDHCI_HOST_VERSION))
+ reg ^= 2;
+
+ return readw(host->ioaddr + reg);
+}
+
+static void esdhc_writew_le(struct sdhci_host *host, u16 val, int reg)
+{
+ struct sdhci_pltfm_host *pltfm_host = sdhci_priv(host);
+
+ switch (reg) {
+ case SDHCI_TRANSFER_MODE:
+ /*
+ * Postpone this write, we must do it together with a
+ * command write that is down below.
+ */
+ pltfm_host->scratchpad = val;
+ return;
+ case SDHCI_COMMAND:
+ writel(val << 16 | pltfm_host->scratchpad,
+ host->ioaddr + SDHCI_TRANSFER_MODE);
+ return;
+ case SDHCI_BLOCK_SIZE:
+ val &= ~SDHCI_MAKE_BLKSZ(0x7, 0);
+ break;
+ }
+ esdhc_clrset_le(host, 0xffff, val, reg);
+}
+
+static void esdhc_writeb_le(struct sdhci_host *host, u8 val, int reg)
+{
+ u32 new_val;
+
+ switch (reg) {
+ case SDHCI_POWER_CONTROL:
+ /*
+ * FSL put some DMA bits here
+ * If your board has a regulator, code should be here
+ */
+ return;
+ case SDHCI_HOST_CONTROL:
+ /* FSL messed up here, so we can just keep those two */
+ new_val = val & (SDHCI_CTRL_LED | SDHCI_CTRL_4BITBUS);
+ /* ensure the endianess */
+ new_val |= ESDHC_HOST_CONTROL_LE;
+ /* DMA mode bits are shifted */
+ new_val |= (val & SDHCI_CTRL_DMA_MASK) << 5;
+
+ esdhc_clrset_le(host, 0xffff, new_val, reg);
+ return;
+ }
+ esdhc_clrset_le(host, 0xff, val, reg);
+}
+
+static unsigned int esdhc_pltfm_get_max_clock(struct sdhci_host *host)
+{
+ struct sdhci_pltfm_host *pltfm_host = sdhci_priv(host);
+
+ return clk_get_rate(pltfm_host->clk);
+}
+
+static unsigned int esdhc_pltfm_get_min_clock(struct sdhci_host *host)
+{
+ struct sdhci_pltfm_host *pltfm_host = sdhci_priv(host);
+
+ return clk_get_rate(pltfm_host->clk) / 256 / 16;
+}
+
+static int esdhc_pltfm_init(struct sdhci_host *host, struct sdhci_pltfm_data *pdata)
+{
+ struct sdhci_pltfm_host *pltfm_host = sdhci_priv(host);
+ struct clk *clk;
+
+ clk = clk_get(mmc_dev(host->mmc), NULL);
+ if (IS_ERR(clk)) {
+ dev_err(mmc_dev(host->mmc), "clk err\n");
+ return PTR_ERR(clk);
+ }
+ clk_enable(clk);
+ pltfm_host->clk = clk;
+
+ return 0;
+}
+
+static void esdhc_pltfm_exit(struct sdhci_host *host)
+{
+ struct sdhci_pltfm_host *pltfm_host = sdhci_priv(host);
+
+ clk_disable(pltfm_host->clk);
+ clk_put(pltfm_host->clk);
+}
+
+static struct sdhci_ops sdhci_esdhc_ops = {
+ .read_w = esdhc_readw_le,
+ .write_w = esdhc_writew_le,
+ .write_b = esdhc_writeb_le,
+ .set_clock = esdhc_set_clock,
+ .get_max_clock = esdhc_pltfm_get_max_clock,
+ .get_min_clock = esdhc_pltfm_get_min_clock,
+};
+
+struct sdhci_pltfm_data sdhci_esdhc_imx_pdata = {
+ .quirks = ESDHC_DEFAULT_QUIRKS | SDHCI_QUIRK_NO_MULTIBLOCK
+ | SDHCI_QUIRK_BROKEN_ADMA,
+ /* ADMA has issues. Might be fixable */
+ /* NO_MULTIBLOCK might be MX35 only (Errata: ENGcm07207) */
+ .ops = &sdhci_esdhc_ops,
+ .init = esdhc_pltfm_init,
+ .exit = esdhc_pltfm_exit,
+};
diff --git a/drivers/mmc/host/sdhci-pltfm.c b/drivers/mmc/host/sdhci-pltfm.c
index 00e8a8a..0502f89 100644
--- a/drivers/mmc/host/sdhci-pltfm.c
+++ b/drivers/mmc/host/sdhci-pltfm.c
@@ -167,6 +167,9 @@ static const struct platform_device_id sdhci_pltfm_ids[] = {
#ifdef CONFIG_MMC_SDHCI_CNS3XXX
{ "sdhci-cns3xxx", (kernel_ulong_t)&sdhci_cns3xxx_pdata },
#endif
+#ifdef CONFIG_MMC_SDHCI_ESDHC_IMX
+ { "sdhci-esdhc-imx", (kernel_ulong_t)&sdhci_esdhc_imx_pdata },
+#endif
{ },
};
MODULE_DEVICE_TABLE(platform, sdhci_pltfm_ids);
diff --git a/drivers/mmc/host/sdhci-pltfm.h b/drivers/mmc/host/sdhci-pltfm.h
index 562b929..c1bfe48 100644
--- a/drivers/mmc/host/sdhci-pltfm.h
+++ b/drivers/mmc/host/sdhci-pltfm.h
@@ -21,5 +21,6 @@ struct sdhci_pltfm_host {
};
extern struct sdhci_pltfm_data sdhci_cns3xxx_pdata;
+extern struct sdhci_pltfm_data sdhci_esdhc_imx_pdata;
#endif /* _DRIVERS_MMC_SDHCI_PLTFM_H */
--
1.7.1
^ permalink raw reply related [flat|nested] 84+ messages in thread
* Re: [PATCH 0/6] SD/MMC driver for MX25/35/51
2010-10-13 9:28 ` Arnaud Patard (Rtp)
@ 2010-10-15 10:25 ` Wolfram Sang
-1 siblings, 0 replies; 84+ messages in thread
From: Wolfram Sang @ 2010-10-15 10:25 UTC (permalink / raw)
To: Arnaud Patard
Cc: Eric Bénard, Zhu Richard-R65037, linux-mmc, linux-arm-kernel
[-- Attachment #1: Type: text/plain, Size: 854 bytes --]
On Wed, Oct 13, 2010 at 11:28:15AM +0200, Arnaud Patard wrote:
> >> it's actually not yet supported by the driver. There is a wp_gpio in
> >> struct esdhc_platform_data (arch/arm/plat-mxc/include/mach/esdhc.h)
> >> but it's not yet used by the driver.
> >
> > It's all prepared. I finally will have a look into it today.
>
> oh, great. I was thinking about doing it but I'll wait for your patches
> then. I'm sure I need support for WP on GPIO but I may also need support
> for CD on GPIO so I'll be happy to test any patch you have.
Just to keep you updated: Got a bit distracted again but I hope to
finish it on Saturday. Looks like a patch for the gpiolib is also
needed...
--
Pengutronix e.K. | Wolfram Sang |
Industrial Linux Solutions | http://www.pengutronix.de/ |
[-- Attachment #2: Digital signature --]
[-- Type: application/pgp-signature, Size: 198 bytes --]
^ permalink raw reply [flat|nested] 84+ messages in thread
* [PATCH 0/6] SD/MMC driver for MX25/35/51
@ 2010-10-15 10:25 ` Wolfram Sang
0 siblings, 0 replies; 84+ messages in thread
From: Wolfram Sang @ 2010-10-15 10:25 UTC (permalink / raw)
To: linux-arm-kernel
On Wed, Oct 13, 2010 at 11:28:15AM +0200, Arnaud Patard wrote:
> >> it's actually not yet supported by the driver. There is a wp_gpio in
> >> struct esdhc_platform_data (arch/arm/plat-mxc/include/mach/esdhc.h)
> >> but it's not yet used by the driver.
> >
> > It's all prepared. I finally will have a look into it today.
>
> oh, great. I was thinking about doing it but I'll wait for your patches
> then. I'm sure I need support for WP on GPIO but I may also need support
> for CD on GPIO so I'll be happy to test any patch you have.
Just to keep you updated: Got a bit distracted again but I hope to
finish it on Saturday. Looks like a patch for the gpiolib is also
needed...
--
Pengutronix e.K. | Wolfram Sang |
Industrial Linux Solutions | http://www.pengutronix.de/ |
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 198 bytes
Desc: Digital signature
URL: <http://lists.infradead.org/pipermail/linux-arm-kernel/attachments/20101015/e8fb7eaf/attachment.sig>
^ permalink raw reply [flat|nested] 84+ messages in thread
* Re: [PATCH 0/6] SD/MMC driver for MX25/35/51
2010-10-13 10:20 ` Wolfram Sang
@ 2010-10-15 10:27 ` Wolfram Sang
-1 siblings, 0 replies; 84+ messages in thread
From: Wolfram Sang @ 2010-10-15 10:27 UTC (permalink / raw)
To: Zhu Richard-R65037
Cc: Eric Bénard, Arnaud Patard, linux-mmc, linux-arm-kernel
[-- Attachment #1: Type: text/plain, Size: 575 bytes --]
Richard,
> > I take one day leave yesterday for one examination that had been booked a few days ago,
> > and missed Eric's patches, so regretful.
>
> No problem, such things happen. If you'd have time to review those
> patches now, that would be great, too.
Do you have time to check the latest series (V5, just posted)? BTW which
patch-set are you using now for development?
Regards,
Wolfram
--
Pengutronix e.K. | Wolfram Sang |
Industrial Linux Solutions | http://www.pengutronix.de/ |
[-- Attachment #2: Digital signature --]
[-- Type: application/pgp-signature, Size: 198 bytes --]
^ permalink raw reply [flat|nested] 84+ messages in thread
* [PATCH 0/6] SD/MMC driver for MX25/35/51
@ 2010-10-15 10:27 ` Wolfram Sang
0 siblings, 0 replies; 84+ messages in thread
From: Wolfram Sang @ 2010-10-15 10:27 UTC (permalink / raw)
To: linux-arm-kernel
Richard,
> > I take one day leave yesterday for one examination that had been booked a few days ago,
> > and missed Eric's patches, so regretful.
>
> No problem, such things happen. If you'd have time to review those
> patches now, that would be great, too.
Do you have time to check the latest series (V5, just posted)? BTW which
patch-set are you using now for development?
Regards,
Wolfram
--
Pengutronix e.K. | Wolfram Sang |
Industrial Linux Solutions | http://www.pengutronix.de/ |
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 198 bytes
Desc: Digital signature
URL: <http://lists.infradead.org/pipermail/linux-arm-kernel/attachments/20101015/23e80511/attachment.sig>
^ permalink raw reply [flat|nested] 84+ messages in thread
* Re: [PATCH 0/6] SD/MMC driver for MX25/35/51
2010-10-15 10:25 ` Wolfram Sang
@ 2010-10-15 21:20 ` Arnaud Patard (Rtp)
-1 siblings, 0 replies; 84+ messages in thread
From: Arnaud Patard @ 2010-10-15 21:20 UTC (permalink / raw)
To: Wolfram Sang
Cc: Eric Bénard, Zhu Richard-R65037, linux-mmc, linux-arm-kernel
Wolfram Sang <w.sang@pengutronix.de> writes:
Hi,
> On Wed, Oct 13, 2010 at 11:28:15AM +0200, Arnaud Patard wrote:
>
>> >> it's actually not yet supported by the driver. There is a wp_gpio in
>> >> struct esdhc_platform_data (arch/arm/plat-mxc/include/mach/esdhc.h)
>> >> but it's not yet used by the driver.
>> >
>> > It's all prepared. I finally will have a look into it today.
>>
>> oh, great. I was thinking about doing it but I'll wait for your patches
>> then. I'm sure I need support for WP on GPIO but I may also need support
>> for CD on GPIO so I'll be happy to test any patch you have.
>
> Just to keep you updated: Got a bit distracted again but I hope to
> finish it on Saturday. Looks like a patch for the gpiolib is also
> needed...
ok. Take your time. It turns out that the infos I had were a bit
misleading. I've been told the mmc driver was using some gpios and the
gpios are GPIO_1_0/1_1 and GPIO_1_7/1_8... which are in fact the esdhc1
and esdhc2 CD and WP.
This means :
- with proper iomux configuration, WP detection is working fine
- I should still be able to test WP on GPIO
Thanks,
Arnaud
^ permalink raw reply [flat|nested] 84+ messages in thread
* [PATCH 0/6] SD/MMC driver for MX25/35/51
@ 2010-10-15 21:20 ` Arnaud Patard (Rtp)
0 siblings, 0 replies; 84+ messages in thread
From: Arnaud Patard (Rtp) @ 2010-10-15 21:20 UTC (permalink / raw)
To: linux-arm-kernel
Wolfram Sang <w.sang@pengutronix.de> writes:
Hi,
> On Wed, Oct 13, 2010 at 11:28:15AM +0200, Arnaud Patard wrote:
>
>> >> it's actually not yet supported by the driver. There is a wp_gpio in
>> >> struct esdhc_platform_data (arch/arm/plat-mxc/include/mach/esdhc.h)
>> >> but it's not yet used by the driver.
>> >
>> > It's all prepared. I finally will have a look into it today.
>>
>> oh, great. I was thinking about doing it but I'll wait for your patches
>> then. I'm sure I need support for WP on GPIO but I may also need support
>> for CD on GPIO so I'll be happy to test any patch you have.
>
> Just to keep you updated: Got a bit distracted again but I hope to
> finish it on Saturday. Looks like a patch for the gpiolib is also
> needed...
ok. Take your time. It turns out that the infos I had were a bit
misleading. I've been told the mmc driver was using some gpios and the
gpios are GPIO_1_0/1_1 and GPIO_1_7/1_8... which are in fact the esdhc1
and esdhc2 CD and WP.
This means :
- with proper iomux configuration, WP detection is working fine
- I should still be able to test WP on GPIO
Thanks,
Arnaud
^ permalink raw reply [flat|nested] 84+ messages in thread
* RE: [PATCH 0/6] SD/MMC driver for MX25/35/51
2010-10-15 10:27 ` Wolfram Sang
@ 2010-10-18 3:29 ` Zhu Richard-R65037
-1 siblings, 0 replies; 84+ messages in thread
From: Zhu Richard-R65037 @ 2010-10-18 3:29 UTC (permalink / raw)
To: Wolfram Sang; +Cc: Eric Bénard, Arnaud Patard, linux-mmc, linux-arm-kernel
Hi Wolfram:
Can you sync-up the http URL of your repos with your latest patches?
I can't get fetch and sync-up with your latest codes now, since I can only used the HTTP URL to clone your codes.
Best Regards
Richard Zhu
> -----Original Message-----
> From: Wolfram Sang [mailto:w.sang@pengutronix.de]
> Sent: Friday, October 15, 2010 6:27 PM
> To: Zhu Richard-R65037
> Cc: Eric Bénard; Arnaud Patard; linux-mmc@vger.kernel.org; linux-arm-
> kernel@lists.infradead.org
> Subject: Re: [PATCH 0/6] SD/MMC driver for MX25/35/51
>
> Richard,
>
> > > I take one day leave yesterday for one examination that had been
> > > booked a few days ago, and missed Eric's patches, so regretful.
> >
> > No problem, such things happen. If you'd have time to review those
> > patches now, that would be great, too.
>
> Do you have time to check the latest series (V5, just posted)? BTW which
> patch-set are you using now for development?
>
> Regards,
>
> Wolfram
>
> --
> Pengutronix e.K. | Wolfram Sang
> |
> Industrial Linux Solutions | http://www.pengutronix.de/
> |
^ permalink raw reply [flat|nested] 84+ messages in thread
* [PATCH 0/6] SD/MMC driver for MX25/35/51
@ 2010-10-18 3:29 ` Zhu Richard-R65037
0 siblings, 0 replies; 84+ messages in thread
From: Zhu Richard-R65037 @ 2010-10-18 3:29 UTC (permalink / raw)
To: linux-arm-kernel
Hi Wolfram:
Can you sync-up the http URL of your repos with your latest patches?
I can't get fetch and sync-up with your latest codes now, since I can only used the HTTP URL to clone your codes.
Best Regards
Richard Zhu
> -----Original Message-----
> From: Wolfram Sang [mailto:w.sang at pengutronix.de]
> Sent: Friday, October 15, 2010 6:27 PM
> To: Zhu Richard-R65037
> Cc: Eric B?nard; Arnaud Patard; linux-mmc at vger.kernel.org; linux-arm-
> kernel at lists.infradead.org
> Subject: Re: [PATCH 0/6] SD/MMC driver for MX25/35/51
>
> Richard,
>
> > > I take one day leave yesterday for one examination that had been
> > > booked a few days ago, and missed Eric's patches, so regretful.
> >
> > No problem, such things happen. If you'd have time to review those
> > patches now, that would be great, too.
>
> Do you have time to check the latest series (V5, just posted)? BTW which
> patch-set are you using now for development?
>
> Regards,
>
> Wolfram
>
> --
> Pengutronix e.K. | Wolfram Sang
> |
> Industrial Linux Solutions | http://www.pengutronix.de/
> |
^ permalink raw reply [flat|nested] 84+ messages in thread
* RE: [PATCH 0/6] SD/MMC driver for MX25/35/51
2010-10-15 10:27 ` Wolfram Sang
@ 2010-10-18 8:48 ` Zhu Richard-R65037
-1 siblings, 0 replies; 84+ messages in thread
From: Zhu Richard-R65037 @ 2010-10-18 8:48 UTC (permalink / raw)
To: Wolfram Sang
Cc: Eric Bénard, Arnaud Patard, linux-mmc, linux-arm-kernel,
Guo Shawn-R65073
Hi Wolfram:
I tested your serial patches with Eric's platform related codes on i.MX51 BBG3.0 board.
Two phenomena:
The debug msg "mmc0: mmc_rescan: trying to init card at 400000 Hz..." are dumped out repeatedly.
ROOT: There are pr_info codes in the mmc_rescan func.
The other:
Encounter the Timeout and CRC error when the sandisk 4G SDHC card are used as the ROOTFS storage media
When I boot up the BBG board.
It seems that the "SDHCI_QUIRK_BROKEN_TIMEOUT_VAL" is mandatory required at my side when I did the tests
on BBG3.0 board, and the i.MX51 board can support the "MULTI-BLOCK".
Hi Eric:
What's kinds of tests and environment you did at your side?
BTW, I still can't fetch out the latest codes out, that means I still can't found the V5 patches, although I run
the git fetch and git rebase. :(
Best Regards
Richard Zhu
> -----Original Message-----
> From: Zhu Richard-R65037
> Sent: Monday, October 18, 2010 11:30 AM
> To: 'Wolfram Sang'
> Cc: Eric Bénard; Arnaud Patard; linux-mmc@vger.kernel.org; linux-arm-
> kernel@lists.infradead.org
> Subject: RE: [PATCH 0/6] SD/MMC driver for MX25/35/51
>
> Hi Wolfram:
> Can you sync-up the http URL of your repos with your latest patches?
> I can't get fetch and sync-up with your latest codes now, since I can
> only used the HTTP URL to clone your codes.
>
> Best Regards
> Richard Zhu
>
>
> > -----Original Message-----
> > From: Wolfram Sang [mailto:w.sang@pengutronix.de]
> > Sent: Friday, October 15, 2010 6:27 PM
> > To: Zhu Richard-R65037
> > Cc: Eric Bénard; Arnaud Patard; linux-mmc@vger.kernel.org; linux-arm-
> > kernel@lists.infradead.org
> > Subject: Re: [PATCH 0/6] SD/MMC driver for MX25/35/51
> >
> > Richard,
> >
> > > > I take one day leave yesterday for one examination that had been
> > > > booked a few days ago, and missed Eric's patches, so regretful.
> > >
> > > No problem, such things happen. If you'd have time to review those
> > > patches now, that would be great, too.
> >
> > Do you have time to check the latest series (V5, just posted)? BTW
> > which patch-set are you using now for development?
> >
> > Regards,
> >
> > Wolfram
> >
> > --
> > Pengutronix e.K. | Wolfram Sang
> > |
> > Industrial Linux Solutions | http://www.pengutronix.de/
> > |
^ permalink raw reply [flat|nested] 84+ messages in thread
* [PATCH 0/6] SD/MMC driver for MX25/35/51
@ 2010-10-18 8:48 ` Zhu Richard-R65037
0 siblings, 0 replies; 84+ messages in thread
From: Zhu Richard-R65037 @ 2010-10-18 8:48 UTC (permalink / raw)
To: linux-arm-kernel
Hi Wolfram:
I tested your serial patches with Eric's platform related codes on i.MX51 BBG3.0 board.
Two phenomena:
The debug msg "mmc0: mmc_rescan: trying to init card at 400000 Hz..." are dumped out repeatedly.
ROOT: There are pr_info codes in the mmc_rescan func.
The other:
Encounter the Timeout and CRC error when the sandisk 4G SDHC card are used as the ROOTFS storage media
When I boot up the BBG board.
It seems that the "SDHCI_QUIRK_BROKEN_TIMEOUT_VAL" is mandatory required at my side when I did the tests
on BBG3.0 board, and the i.MX51 board can support the "MULTI-BLOCK".
Hi Eric:
What's kinds of tests and environment you did at your side?
BTW, I still can't fetch out the latest codes out, that means I still can't found the V5 patches, although I run
the git fetch and git rebase. :(
Best Regards
Richard Zhu
> -----Original Message-----
> From: Zhu Richard-R65037
> Sent: Monday, October 18, 2010 11:30 AM
> To: 'Wolfram Sang'
> Cc: Eric B?nard; Arnaud Patard; linux-mmc at vger.kernel.org; linux-arm-
> kernel at lists.infradead.org
> Subject: RE: [PATCH 0/6] SD/MMC driver for MX25/35/51
>
> Hi Wolfram:
> Can you sync-up the http URL of your repos with your latest patches?
> I can't get fetch and sync-up with your latest codes now, since I can
> only used the HTTP URL to clone your codes.
>
> Best Regards
> Richard Zhu
>
>
> > -----Original Message-----
> > From: Wolfram Sang [mailto:w.sang at pengutronix.de]
> > Sent: Friday, October 15, 2010 6:27 PM
> > To: Zhu Richard-R65037
> > Cc: Eric B?nard; Arnaud Patard; linux-mmc at vger.kernel.org; linux-arm-
> > kernel at lists.infradead.org
> > Subject: Re: [PATCH 0/6] SD/MMC driver for MX25/35/51
> >
> > Richard,
> >
> > > > I take one day leave yesterday for one examination that had been
> > > > booked a few days ago, and missed Eric's patches, so regretful.
> > >
> > > No problem, such things happen. If you'd have time to review those
> > > patches now, that would be great, too.
> >
> > Do you have time to check the latest series (V5, just posted)? BTW
> > which patch-set are you using now for development?
> >
> > Regards,
> >
> > Wolfram
> >
> > --
> > Pengutronix e.K. | Wolfram Sang
> > |
> > Industrial Linux Solutions | http://www.pengutronix.de/
> > |
^ permalink raw reply [flat|nested] 84+ messages in thread
* Re: [PATCH 0/6] SD/MMC driver for MX25/35/51
2010-10-18 8:48 ` Zhu Richard-R65037
@ 2010-10-18 9:36 ` Eric Bénard
-1 siblings, 0 replies; 84+ messages in thread
From: Eric Bénard @ 2010-10-18 9:36 UTC (permalink / raw)
To: Zhu Richard-R65037
Cc: Wolfram Sang, linux-arm-kernel, Guo Shawn-R65073, linux-mmc,
Arnaud Patard
Hi Richard,
Le 18/10/2010 10:48, Zhu Richard-R65037 a écrit :
> I tested your serial patches with Eric's platform related codes on i.MX51 BBG3.0 board.
> Two phenomena:
> The debug msg "mmc0: mmc_rescan: trying to init card at 400000 Hz..." are dumped out repeatedly.
> ROOT: There are pr_info codes in the mmc_rescan func.
>
fixed by this patch :
http://git.kernel.org/?p=linux/kernel/git/cjb/mmc.git;a=commit;h=0ca6d53ec81a13263f6643372b2a5abf7818e8fa
> The other:
> Encounter the Timeout and CRC error when the sandisk 4G SDHC card are used as the ROOTFS storage media
> When I boot up the BBG board.
>
> It seems that the "SDHCI_QUIRK_BROKEN_TIMEOUT_VAL" is mandatory required at my side when I did the tests
> on BBG3.0 board, and the i.MX51 board can support the "MULTI-BLOCK".
>
you seems to be right, the attached patch seems to fix it (tested on our board
using a Linaro rootfs on a Transcend SDHC card and I didn't get errors after
applying this patch but I'm stopped by udev errors now with this rootfs).
diff --git a/drivers/mmc/host/sdhci-esdhc-imx.c
b/drivers/mmc/host/sdhci-esdhc-imx.c
index 2e9cca1..e8f7048 100644
--- a/drivers/mmc/host/sdhci-esdhc-imx.c
+++ b/drivers/mmc/host/sdhci-esdhc-imx.c
@@ -134,7 +134,8 @@ static struct sdhci_ops sdhci_esdhc_ops = {
struct sdhci_pltfm_data sdhci_esdhc_imx_pdata = {
.quirks = ESDHC_DEFAULT_QUIRKS | SDHCI_QUIRK_NO_MULTIBLOCK
- | SDHCI_QUIRK_BROKEN_ADMA,
+ | SDHCI_QUIRK_BROKEN_ADMA
+ | SDHCI_QUIRK_BROKEN_TIMEOUT_VAL,
/* ADMA has issues. Might be fixable */
/* NO_MULTIBLOCK might be MX35 only (Errata: ENGcm07207) */
.ops = &sdhci_esdhc_ops,
> What's kinds of tests and environment you did at your side?
>
Environment : our i.MX515 based boards.
Tests (until now) : mount + a few read/write.
We have a nand flash on board so our rootfs is on it so I didn't test a rootfs
until this morning.
Eric
^ permalink raw reply related [flat|nested] 84+ messages in thread
* [PATCH 0/6] SD/MMC driver for MX25/35/51
@ 2010-10-18 9:36 ` Eric Bénard
0 siblings, 0 replies; 84+ messages in thread
From: Eric Bénard @ 2010-10-18 9:36 UTC (permalink / raw)
To: linux-arm-kernel
Hi Richard,
Le 18/10/2010 10:48, Zhu Richard-R65037 a ?crit :
> I tested your serial patches with Eric's platform related codes on i.MX51 BBG3.0 board.
> Two phenomena:
> The debug msg "mmc0: mmc_rescan: trying to init card at 400000 Hz..." are dumped out repeatedly.
> ROOT: There are pr_info codes in the mmc_rescan func.
>
fixed by this patch :
http://git.kernel.org/?p=linux/kernel/git/cjb/mmc.git;a=commit;h=0ca6d53ec81a13263f6643372b2a5abf7818e8fa
> The other:
> Encounter the Timeout and CRC error when the sandisk 4G SDHC card are used as the ROOTFS storage media
> When I boot up the BBG board.
>
> It seems that the "SDHCI_QUIRK_BROKEN_TIMEOUT_VAL" is mandatory required at my side when I did the tests
> on BBG3.0 board, and the i.MX51 board can support the "MULTI-BLOCK".
>
you seems to be right, the attached patch seems to fix it (tested on our board
using a Linaro rootfs on a Transcend SDHC card and I didn't get errors after
applying this patch but I'm stopped by udev errors now with this rootfs).
diff --git a/drivers/mmc/host/sdhci-esdhc-imx.c
b/drivers/mmc/host/sdhci-esdhc-imx.c
index 2e9cca1..e8f7048 100644
--- a/drivers/mmc/host/sdhci-esdhc-imx.c
+++ b/drivers/mmc/host/sdhci-esdhc-imx.c
@@ -134,7 +134,8 @@ static struct sdhci_ops sdhci_esdhc_ops = {
struct sdhci_pltfm_data sdhci_esdhc_imx_pdata = {
.quirks = ESDHC_DEFAULT_QUIRKS | SDHCI_QUIRK_NO_MULTIBLOCK
- | SDHCI_QUIRK_BROKEN_ADMA,
+ | SDHCI_QUIRK_BROKEN_ADMA
+ | SDHCI_QUIRK_BROKEN_TIMEOUT_VAL,
/* ADMA has issues. Might be fixable */
/* NO_MULTIBLOCK might be MX35 only (Errata: ENGcm07207) */
.ops = &sdhci_esdhc_ops,
> What's kinds of tests and environment you did at your side?
>
Environment : our i.MX515 based boards.
Tests (until now) : mount + a few read/write.
We have a nand flash on board so our rootfs is on it so I didn't test a rootfs
until this morning.
Eric
^ permalink raw reply related [flat|nested] 84+ messages in thread
* RE: [PATCH 0/6] SD/MMC driver for MX25/35/51
2010-10-18 9:36 ` Eric Bénard
@ 2010-10-18 9:44 ` Zhu Richard-R65037
-1 siblings, 0 replies; 84+ messages in thread
From: Zhu Richard-R65037 @ 2010-10-18 9:44 UTC (permalink / raw)
To: Eric Bénard, Wolfram Sang
Cc: linux-arm-kernel, Guo Shawn-R65073, linux-mmc, Arnaud Patard
Hi Eric:
Got that, great.
I tested at my side with the "SDHCI_QUIRK_BROKEN_TIMEOUT_VAL" added, and I can login the ROOTFS, and complete some general tests.
:)
HI Wolfram:
About the codes I used in my verification, pls refer to the following log with "git log" cmd
commit 44139322fc36bb23a066ccebb85981b544c957e7
Author: Wolfram Sang <w.sang@pengutronix.de>
Date: Fri Sep 3 18:27:48 2010 +0200
mmc: sdhci-pltfm: add pltfm-driver for imx35/51
This driver adds basic support for the esdhc-core found on e.g.
imx35/51. It adds up to the pltfm-core.
Signed-off-by: Wolfram Sang <w.sang@pengutronix.de>
Acked-by: Anton Vorontsov <cbouatmailru@gmail.com>
Tested-by : Eric B茅nard <eric@eukrea.com>
commit 1c458bcff936e8b391b47cf916bcc2b17774cba9
Author: Wolfram Sang <w.sang@pengutronix.de>
Date: Tue Sep 7 13:00:26 2010 +0200
mmc: sdhci-of-esdhc: factor out common stuff
Put everything which can be shared between the OF and platform version
of this driver into a local .h-file.
Signed-off-by: Wolfram Sang <w.sang@pengutronix.de>
Tested-by : Eric B茅nard <eric@eukrea.com>
Best Regards
Richard Zhu
> -----Original Message-----
> From: Eric Bénard [mailto:eric@eukrea.com]
> Sent: Monday, October 18, 2010 5:37 PM
> To: Zhu Richard-R65037
> Cc: Wolfram Sang; linux-arm-kernel@lists.infradead.org; Guo Shawn-R65073;
> linux-mmc@vger.kernel.org; Arnaud Patard
> Subject: Re: [PATCH 0/6] SD/MMC driver for MX25/35/51
>
> Hi Richard,
>
> Le 18/10/2010 10:48, Zhu Richard-R65037 a écrit :
> > I tested your serial patches with Eric's platform related codes on
> i.MX51 BBG3.0 board.
> > Two phenomena:
> > The debug msg "mmc0: mmc_rescan: trying to init card at 400000 Hz..."
> are dumped out repeatedly.
> > ROOT: There are pr_info codes in the mmc_rescan func.
> >
> fixed by this patch :
> http://git.kernel.org/?p=linux/kernel/git/cjb/mmc.git;a=commit;h=0ca6d53e
> c81a13263f6643372b2a5abf7818e8fa
>
> > The other:
> > Encounter the Timeout and CRC error when the sandisk 4G SDHC card are
> > used as the ROOTFS storage media When I boot up the BBG board.
> >
> > It seems that the "SDHCI_QUIRK_BROKEN_TIMEOUT_VAL" is mandatory
> required at my side when I did the tests
> > on BBG3.0 board, and the i.MX51 board can support the "MULTI-BLOCK".
> >
> you seems to be right, the attached patch seems to fix it (tested on our
> board using a Linaro rootfs on a Transcend SDHC card and I didn't get
> errors after applying this patch but I'm stopped by udev errors now with
> this rootfs).
>
> diff --git a/drivers/mmc/host/sdhci-esdhc-imx.c
> b/drivers/mmc/host/sdhci-esdhc-imx.c
> index 2e9cca1..e8f7048 100644
> --- a/drivers/mmc/host/sdhci-esdhc-imx.c
> +++ b/drivers/mmc/host/sdhci-esdhc-imx.c
> @@ -134,7 +134,8 @@ static struct sdhci_ops sdhci_esdhc_ops = {
>
> struct sdhci_pltfm_data sdhci_esdhc_imx_pdata = {
> .quirks = ESDHC_DEFAULT_QUIRKS | SDHCI_QUIRK_NO_MULTIBLOCK
> - | SDHCI_QUIRK_BROKEN_ADMA,
> + | SDHCI_QUIRK_BROKEN_ADMA
> + | SDHCI_QUIRK_BROKEN_TIMEOUT_VAL,
> /* ADMA has issues. Might be fixable */
> /* NO_MULTIBLOCK might be MX35 only (Errata: ENGcm07207) */
> .ops = &sdhci_esdhc_ops,
>
>
> > What's kinds of tests and environment you did at your side?
> >
> Environment : our i.MX515 based boards.
> Tests (until now) : mount + a few read/write.
> We have a nand flash on board so our rootfs is on it so I didn't test a
> rootfs until this morning.
>
> Eric
^ permalink raw reply [flat|nested] 84+ messages in thread
* [PATCH 0/6] SD/MMC driver for MX25/35/51
@ 2010-10-18 9:44 ` Zhu Richard-R65037
0 siblings, 0 replies; 84+ messages in thread
From: Zhu Richard-R65037 @ 2010-10-18 9:44 UTC (permalink / raw)
To: linux-arm-kernel
Hi Eric:
Got that, great.
I tested at my side with the "SDHCI_QUIRK_BROKEN_TIMEOUT_VAL" added, and I can login the ROOTFS, and complete some general tests.
:)
HI Wolfram:
About the codes I used in my verification, pls refer to the following log with "git log" cmd
commit 44139322fc36bb23a066ccebb85981b544c957e7
Author: Wolfram Sang <w.sang@pengutronix.de>
Date: Fri Sep 3 18:27:48 2010 +0200
mmc: sdhci-pltfm: add pltfm-driver for imx35/51
This driver adds basic support for the esdhc-core found on e.g.
imx35/51. It adds up to the pltfm-core.
Signed-off-by: Wolfram Sang <w.sang@pengutronix.de>
Acked-by: Anton Vorontsov <cbouatmailru@gmail.com>
Tested-by : Eric B?nard <eric@eukrea.com>
commit 1c458bcff936e8b391b47cf916bcc2b17774cba9
Author: Wolfram Sang <w.sang@pengutronix.de>
Date: Tue Sep 7 13:00:26 2010 +0200
mmc: sdhci-of-esdhc: factor out common stuff
Put everything which can be shared between the OF and platform version
of this driver into a local .h-file.
Signed-off-by: Wolfram Sang <w.sang@pengutronix.de>
Tested-by : Eric B?nard <eric@eukrea.com>
Best Regards
Richard Zhu
> -----Original Message-----
> From: Eric B?nard [mailto:eric at eukrea.com]
> Sent: Monday, October 18, 2010 5:37 PM
> To: Zhu Richard-R65037
> Cc: Wolfram Sang; linux-arm-kernel at lists.infradead.org; Guo Shawn-R65073;
> linux-mmc at vger.kernel.org; Arnaud Patard
> Subject: Re: [PATCH 0/6] SD/MMC driver for MX25/35/51
>
> Hi Richard,
>
> Le 18/10/2010 10:48, Zhu Richard-R65037 a ?crit :
> > I tested your serial patches with Eric's platform related codes on
> i.MX51 BBG3.0 board.
> > Two phenomena:
> > The debug msg "mmc0: mmc_rescan: trying to init card at 400000 Hz..."
> are dumped out repeatedly.
> > ROOT: There are pr_info codes in the mmc_rescan func.
> >
> fixed by this patch :
> http://git.kernel.org/?p=linux/kernel/git/cjb/mmc.git;a=commit;h=0ca6d53e
> c81a13263f6643372b2a5abf7818e8fa
>
> > The other:
> > Encounter the Timeout and CRC error when the sandisk 4G SDHC card are
> > used as the ROOTFS storage media When I boot up the BBG board.
> >
> > It seems that the "SDHCI_QUIRK_BROKEN_TIMEOUT_VAL" is mandatory
> required at my side when I did the tests
> > on BBG3.0 board, and the i.MX51 board can support the "MULTI-BLOCK".
> >
> you seems to be right, the attached patch seems to fix it (tested on our
> board using a Linaro rootfs on a Transcend SDHC card and I didn't get
> errors after applying this patch but I'm stopped by udev errors now with
> this rootfs).
>
> diff --git a/drivers/mmc/host/sdhci-esdhc-imx.c
> b/drivers/mmc/host/sdhci-esdhc-imx.c
> index 2e9cca1..e8f7048 100644
> --- a/drivers/mmc/host/sdhci-esdhc-imx.c
> +++ b/drivers/mmc/host/sdhci-esdhc-imx.c
> @@ -134,7 +134,8 @@ static struct sdhci_ops sdhci_esdhc_ops = {
>
> struct sdhci_pltfm_data sdhci_esdhc_imx_pdata = {
> .quirks = ESDHC_DEFAULT_QUIRKS | SDHCI_QUIRK_NO_MULTIBLOCK
> - | SDHCI_QUIRK_BROKEN_ADMA,
> + | SDHCI_QUIRK_BROKEN_ADMA
> + | SDHCI_QUIRK_BROKEN_TIMEOUT_VAL,
> /* ADMA has issues. Might be fixable */
> /* NO_MULTIBLOCK might be MX35 only (Errata: ENGcm07207) */
> .ops = &sdhci_esdhc_ops,
>
>
> > What's kinds of tests and environment you did at your side?
> >
> Environment : our i.MX515 based boards.
> Tests (until now) : mount + a few read/write.
> We have a nand flash on board so our rootfs is on it so I didn't test a
> rootfs until this morning.
>
> Eric
^ permalink raw reply [flat|nested] 84+ messages in thread
* Re: [PATCH 0/6] SD/MMC driver for MX25/35/51
2010-10-18 8:48 ` Zhu Richard-R65037
@ 2010-10-18 11:36 ` Wolfram Sang
-1 siblings, 0 replies; 84+ messages in thread
From: Wolfram Sang @ 2010-10-18 11:36 UTC (permalink / raw)
To: Zhu Richard-R65037
Cc: Eric Bénard, Arnaud Patard, linux-mmc, linux-arm-kernel,
Guo Shawn-R65073
[-- Attachment #1: Type: text/plain, Size: 1219 bytes --]
Hi Richard,
On Mon, Oct 18, 2010 at 04:48:07PM +0800, Zhu Richard-R65037 wrote:
> The debug msg "mmc0: mmc_rescan: trying to init card at 400000 Hz..." are dumped out repeatedly.
> ROOT: There are pr_info codes in the mmc_rescan func.
There was already a patch on this list fixing it.
> The other:
> Encounter the Timeout and CRC error when the sandisk 4G SDHC card are used as the ROOTFS storage media
> When I boot up the BBG board.
>
> It seems that the "SDHCI_QUIRK_BROKEN_TIMEOUT_VAL" is mandatory required at my side when I did the tests
> on BBG3.0 board, and the i.MX51 board can support the "MULTI-BLOCK".
Okay, this can be fixed...
> BTW, I still can't fetch out the latest codes out, that means I still can't found the V5 patches, although I run
> the git fetch and git rebase. :(
My branch gets rebased because I can't mainline the driver with all my
incremental improvements. Does just taking the branch and cherry-pick
your additions work? (BTW meanwhile you can also just use mmc-next)
Regards,
Wolfram
--
Pengutronix e.K. | Wolfram Sang |
Industrial Linux Solutions | http://www.pengutronix.de/ |
[-- Attachment #2: Digital signature --]
[-- Type: application/pgp-signature, Size: 197 bytes --]
^ permalink raw reply [flat|nested] 84+ messages in thread
* [PATCH 0/6] SD/MMC driver for MX25/35/51
@ 2010-10-18 11:36 ` Wolfram Sang
0 siblings, 0 replies; 84+ messages in thread
From: Wolfram Sang @ 2010-10-18 11:36 UTC (permalink / raw)
To: linux-arm-kernel
Hi Richard,
On Mon, Oct 18, 2010 at 04:48:07PM +0800, Zhu Richard-R65037 wrote:
> The debug msg "mmc0: mmc_rescan: trying to init card at 400000 Hz..." are dumped out repeatedly.
> ROOT: There are pr_info codes in the mmc_rescan func.
There was already a patch on this list fixing it.
> The other:
> Encounter the Timeout and CRC error when the sandisk 4G SDHC card are used as the ROOTFS storage media
> When I boot up the BBG board.
>
> It seems that the "SDHCI_QUIRK_BROKEN_TIMEOUT_VAL" is mandatory required at my side when I did the tests
> on BBG3.0 board, and the i.MX51 board can support the "MULTI-BLOCK".
Okay, this can be fixed...
> BTW, I still can't fetch out the latest codes out, that means I still can't found the V5 patches, although I run
> the git fetch and git rebase. :(
My branch gets rebased because I can't mainline the driver with all my
incremental improvements. Does just taking the branch and cherry-pick
your additions work? (BTW meanwhile you can also just use mmc-next)
Regards,
Wolfram
--
Pengutronix e.K. | Wolfram Sang |
Industrial Linux Solutions | http://www.pengutronix.de/ |
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 197 bytes
Desc: Digital signature
URL: <http://lists.infradead.org/pipermail/linux-arm-kernel/attachments/20101018/bd8ece60/attachment.sig>
^ permalink raw reply [flat|nested] 84+ messages in thread
* Re: [PATCH 0/6] SD/MMC driver for MX25/35/51
2010-10-18 9:36 ` Eric Bénard
@ 2010-10-18 11:38 ` Wolfram Sang
-1 siblings, 0 replies; 84+ messages in thread
From: Wolfram Sang @ 2010-10-18 11:38 UTC (permalink / raw)
To: Eric Bénard
Cc: Zhu Richard-R65037, linux-arm-kernel, Guo Shawn-R65073, linux-mmc,
Arnaud Patard
[-- Attachment #1: Type: text/plain, Size: 436 bytes --]
> you seems to be right, the attached patch seems to fix it (tested on our
> board using a Linaro rootfs on a Transcend SDHC card and I didn't get
> errors after applying this patch but I'm stopped by udev errors now with
> this rootfs).
Is this needed on MX35, too?
--
Pengutronix e.K. | Wolfram Sang |
Industrial Linux Solutions | http://www.pengutronix.de/ |
[-- Attachment #2: Digital signature --]
[-- Type: application/pgp-signature, Size: 197 bytes --]
^ permalink raw reply [flat|nested] 84+ messages in thread
* [PATCH 0/6] SD/MMC driver for MX25/35/51
@ 2010-10-18 11:38 ` Wolfram Sang
0 siblings, 0 replies; 84+ messages in thread
From: Wolfram Sang @ 2010-10-18 11:38 UTC (permalink / raw)
To: linux-arm-kernel
> you seems to be right, the attached patch seems to fix it (tested on our
> board using a Linaro rootfs on a Transcend SDHC card and I didn't get
> errors after applying this patch but I'm stopped by udev errors now with
> this rootfs).
Is this needed on MX35, too?
--
Pengutronix e.K. | Wolfram Sang |
Industrial Linux Solutions | http://www.pengutronix.de/ |
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 197 bytes
Desc: Digital signature
URL: <http://lists.infradead.org/pipermail/linux-arm-kernel/attachments/20101018/1609f006/attachment.sig>
^ permalink raw reply [flat|nested] 84+ messages in thread
* Re: [PATCH 0/6] SD/MMC driver for MX25/35/51
2010-10-18 11:38 ` Wolfram Sang
@ 2010-10-18 11:51 ` Eric Bénard
-1 siblings, 0 replies; 84+ messages in thread
From: Eric Bénard @ 2010-10-18 11:51 UTC (permalink / raw)
To: Wolfram Sang
Cc: Zhu Richard-R65037, linux-arm-kernel, Guo Shawn-R65073, linux-mmc,
Arnaud Patard
Le 18/10/2010 13:38, Wolfram Sang a écrit :
>> you seems to be right, the attached patch seems to fix it (tested on our
>> board using a Linaro rootfs on a Transcend SDHC card and I didn't get
>> errors after applying this patch but I'm stopped by udev errors now with
>> this rootfs).
>
> Is this needed on MX35, too?
>
will test asap and send a formal patch once tested.
Eric
^ permalink raw reply [flat|nested] 84+ messages in thread
* [PATCH 0/6] SD/MMC driver for MX25/35/51
@ 2010-10-18 11:51 ` Eric Bénard
0 siblings, 0 replies; 84+ messages in thread
From: Eric Bénard @ 2010-10-18 11:51 UTC (permalink / raw)
To: linux-arm-kernel
Le 18/10/2010 13:38, Wolfram Sang a ?crit :
>> you seems to be right, the attached patch seems to fix it (tested on our
>> board using a Linaro rootfs on a Transcend SDHC card and I didn't get
>> errors after applying this patch but I'm stopped by udev errors now with
>> this rootfs).
>
> Is this needed on MX35, too?
>
will test asap and send a formal patch once tested.
Eric
^ permalink raw reply [flat|nested] 84+ messages in thread
end of thread, other threads:[~2010-10-18 11:51 UTC | newest]
Thread overview: 84+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2010-10-11 14:21 [PATCH 0/6] SD/MMC driver for MX25/35/51 Wolfram Sang
2010-10-11 14:21 ` Wolfram Sang
2010-10-11 14:21 ` [PATCH 1/6] mmc: sdhci-pltfm: Add structure for host-specific data Wolfram Sang
2010-10-11 14:21 ` Wolfram Sang
2010-10-11 14:21 ` [PATCH 2/6] mmc: sdhci-pltfm: move .h-file into apropriate subdir Wolfram Sang
2010-10-11 14:21 ` Wolfram Sang
2010-10-11 14:21 ` [PATCH 3/6] mmc: sdhci: introduce private get_ro Wolfram Sang
2010-10-11 14:21 ` Wolfram Sang
2010-10-11 14:21 ` [PATCH 4/6] mmc: sdhci_pltfm: pass more data on custom init-call Wolfram Sang
2010-10-11 14:21 ` Wolfram Sang
2010-10-11 14:21 ` [PATCH 5/6] mmc: sdhci-of-esdhc: factor out common stuff Wolfram Sang
2010-10-11 14:21 ` Wolfram Sang
2010-10-11 17:10 ` [PATCH v2 " Wolfram Sang
2010-10-11 17:10 ` Wolfram Sang
2010-10-11 18:33 ` Chris Ball
2010-10-11 18:33 ` Chris Ball
2010-10-13 10:22 ` Zhu Richard-R65037
2010-10-13 10:22 ` Zhu Richard-R65037
2010-10-13 10:31 ` Wolfram Sang
2010-10-13 10:31 ` Wolfram Sang
2010-10-11 14:21 ` [PATCH 6/6] mmc: sdhci-pltfm: add pltfm-driver for imx35/51 Wolfram Sang
2010-10-11 14:21 ` Wolfram Sang
2010-10-14 3:07 ` Chris Ball
2010-10-14 3:07 ` Chris Ball
2010-10-11 16:32 ` [PATCH 0/6] SD/MMC driver for MX25/35/51 Chris Ball
2010-10-11 16:32 ` Chris Ball
2010-10-11 16:44 ` Wolfram Sang
2010-10-11 16:44 ` Wolfram Sang
2010-10-11 16:59 ` Chris Ball
2010-10-11 16:59 ` Chris Ball
2010-10-12 22:06 ` Arnaud Patard
2010-10-12 22:06 ` Arnaud Patard (Rtp)
2010-10-13 8:15 ` Eric Bénard
2010-10-13 8:15 ` Eric Bénard
2010-10-13 8:29 ` Wolfram Sang
2010-10-13 8:29 ` Wolfram Sang
2010-10-13 9:28 ` Arnaud Patard
2010-10-13 9:28 ` Arnaud Patard (Rtp)
2010-10-13 9:53 ` Zhu Richard-R65037
2010-10-13 9:53 ` Zhu Richard-R65037
2010-10-13 10:06 ` Wolfram Sang
2010-10-13 10:06 ` Wolfram Sang
2010-10-13 10:09 ` Eric Bénard
2010-10-13 10:09 ` Eric Bénard
2010-10-13 10:13 ` Zhu Richard-R65037
2010-10-13 10:13 ` Zhu Richard-R65037
2010-10-13 10:20 ` Wolfram Sang
2010-10-13 10:20 ` Wolfram Sang
2010-10-15 10:27 ` Wolfram Sang
2010-10-15 10:27 ` Wolfram Sang
2010-10-18 3:29 ` Zhu Richard-R65037
2010-10-18 3:29 ` Zhu Richard-R65037
2010-10-18 8:48 ` Zhu Richard-R65037
2010-10-18 8:48 ` Zhu Richard-R65037
2010-10-18 9:36 ` Eric Bénard
2010-10-18 9:36 ` Eric Bénard
2010-10-18 9:44 ` Zhu Richard-R65037
2010-10-18 9:44 ` Zhu Richard-R65037
2010-10-18 11:38 ` Wolfram Sang
2010-10-18 11:38 ` Wolfram Sang
2010-10-18 11:51 ` Eric Bénard
2010-10-18 11:51 ` Eric Bénard
2010-10-18 11:36 ` Wolfram Sang
2010-10-18 11:36 ` Wolfram Sang
2010-10-15 10:25 ` Wolfram Sang
2010-10-15 10:25 ` Wolfram Sang
2010-10-15 21:20 ` Arnaud Patard
2010-10-15 21:20 ` Arnaud Patard (Rtp)
-- strict thread matches above, loose matches on Subject: below --
2010-10-15 10:20 [PATCH V5 " Wolfram Sang
2010-10-15 10:21 ` [PATCH 6/6] mmc: sdhci-pltfm: add pltfm-driver for imx35/51 Wolfram Sang
2010-10-15 10:21 ` Wolfram Sang
2010-09-29 20:07 [PATCH V3 0/6] SD/MMC-driver for MX35/51 (and improvements to SDHCI) Wolfram Sang
2010-09-29 20:08 ` [PATCH 6/6] mmc: sdhci-pltfm: add pltfm-driver for imx35/51 Wolfram Sang
2010-09-29 20:08 ` Wolfram Sang
2010-09-29 20:14 ` Chris Ball
2010-09-29 20:14 ` Chris Ball
2010-09-28 12:36 [PATCH 0/6] Add driver for mx35/51-esdhc-controller (and update sdhci for that) Wolfram Sang
2010-09-28 12:36 ` [PATCH 6/6] mmc: sdhci-pltfm: add pltfm-driver for imx35/51 Wolfram Sang
2010-09-28 12:58 ` Anton Vorontsov
2010-09-28 14:04 ` zhangfei gao
2010-09-28 14:51 ` Wolfram Sang
2010-09-28 20:57 ` Ben Dooks
2010-09-29 1:59 ` zhangfei gao
2010-09-29 2:27 ` Zhu Richard-R65037
2010-09-29 3:22 ` zhangfei gao
2010-09-29 3:41 ` Zhu Richard-R65037
2010-09-29 19:26 ` Wolfram Sang
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.