Re: [PATCH v3 1/3] m68k: mcf5441x: add support for esdhc mmc controller

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Hi Greg and all,

thanks a lot !

ack, let me know if you can add that comment, or i can send a v4.

I am also appending a test log, just to show the driver is working quite well,
for me it really speed-up each type of development in this cpu.

/mnt/sd # chmod 755 test-sd.sh
/mnt/sd # ./test-sd.sh
[01] test: simple file creation ...
creating testfiles ...
checking testfiles ...
passed
[02] test: file deletion ...
removing all testfiles ...
passed
[03] test: folder creation ...
creating testdirs ...
passed
[04] test: touching files in testdirs ...
passed
[05] test: full removal ...
passed
[06] test: big file write ...
passed
[07] test: big file move ...
passed
[08] test: big file and dir removal ...
passed
[09] test: simple read ...
trullallero
passed
[10] test: simple read from dir ...
trullallero
passed
[11] test: cleanup ...
passed
/mnt/sd #


Regards,
angelo


On Tue, May 12, 2020 at 5:06 PM Greg Ungerer <gerg@xxxxxxxxxxxxxx> wrote:

Hi Angelo,

On 2/5/20 9:59 am, Angelo Dureghello wrote:
Add support for sdhci-edshc mmc controller.

Signed-off-by: Angelo Dureghello <angelo.dureghello@xxxxxxxxxxx>
---
Changes for v3:
- removed volatile cast from clk.c
---
  arch/m68k/coldfire/clk.c                    | 15 ++++++++++
  arch/m68k/coldfire/device.c                 | 33 +++++++++++++++++++--
  arch/m68k/coldfire/m5441x.c                 | 12 +++++++-
  arch/m68k/include/asm/m5441xsim.h           | 19 ++++++++++++
  arch/m68k/include/asm/mcfclk.h              |  2 ++
  include/linux/platform_data/mmc-esdhc-mcf.h | 17 +++++++++++
  6 files changed, 95 insertions(+), 3 deletions(-)
  create mode 100644 include/linux/platform_data/mmc-esdhc-mcf.h

diff --git a/arch/m68k/coldfire/clk.c b/arch/m68k/coldfire/clk.c
index 7bc666e482eb..8d048a72e173 100644
--- a/arch/m68k/coldfire/clk.c
+++ b/arch/m68k/coldfire/clk.c
@@ -73,6 +73,21 @@ struct clk_ops clk_ops1 = {
  #endif /* MCFPM_PPMCR1 */
  #endif /* MCFPM_PPMCR0 */

+static void __clk_enable2(struct clk *clk)
+{
+     __set_bit(clk->slot, MCFSDHC_CLK);
+}
+
+static void __clk_disable2(struct clk *clk)
+{
+     __clear_bit(clk->slot, MCFSDHC_CLK);
+}
+
+struct clk_ops clk_ops2 = {
+     .enable         = __clk_enable2,
+     .disable        = __clk_disable2,
+};
+
  struct clk *clk_get(struct device *dev, const char *id)
  {
      const char *clk_name = dev ? dev_name(dev) : id ? id : NULL;
diff --git a/arch/m68k/coldfire/device.c b/arch/m68k/coldfire/device.c
index b4103b6bfdeb..9ef4ec0aea00 100644
--- a/arch/m68k/coldfire/device.c
+++ b/arch/m68k/coldfire/device.c
@@ -22,6 +22,7 @@
  #include <asm/mcfqspi.h>
  #include <linux/platform_data/edma.h>
  #include <linux/platform_data/dma-mcf-edma.h>
+#include <linux/platform_data/mmc-esdhc-mcf.h>

  /*
   *  All current ColdFire parts contain from 2, 3, 4 or 10 UARTS.
@@ -551,9 +552,35 @@ static struct platform_device mcf_edma = {
              .platform_data = &mcf_edma_data,
      }
  };
-
  #endif /* IS_ENABLED(CONFIG_MCF_EDMA) */

+#if IS_ENABLED(CONFIG_MMC)
+static struct mcf_esdhc_platform_data mcf_esdhc_data = {
+     .max_bus_width = 4,
+     .cd_type = ESDHC_CD_NONE,
+};
+
+static struct resource mcf_esdhc_resources[] = {
+     {
+             .start = MCFSDHC_BASE,
+             .end = MCFSDHC_BASE + MCFSDHC_SIZE - 1,
+             .flags = IORESOURCE_MEM,
+     }, {
+             .start = MCF_IRQ_SDHC,
+             .end = MCF_IRQ_SDHC,
+             .flags = IORESOURCE_IRQ,
+     },
+};
+
+static struct platform_device mcf_esdhc = {
+     .name                   = "sdhci-esdhc-mcf",
+     .id                     = 0,
+     .num_resources          = ARRAY_SIZE(mcf_esdhc_resources),
+     .resource               = mcf_esdhc_resources,
+     .dev.platform_data      = &mcf_esdhc_data,
+};
+#endif /* IS_ENABLED(CONFIG_MMC) */
+
  static struct platform_device *mcf_devices[] __initdata = {
      &mcf_uart,
  #if IS_ENABLED(CONFIG_FEC)
@@ -586,6 +613,9 @@ static struct platform_device *mcf_devices[] __initdata = {
  #if IS_ENABLED(CONFIG_MCF_EDMA)
      &mcf_edma,
  #endif
+#if IS_ENABLED(CONFIG_MMC)
+     &mcf_esdhc,
+#endif
  };

  /*
@@ -614,4 +644,3 @@ static int __init mcf_init_devices(void)
  }

  arch_initcall(mcf_init_devices);
-
diff --git a/arch/m68k/coldfire/m5441x.c b/arch/m68k/coldfire/m5441x.c
index 5bd24c9b865d..ffa02de1a3fb 100644
--- a/arch/m68k/coldfire/m5441x.c
+++ b/arch/m68k/coldfire/m5441x.c
@@ -52,7 +52,7 @@ DEFINE_CLK(0, "mcfssi.0", 47, MCF_CLK);
  DEFINE_CLK(0, "pll.0", 48, MCF_CLK);
  DEFINE_CLK(0, "mcfrng.0", 49, MCF_CLK);
  DEFINE_CLK(0, "mcfssi.1", 50, MCF_CLK);
-DEFINE_CLK(0, "mcfsdhc.0", 51, MCF_CLK);
+DEFINE_CLK(0, "sdhci-esdhc-mcf.0", 51, MCF_CLK);
  DEFINE_CLK(0, "enet-fec.0", 53, MCF_CLK);
  DEFINE_CLK(0, "enet-fec.1", 54, MCF_CLK);
  DEFINE_CLK(0, "switch.0", 55, MCF_CLK);
@@ -74,6 +74,10 @@ DEFINE_CLK(1, "mcfpwm.0", 34, MCF_BUSCLK);
  DEFINE_CLK(1, "sys.0", 36, MCF_BUSCLK);
  DEFINE_CLK(1, "gpio.0", 37, MCF_BUSCLK);

+DEFINE_CLK(2, "ipg.0", 0, MCF_CLK);
+DEFINE_CLK(2, "ahb.0", 1, MCF_CLK);
+DEFINE_CLK(2, "per.0", 2, MCF_CLK);
+
  struct clk *mcf_clks[] = {
      &__clk_0_2,
      &__clk_0_8,
@@ -131,6 +135,11 @@ struct clk *mcf_clks[] = {
      &__clk_1_34,
      &__clk_1_36,
      &__clk_1_37,
+
+     &__clk_2_0,
+     &__clk_2_1,
+     &__clk_2_2,
+
      NULL,
  };

@@ -151,6 +160,7 @@ static struct clk * const enable_clks[] __initconst = {
      &__clk_0_33, /* pit.1 */
      &__clk_0_37, /* eport */
      &__clk_0_48, /* pll */
+     &__clk_0_51, /* esdhc */

      &__clk_1_36, /* CCM/reset module/Power management */
      &__clk_1_37, /* gpio */
diff --git a/arch/m68k/include/asm/m5441xsim.h b/arch/m68k/include/asm/m5441xsim.h
index 4892f314ff38..750555a6fa87 100644
--- a/arch/m68k/include/asm/m5441xsim.h
+++ b/arch/m68k/include/asm/m5441xsim.h
@@ -278,6 +278,17 @@
  #define MCFGPIO_IRQ_VECBASE (MCFINT_VECBASE - MCFGPIO_IRQ_MIN)
  #define MCFGPIO_PIN_MAX             87

+/*********************************************************************
+ *
+ * Phase Locked Loop (PLL)
+ *
+ *********************************************************************/

Style nit. Just a simple:

/*
  * Phase Locked Loop (PLL)
  */

comment is preferred here - to be consistent with other comments in this file.

Otherwise:

Acked-by: Greg Ungerer <gerg@xxxxxxxxxxxxxx>

Regards
Greg


+/* Register read/write macros */
+#define MCF_PLL_CR           0xFC0C0000
+#define MCF_PLL_DR           0xFC0C0004
+#define MCF_PLL_SR           0xFC0C0008
+
  /*
   *  DSPI module.
   */
@@ -298,5 +309,13 @@
  #define MCFEDMA_IRQ_INTR16  (MCFINT1_VECBASE + MCFEDMA_EDMA_INTR16)
  #define MCFEDMA_IRQ_INTR56  (MCFINT2_VECBASE + MCFEDMA_EDMA_INTR56)
  #define MCFEDMA_IRQ_ERR     (MCFINT0_VECBASE + MCFINT0_EDMA_ERR)
+/*
+ *  esdhc module.
+ */
+#define MCFSDHC_BASE         0xfc0cc000
+#define MCFSDHC_SIZE         256
+#define MCFINT2_SDHC         31
+#define MCF_IRQ_SDHC         (MCFINT2_VECBASE + MCFINT2_SDHC)
+#define MCFSDHC_CLK          (MCFSDHC_BASE + 0x2c)

  #endif /* m5441xsim_h */
diff --git a/arch/m68k/include/asm/mcfclk.h b/arch/m68k/include/asm/mcfclk.h
index 0aca504fae31..722627e06d66 100644
--- a/arch/m68k/include/asm/mcfclk.h
+++ b/arch/m68k/include/asm/mcfclk.h
@@ -30,6 +30,8 @@ extern struct clk_ops clk_ops0;
  extern struct clk_ops clk_ops1;
  #endif /* MCFPM_PPMCR1 */

+extern struct clk_ops clk_ops2;
+
  #define DEFINE_CLK(clk_bank, clk_name, clk_slot, clk_rate) \
  static struct clk __clk_##clk_bank##_##clk_slot = { \
      .name = clk_name, \
diff --git a/include/linux/platform_data/mmc-esdhc-mcf.h b/include/linux/platform_data/mmc-esdhc-mcf.h
new file mode 100644
index 000000000000..85cb786a62fe
--- /dev/null
+++ b/include/linux/platform_data/mmc-esdhc-mcf.h
@@ -0,0 +1,17 @@
+/* SPDX-License-Identifier: GPL-2.0 */
+
+#ifndef __LINUX_PLATFORM_DATA_MCF_ESDHC_H__
+#define __LINUX_PLATFORM_DATA_MCF_ESDHC_H__
+
+enum cd_types {
+     ESDHC_CD_NONE,          /* no CD, neither controller nor gpio */
+     ESDHC_CD_CONTROLLER,    /* mmc controller internal CD */
+     ESDHC_CD_PERMANENT,     /* no CD, card permanently wired to host */
+};
+
+struct mcf_esdhc_platform_data {
+     int max_bus_width;
+     int cd_type;
+};
+
+#endif /* __LINUX_PLATFORM_DATA_MCF_ESDHC_H__ */




-- 
Angelo Dureghello
Timesys
e. angelo.dureghello@xxxxxxxxxxx



[Index of Archives]     [Video for Linux]     [Yosemite News]     [Linux S/390]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux