Re: [PATCH v2 05/13] mmc: sdhci-cadence: Add Pensando Elba SoC support

2021-04-09 Thread Masahiro Yamada
On Tue, Mar 30, 2021 at 7:31 PM Ulf Hansson  wrote:
>
> + Masahiro Yamada (main author of the driver)
>
> On Mon, 29 Mar 2021 at 03:59, Brad Larson  wrote:
> >
> > Add support for Pensando Elba SoC which explicitly controls
> > byte-lane enables on writes.  Refactor to allow platform
> > specific write ops.
> >
> > Signed-off-by: Brad Larson 
> > ---
> >  drivers/mmc/host/Kconfig  |  15 +++
> >  drivers/mmc/host/Makefile |   1 +
> >  drivers/mmc/host/sdhci-cadence-elba.c | 137 ++
>
> By looking at the amount of code changes that seem to be needed to
> support the Pensando Elba variant, I don't think it's necessary to
> split this into a separate file.
>
> Unless Yamada-san has a different opinion, I would rather just stick
> with using sdhci-cadence.c.


I agree with Ulf.


BTW, this patch cannot probe
"pensando,elba-emmc"
when CONFIG_MMC_SDHCI_CADENCE_ELBA=m.




>
> >  drivers/mmc/host/sdhci-cadence.c  |  81 ---
> >  drivers/mmc/host/sdhci-cadence.h  |  68 +
> >  5 files changed, 260 insertions(+), 42 deletions(-)
> >  create mode 100644 drivers/mmc/host/sdhci-cadence-elba.c
> >  create mode 100644 drivers/mmc/host/sdhci-cadence.h
> >
> > diff --git a/drivers/mmc/host/Kconfig b/drivers/mmc/host/Kconfig
> > index b236dfe2e879..65ea323c06f2 100644
> > --- a/drivers/mmc/host/Kconfig
> > +++ b/drivers/mmc/host/Kconfig
> > @@ -250,6 +250,21 @@ config MMC_SDHCI_CADENCE
> >
> >   If unsure, say N.
> >
> > +config MMC_SDHCI_CADENCE_ELBA
> > +   tristate "SDHCI support for the Pensando/Cadence SD/SDIO/eMMC 
> > controller"
> > +   depends on ARCH_PENSANDO_ELBA_SOC
> > +   depends on MMC_SDHCI
> > +   depends on OF
> > +   depends on MMC_SDHCI_CADENCE
> > +   depends on MMC_SDHCI_PLTFM
> > +   select MMC_SDHCI_IO_ACCESSORS
>
> According to the comment above - then you should probably just extend
> the conditions for when building MMC_SDHCI_CADENCE, rather than having
> to add a new Kconfig for "*_ELBA".
>
> > +   help
> > + This selects the Pensando/Cadence SD/SDIO/eMMC controller.
> > +
> > + If you have a controller with this interface, say Y or M here.
> > +
> > + If unsure, say N.
> > +
> >  config MMC_SDHCI_CNS3XXX
> > tristate "SDHCI support on the Cavium Networks CNS3xxx SoC"
> > depends on ARCH_CNS3XXX || COMPILE_TEST
> > diff --git a/drivers/mmc/host/Makefile b/drivers/mmc/host/Makefile
> > index 6df5c4774260..f2a6d50e64de 100644
> > --- a/drivers/mmc/host/Makefile
> > +++ b/drivers/mmc/host/Makefile
> > @@ -80,6 +80,7 @@ obj-$(CONFIG_MMC_REALTEK_USB) += rtsx_usb_sdmmc.o
> >
> >  obj-$(CONFIG_MMC_SDHCI_PLTFM)  += sdhci-pltfm.o
> >  obj-$(CONFIG_MMC_SDHCI_CADENCE)+= sdhci-cadence.o
> > +obj-$(CONFIG_MMC_SDHCI_CADENCE_ELBA)   += sdhci-cadence-elba.o
> >  obj-$(CONFIG_MMC_SDHCI_CNS3XXX)+= sdhci-cns3xxx.o
> >  obj-$(CONFIG_MMC_SDHCI_ESDHC_MCF)   += sdhci-esdhc-mcf.o
> >  obj-$(CONFIG_MMC_SDHCI_ESDHC_IMX)  += sdhci-esdhc-imx.o
> > diff --git a/drivers/mmc/host/sdhci-cadence-elba.c 
> > b/drivers/mmc/host/sdhci-cadence-elba.c
> > new file mode 100644
> > index ..ec23f43de407
> > --- /dev/null
> > +++ b/drivers/mmc/host/sdhci-cadence-elba.c
> > @@ -0,0 +1,137 @@
> > +// SPDX-License-Identifier: GPL-2.0-or-later
> > +/*
> > + * Copyright (C) 2020 Pensando Systems, Inc.
> > + */
> > +
> > +#include 
> > +#include 
> > +#include 
> > +#include 
> > +#include 
> > +#include 
> > +#include 
> > +#include 
> > +
> > +#include "sdhci-pltfm.h"
> > +#include "sdhci-cadence.h"
> > +
> > +// delay regs address
>
> Please don't use "//" when adding comments, but instead "/* ... */".
> This applies to several more places of the patch.
>
> > +#define SDIO_REG_HRS4  0x10

This is the same as SDHCI_CDNS_HRS04



> > +#define REG_DELAY_HS   0x00

This is the same as SDHCI_CDNS_PHY_DLY_SD_HS


> > +#define REG_DELAY_DEFAULT  0x01


This is the same as SDHCI_CDNS_PHY_DLY_SD_DEFAULT



> > +#define REG_DELAY_UHSI_SDR50   0x04

This is the same as SDHCI_CDNS_PHY_DLY_UHS_SDR50



> > +#define REG_DELAY_UHSI_DDR50   0x05


This is the same as SDHCI_CDNS_PHY_DLY_UHS_DDR50



> > +
> > +static void elba_write_l(struct sdhci_host *host, u32 val, int reg)
> > +{
> > +   struct sdhci_cdns_priv *priv = sdhci_cdns_priv(host);
> > +   unsigned long flags;
> > +
> > +   spin_lock_irqsave(&priv->wrlock, flags);
> > +   writel(0x78, priv->ctl_addr);
> > +   writel(val, host->ioaddr + reg);
> > +   spin_unlock_irqrestore(&priv->wrlock, flags);
> > +}
> > +
> > +static void elba_write_w(struct sdhci_host *host, u16 val, int reg)
> > +{
> > +   struct sdhci_cdns_priv *priv = sdhci_cdns_priv(host);
> > +   unsigned long flags;
> > +   u32 m = (reg & 0x3);
> > +   u32 msk = (0x3 << (m));
> > +
> > +   spin_lock_irqsave(&priv->wrlock, flags);
> > +   writel(msk << 3, p

Re: [PATCH v2 05/13] mmc: sdhci-cadence: Add Pensando Elba SoC support

2021-03-30 Thread Ulf Hansson
+ Masahiro Yamada (main author of the driver)

On Mon, 29 Mar 2021 at 03:59, Brad Larson  wrote:
>
> Add support for Pensando Elba SoC which explicitly controls
> byte-lane enables on writes.  Refactor to allow platform
> specific write ops.
>
> Signed-off-by: Brad Larson 
> ---
>  drivers/mmc/host/Kconfig  |  15 +++
>  drivers/mmc/host/Makefile |   1 +
>  drivers/mmc/host/sdhci-cadence-elba.c | 137 ++

By looking at the amount of code changes that seem to be needed to
support the Pensando Elba variant, I don't think it's necessary to
split this into a separate file.

Unless Yamada-san has a different opinion, I would rather just stick
with using sdhci-cadence.c.

>  drivers/mmc/host/sdhci-cadence.c  |  81 ---
>  drivers/mmc/host/sdhci-cadence.h  |  68 +
>  5 files changed, 260 insertions(+), 42 deletions(-)
>  create mode 100644 drivers/mmc/host/sdhci-cadence-elba.c
>  create mode 100644 drivers/mmc/host/sdhci-cadence.h
>
> diff --git a/drivers/mmc/host/Kconfig b/drivers/mmc/host/Kconfig
> index b236dfe2e879..65ea323c06f2 100644
> --- a/drivers/mmc/host/Kconfig
> +++ b/drivers/mmc/host/Kconfig
> @@ -250,6 +250,21 @@ config MMC_SDHCI_CADENCE
>
>   If unsure, say N.
>
> +config MMC_SDHCI_CADENCE_ELBA
> +   tristate "SDHCI support for the Pensando/Cadence SD/SDIO/eMMC 
> controller"
> +   depends on ARCH_PENSANDO_ELBA_SOC
> +   depends on MMC_SDHCI
> +   depends on OF
> +   depends on MMC_SDHCI_CADENCE
> +   depends on MMC_SDHCI_PLTFM
> +   select MMC_SDHCI_IO_ACCESSORS

According to the comment above - then you should probably just extend
the conditions for when building MMC_SDHCI_CADENCE, rather than having
to add a new Kconfig for "*_ELBA".

> +   help
> + This selects the Pensando/Cadence SD/SDIO/eMMC controller.
> +
> + If you have a controller with this interface, say Y or M here.
> +
> + If unsure, say N.
> +
>  config MMC_SDHCI_CNS3XXX
> tristate "SDHCI support on the Cavium Networks CNS3xxx SoC"
> depends on ARCH_CNS3XXX || COMPILE_TEST
> diff --git a/drivers/mmc/host/Makefile b/drivers/mmc/host/Makefile
> index 6df5c4774260..f2a6d50e64de 100644
> --- a/drivers/mmc/host/Makefile
> +++ b/drivers/mmc/host/Makefile
> @@ -80,6 +80,7 @@ obj-$(CONFIG_MMC_REALTEK_USB) += rtsx_usb_sdmmc.o
>
>  obj-$(CONFIG_MMC_SDHCI_PLTFM)  += sdhci-pltfm.o
>  obj-$(CONFIG_MMC_SDHCI_CADENCE)+= sdhci-cadence.o
> +obj-$(CONFIG_MMC_SDHCI_CADENCE_ELBA)   += sdhci-cadence-elba.o
>  obj-$(CONFIG_MMC_SDHCI_CNS3XXX)+= sdhci-cns3xxx.o
>  obj-$(CONFIG_MMC_SDHCI_ESDHC_MCF)   += sdhci-esdhc-mcf.o
>  obj-$(CONFIG_MMC_SDHCI_ESDHC_IMX)  += sdhci-esdhc-imx.o
> diff --git a/drivers/mmc/host/sdhci-cadence-elba.c 
> b/drivers/mmc/host/sdhci-cadence-elba.c
> new file mode 100644
> index ..ec23f43de407
> --- /dev/null
> +++ b/drivers/mmc/host/sdhci-cadence-elba.c
> @@ -0,0 +1,137 @@
> +// SPDX-License-Identifier: GPL-2.0-or-later
> +/*
> + * Copyright (C) 2020 Pensando Systems, Inc.
> + */
> +
> +#include 
> +#include 
> +#include 
> +#include 
> +#include 
> +#include 
> +#include 
> +#include 
> +
> +#include "sdhci-pltfm.h"
> +#include "sdhci-cadence.h"
> +
> +// delay regs address

Please don't use "//" when adding comments, but instead "/* ... */".
This applies to several more places of the patch.

> +#define SDIO_REG_HRS4  0x10
> +#define REG_DELAY_HS   0x00
> +#define REG_DELAY_DEFAULT  0x01
> +#define REG_DELAY_UHSI_SDR50   0x04
> +#define REG_DELAY_UHSI_DDR50   0x05
> +
> +static void elba_write_l(struct sdhci_host *host, u32 val, int reg)
> +{
> +   struct sdhci_cdns_priv *priv = sdhci_cdns_priv(host);
> +   unsigned long flags;
> +
> +   spin_lock_irqsave(&priv->wrlock, flags);
> +   writel(0x78, priv->ctl_addr);
> +   writel(val, host->ioaddr + reg);
> +   spin_unlock_irqrestore(&priv->wrlock, flags);
> +}
> +
> +static void elba_write_w(struct sdhci_host *host, u16 val, int reg)
> +{
> +   struct sdhci_cdns_priv *priv = sdhci_cdns_priv(host);
> +   unsigned long flags;
> +   u32 m = (reg & 0x3);
> +   u32 msk = (0x3 << (m));
> +
> +   spin_lock_irqsave(&priv->wrlock, flags);
> +   writel(msk << 3, priv->ctl_addr);
> +   writew(val, host->ioaddr + reg);
> +   spin_unlock_irqrestore(&priv->wrlock, flags);
> +}
> +
> +static void elba_write_b(struct sdhci_host *host, u8 val, int reg)
> +{
> +   struct sdhci_cdns_priv *priv = sdhci_cdns_priv(host);
> +   unsigned long flags;
> +   u32 m = (reg & 0x3);
> +   u32 msk = (0x1 << (m));
> +
> +   spin_lock_irqsave(&priv->wrlock, flags);
> +   writel(msk << 3, priv->ctl_addr);
> +   writeb(val, host->ioaddr + reg);
> +   spin_unlock_irqrestore(&priv->wrlock, flags);
> +}
> +
> +static void elba_priv_write_l(struct sdhci_cdns_priv *priv,
> +   u32 val, void __

[PATCH v2 05/13] mmc: sdhci-cadence: Add Pensando Elba SoC support

2021-03-28 Thread Brad Larson
Add support for Pensando Elba SoC which explicitly controls
byte-lane enables on writes.  Refactor to allow platform
specific write ops.

Signed-off-by: Brad Larson 
---
 drivers/mmc/host/Kconfig  |  15 +++
 drivers/mmc/host/Makefile |   1 +
 drivers/mmc/host/sdhci-cadence-elba.c | 137 ++
 drivers/mmc/host/sdhci-cadence.c  |  81 ---
 drivers/mmc/host/sdhci-cadence.h  |  68 +
 5 files changed, 260 insertions(+), 42 deletions(-)
 create mode 100644 drivers/mmc/host/sdhci-cadence-elba.c
 create mode 100644 drivers/mmc/host/sdhci-cadence.h

diff --git a/drivers/mmc/host/Kconfig b/drivers/mmc/host/Kconfig
index b236dfe2e879..65ea323c06f2 100644
--- a/drivers/mmc/host/Kconfig
+++ b/drivers/mmc/host/Kconfig
@@ -250,6 +250,21 @@ config MMC_SDHCI_CADENCE
 
  If unsure, say N.
 
+config MMC_SDHCI_CADENCE_ELBA
+   tristate "SDHCI support for the Pensando/Cadence SD/SDIO/eMMC 
controller"
+   depends on ARCH_PENSANDO_ELBA_SOC
+   depends on MMC_SDHCI
+   depends on OF
+   depends on MMC_SDHCI_CADENCE
+   depends on MMC_SDHCI_PLTFM
+   select MMC_SDHCI_IO_ACCESSORS
+   help
+ This selects the Pensando/Cadence SD/SDIO/eMMC controller.
+
+ If you have a controller with this interface, say Y or M here.
+
+ If unsure, say N.
+
 config MMC_SDHCI_CNS3XXX
tristate "SDHCI support on the Cavium Networks CNS3xxx SoC"
depends on ARCH_CNS3XXX || COMPILE_TEST
diff --git a/drivers/mmc/host/Makefile b/drivers/mmc/host/Makefile
index 6df5c4774260..f2a6d50e64de 100644
--- a/drivers/mmc/host/Makefile
+++ b/drivers/mmc/host/Makefile
@@ -80,6 +80,7 @@ obj-$(CONFIG_MMC_REALTEK_USB) += rtsx_usb_sdmmc.o
 
 obj-$(CONFIG_MMC_SDHCI_PLTFM)  += sdhci-pltfm.o
 obj-$(CONFIG_MMC_SDHCI_CADENCE)+= sdhci-cadence.o
+obj-$(CONFIG_MMC_SDHCI_CADENCE_ELBA)   += sdhci-cadence-elba.o
 obj-$(CONFIG_MMC_SDHCI_CNS3XXX)+= sdhci-cns3xxx.o
 obj-$(CONFIG_MMC_SDHCI_ESDHC_MCF)   += sdhci-esdhc-mcf.o
 obj-$(CONFIG_MMC_SDHCI_ESDHC_IMX)  += sdhci-esdhc-imx.o
diff --git a/drivers/mmc/host/sdhci-cadence-elba.c 
b/drivers/mmc/host/sdhci-cadence-elba.c
new file mode 100644
index ..ec23f43de407
--- /dev/null
+++ b/drivers/mmc/host/sdhci-cadence-elba.c
@@ -0,0 +1,137 @@
+// SPDX-License-Identifier: GPL-2.0-or-later
+/*
+ * Copyright (C) 2020 Pensando Systems, Inc.
+ */
+
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+
+#include "sdhci-pltfm.h"
+#include "sdhci-cadence.h"
+
+// delay regs address
+#define SDIO_REG_HRS4  0x10
+#define REG_DELAY_HS   0x00
+#define REG_DELAY_DEFAULT  0x01
+#define REG_DELAY_UHSI_SDR50   0x04
+#define REG_DELAY_UHSI_DDR50   0x05
+
+static void elba_write_l(struct sdhci_host *host, u32 val, int reg)
+{
+   struct sdhci_cdns_priv *priv = sdhci_cdns_priv(host);
+   unsigned long flags;
+
+   spin_lock_irqsave(&priv->wrlock, flags);
+   writel(0x78, priv->ctl_addr);
+   writel(val, host->ioaddr + reg);
+   spin_unlock_irqrestore(&priv->wrlock, flags);
+}
+
+static void elba_write_w(struct sdhci_host *host, u16 val, int reg)
+{
+   struct sdhci_cdns_priv *priv = sdhci_cdns_priv(host);
+   unsigned long flags;
+   u32 m = (reg & 0x3);
+   u32 msk = (0x3 << (m));
+
+   spin_lock_irqsave(&priv->wrlock, flags);
+   writel(msk << 3, priv->ctl_addr);
+   writew(val, host->ioaddr + reg);
+   spin_unlock_irqrestore(&priv->wrlock, flags);
+}
+
+static void elba_write_b(struct sdhci_host *host, u8 val, int reg)
+{
+   struct sdhci_cdns_priv *priv = sdhci_cdns_priv(host);
+   unsigned long flags;
+   u32 m = (reg & 0x3);
+   u32 msk = (0x1 << (m));
+
+   spin_lock_irqsave(&priv->wrlock, flags);
+   writel(msk << 3, priv->ctl_addr);
+   writeb(val, host->ioaddr + reg);
+   spin_unlock_irqrestore(&priv->wrlock, flags);
+}
+
+static void elba_priv_write_l(struct sdhci_cdns_priv *priv,
+   u32 val, void __iomem *reg)
+{
+   unsigned long flags;
+
+   spin_lock_irqsave(&priv->wrlock, flags);
+   writel(0x78, priv->ctl_addr);
+   writel(val, reg);
+   spin_unlock_irqrestore(&priv->wrlock, flags);
+}
+
+static const struct sdhci_ops sdhci_elba_ops = {
+   .write_l = elba_write_l,
+   .write_w = elba_write_w,
+   .write_b = elba_write_b,
+   .set_clock = sdhci_set_clock,
+   .get_timeout_clock = sdhci_cdns_get_timeout_clock,
+   .set_bus_width = sdhci_set_bus_width,
+   .reset = sdhci_reset,
+   .set_uhs_signaling = sdhci_cdns_set_uhs_signaling,
+};
+
+static void sd4_set_dlyvr(struct sdhci_host *host,
+ unsigned char addr, unsigned char data)
+{
+   unsigned long dlyrv_reg;
+
+   dlyrv_reg = ((unsigned long)data << 8);
+   dlyrv_reg |= addr;
+
+   // set data and address
+   writel(dlyrv_reg, host->ioa