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.chot...@st.com wrote: >>>> From: Patrice Chotard <patrice.chot...@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.kere...@st.com> >>>> Signed-off-by: Patrice Chotard <patrice.chot...@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), >>>> +}; >>>> >>> >> >> > _______________________________________________ U-Boot mailing list U-Boot@lists.denx.de https://lists.denx.de/listinfo/u-boot