All of lore.kernel.org
 help / color / mirror / Atom feed
From: Patrice CHOTARD <patrice.chotard@st.com>
To: u-boot@lists.denx.de
Subject: [U-Boot] [PATCH v2 1/1] mmc: Add MMC support for stm32h7 Socs
Date: Thu, 20 Jul 2017 07:08:19 +0000	[thread overview]
Message-ID: <b5524c12-3c79-a359-df60-936957ca93e3@st.com> (raw)
In-Reply-To: <ab42b537-bd4a-40e9-febd-aaf84039faf5@samsung.com>

Hi Jaehoon

On 07/20/2017 06:22 AM, Jaehoon Chung wrote:
> Hi Patrice
> 
> On 07/19/2017 09:20 PM, Patrice CHOTARD wrote:
>> Hi Jaehoon
>>
>> On 07/19/2017 12:11 PM, Jaehoon Chung wrote:
>>> Hi,
>>>
>>> On 07/19/2017 04:27 PM, patrice.chotard at st.com wrote:
>>>> From: Patrice Chotard <patrice.chotard@st.com>
>>>>
>>>> This patch adds SD/MMC support for STM32H7 SoCs.
>>>>
>>>> Here is an extraction of SDMMC main features, embedded in
>>>> STM32H7 SoCs.
>>>> The SD/MMC block include the following:
>>>>    _ Full compliance with MultiMediaCard System Specification
>>>>      Version 4.51. Card support for three different databus modes:
>>>>      1-bit (default), 4-bit and 8-bit.
>>>>    _ Full compatibility with previous versions of MultiMediaCards
>>>>      (backward compatibility).
>>>>    _ Full compliance with SD memory card specifications version 4.1.
>>>>      (SDR104 SDMMC_CK speed limited to maximum allowed IO speed,
>>>>       SPI mode and UHS-II mode not supported).
>>>>    _ Full compliance with SDIO card specification version 4.0.
>>>>      Card support for two different databus modes: 1-bit (default)
>>>>      and 4-bit. (SDR104 SDMMC_CK speed limited to maximum allowed IO
>>>>      speed, SPI mode and UHS-II mode not supported).
>>>>    _ Data transfer up to 208 Mbyte/s for the 8 bit mode.
>>>>      (depending maximum allowed IO speed).
>>>>    _ Data and command output enable signals to control external
>>>>      bidirectional drivers.
>>>>
>>>> The current version of the SDMMC supports only one SD/SDIO/MMC card
>>>> at any one time and a stack of MMC Version 4.51 or previous.
>>>>
>>>> Signed-off-by: Christophe Kerello <christophe.kerello@st.com>
>>>> Signed-off-by: Patrice Chotard <patrice.chotard@st.com>
>>>> ---
>>>>
>>>> v2: _ add .get_cd() callback support
>>>>
>>>>    drivers/mmc/Kconfig        |   8 +
>>>>    drivers/mmc/Makefile       |   1 +
>>>>    drivers/mmc/stm32_sdmmc2.c | 619 +++++++++++++++++++++++++++++++++++++++++++++
>>>>    3 files changed, 628 insertions(+)
>>>>    create mode 100644 drivers/mmc/stm32_sdmmc2.c
>>>>
>>>> diff --git a/drivers/mmc/Kconfig b/drivers/mmc/Kconfig
>>>> index 82b8d75..f2e4c26 100644
>>>> --- a/drivers/mmc/Kconfig
>>>> +++ b/drivers/mmc/Kconfig
>>>> @@ -377,6 +377,14 @@ config GENERIC_ATMEL_MCI
>>>>    	  the SD Memory Card Specification V2.0, the SDIO V2.0 specification
>>>>    	  and CE-ATA V1.1.
>>>>    
>>>> +config STM32_SDMMC2
>>>
>>> Why add the SDMMC2? not SDMMC?
>>> Is there a special reason?
>>
>> It's simply the IP name
>>
>>>
>>>> +	bool "STMicroelectronics STM32H7 SD/MMC Host Controller support"
>>>> +	depends on DM_MMC && OF_CONTROL && DM_MMC_OPS
>>>> +	help
>>>> +	  This selects support for the SD/MMC controller on STM32H7 SoCs.
>>>> +	  If you have a board based on such a SoC and with a SD/MMC slot,
>>>> +	  say Y or M here.
>>>> +
>>>>    endif
>>>>    
>>>>    config TEGRA124_MMC_DISABLE_EXT_LOOPBACK
>>>> diff --git a/drivers/mmc/Makefile b/drivers/mmc/Makefile
>>>> index 2d781c3..2584663 100644
>>>> --- a/drivers/mmc/Makefile
>>>> +++ b/drivers/mmc/Makefile
>>>> @@ -43,6 +43,7 @@ obj-$(CONFIG_SUPPORT_EMMC_RPMB) += rpmb.o
>>>>    obj-$(CONFIG_MMC_SANDBOX)		+= sandbox_mmc.o
>>>>    obj-$(CONFIG_SH_MMCIF) += sh_mmcif.o
>>>>    obj-$(CONFIG_SH_SDHI) += sh_sdhi.o
>>>> +obj-$(CONFIG_STM32_SDMMC2) += stm32_sdmmc2.o
>>>>    
>>>>    # SDHCI
>>>>    obj-$(CONFIG_MMC_SDHCI)			+= sdhci.o
>>>> diff --git a/drivers/mmc/stm32_sdmmc2.c b/drivers/mmc/stm32_sdmmc2.c
>>>> new file mode 100644
>>>> index 0000000..84f96e5
>>>> --- /dev/null
>>>> +++ b/drivers/mmc/stm32_sdmmc2.c
>>>> @@ -0,0 +1,619 @@
>>>> +/*
>>>> + *  Copyright (c) 2017 STMicrelectronics
>>>> + *
>>>> + * SPDX-License-Identifier:	GPL-2.0
>>>> + */
>>>> +
>>>> +#include <common.h>
>>>> +#include <clk.h>
>>>> +#include <dm.h>
>>>> +#include <fdtdec.h>
>>>> +#include <libfdt.h>
>>>> +#include <mmc.h>
>>>> +#include <reset.h>
>>>> +#include <asm/io.h>
>>>> +#include <asm/gpio.h>
>>>> +
>>>> +struct stm32_sdmmc2 {
>>>> +	u32 power;		/* SDMMC power control             [0x00] */
>>>> +	u32 clkcr;		/* SDMMC clock control             [0x04] */
>>>> +	u32 arg;		/* SDMMC argument                  [0x08] */
>>>> +	u32 cmd;		/* SDMMC command                   [0x0C] */
>>>> +	u32 respcmd;		/* SDMMC command response          [0x10] */
>>>> +	u32 resp1;		/* SDMMC response 1                [0x14] */
>>>> +	u32 resp2;		/* SDMMC response 2                [0x18] */
>>>> +	u32 resp3;		/* SDMMC response 3                [0x1C] */
>>>> +	u32 resp4;		/* SDMMC response 4                [0x20] */
>>>> +	u32 dtimer;		/* SDMMC data timer                [0x24] */
>>>> +	u32 dlen;		/* SDMMC data length               [0x28] */
>>>> +	u32 dctrl;		/* SDMMC data control              [0x2C] */
>>>> +	u32 dcount;		/* SDMMC data counter              [0x30] */
>>>> +	u32 sta;		/* SDMMC status                    [0x34] */
>>>> +	u32 icr;		/* SDMMC interrupt clear           [0x38] */
>>>> +	u32 mask;		/* SDMMC mask                      [0x3C] */
>>>> +	u32 acktime;		/* SDMMC Acknowledgment timer      [0x40] */
>>>> +	u32 reserved0[3];	/* Reserved, 0x44 - 0x4C - 0x4C           */
>>>> +	u32 idmactrl;		/* SDMMC DMA control               [0x50] */
>>>> +	u32 idmabsize;		/* SDMMC DMA buffer size           [0x54] */
>>>> +	u32 idmabase0;		/* SDMMC DMA buffer 0 base address [0x58] */
>>>> +	u32 idmabase1;		/* SDMMC DMA buffer 1 base address [0x5C] */
>>>> +	u32 reserved1[8];	/* Reserved, 0x4C-0x7C                    */
>>>> +	u32 fifo;		/* SDMMC data FIFO                 [0x80] */
>>>> +};
>>>
>>> This is for register offset, right?
>>
>> yes
>>
>>>
>>> I want to use the defined value..likes "#define SDMMC_POWER_CONTROL 0x00"
>>> (It's my preference.)
>>> I'm not sure but i have remembered that was difficult to debug.
>>
>> But on http://www.denx.de/wiki/U-Boot/CodingStyle, it's recommended to
>> use structures for I/O access, see "Use structures for I/O access " chapter.
> 
> It's recommended, not mandatory.
> Already used the "define" style in mmc subsystem on u-boot.
> e.g) sdhci/dwmmc controller etc...
> 
> I think it's no problem to use "define" style..
> In my opinion, it's more complex than define..
> 
> For example, some controllers can be changed the register offset according to IP version.
> Then we needs to make new structure for it.
> 
> And if someone calculated wrong offset, then it's possible that all register should be accessed to wrong offset.
> That's why it's my preference.

Ok i will convert this driver with registers offset.

> 
>>
>>
>>>
>>>> +
>>>> +struct stm32_sdmmc2_host {
>>>> +	struct stm32_sdmmc2 *base;
>>>> +	struct mmc_config cfg;
>>>> +	struct clk clk;
>>>> +	struct reset_ctl reset_ctl;
>>>> +	struct gpio_desc cd_gpio;
>>>> +	u32 clk_reg_add;
>>>> +	u32 pwr_reg_add;
>>>> +};
>>>> +
> 
> [..snip..]
> 
>>>> +		cfg->host_caps |= MMC_MODE_4BIT;
>>>> +		break;
>>>> +	case 1:
>>>> +		break;
>>>> +	default:
>>>> +		printf("%s: invalid \"bus-width\" property\n", __func__);
>>>> +		ret = -ENOENT;
>>>> +		goto reset_free;
>>>
>>> Maybe default value can be 1..
>>
>> Default value is already set to 1 in case the property "bus-width" is
>> not present in DT.
>>
>> The "default" case is just a protection in case of "bus-width" property
>> is set with other values than 1, 4 or 8.
> 
> Then i think it can be just displayed wrong dt property value, not returned error
> and host controller and card can be worked with 1bit buswidth..
> how about? :)

Agree, i will fix it

Thanks

Patrice

> 
> Best Regards,
> Jaehoon Chung
> 
>>
>>>
>>>> +	}
>>>> +
>>>> +	mmc = mmc_create(cfg, host);
>>>> +	if (!mmc) {
>>>> +		ret = -ENOMEM;
>>>> +		goto reset_free;
>>>> +	}
>>>> +
>>>> +	mmc->block_dev.removable = !dev_read_bool(dev, "non-removable");
>>>> +	mmc->dev = dev;
>>>> +	upriv->mmc = mmc;
>>>> +
>>>> +	return 0;
>>>> +
>>>> +reset_free:
>>>> +	reset_free(&host->reset_ctl);
>>>> +clk_disable:
>>>> +	clk_disable(&host->clk);
>>>> +clk_free:
>>>> +	clk_free(&host->clk);
>>>> +
>>>> +	return ret;
>>>> +}
>>>> +
>>>> +static const struct udevice_id stm32_sdmmc2_ids[] = {
>>>> +	{ .compatible = "st,stm32-sdmmc2" },
>>>> +	{ }
>>>> +};
>>>> +
>>>> +U_BOOT_DRIVER(stm32_sdmmc2) = {
>>>> +	.name = "stm32_sdmmc2",
>>>> +	.id = UCLASS_MMC,
>>>> +	.of_match = stm32_sdmmc2_ids,
>>>> +	.ops = &stm32_sdmmc2_ops,
>>>> +	.probe = stm32_sdmmc2_probe,
>>>> +	.priv_auto_alloc_size = sizeof(struct stm32_sdmmc2_host),
>>>> +};
>>>>
>>>
>>
>>
> 

      reply	other threads:[~2017-07-20  7:08 UTC|newest]

Thread overview: 5+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
     [not found] <CGME20170719072734epcas1p3ddaba4482e55c5e6e4bb85b1b12423e4@epcas1p3.samsung.com>
2017-07-19  7:27 ` [U-Boot] [PATCH v2 1/1] mmc: Add MMC support for stm32h7 Socs patrice.chotard at st.com
2017-07-19 10:11   ` Jaehoon Chung
2017-07-19 12:20     ` Patrice CHOTARD
2017-07-20  4:22       ` Jaehoon Chung
2017-07-20  7:08         ` Patrice CHOTARD [this message]

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=b5524c12-3c79-a359-df60-936957ca93e3@st.com \
    --to=patrice.chotard@st.com \
    --cc=u-boot@lists.denx.de \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
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.