From patchwork Wed Jun 30 11:10:28 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Tianrui Wei X-Patchwork-Id: 1498869 X-Patchwork-Delegate: uboot@andestech.com Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=pass (sender SPF authorized) smtp.mailfrom=lists.denx.de (client-ip=2a01:238:438b:c500:173d:9f52:ddab:ee01; helo=phobos.denx.de; envelope-from=u-boot-bounces@lists.denx.de; receiver=) Authentication-Results: ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=outlook.com header.i=@outlook.com header.a=rsa-sha256 header.s=selector1 header.b=R9hH7LQp; dkim-atps=neutral Received: from phobos.denx.de (phobos.denx.de [IPv6:2a01:238:438b:c500:173d:9f52:ddab:ee01]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 4GFJYp07FLz9s5R for ; Wed, 30 Jun 2021 21:11:09 +1000 (AEST) Received: from h2850616.stratoserver.net (localhost [IPv6:::1]) by phobos.denx.de (Postfix) with ESMTP id E1C1D8326D; Wed, 30 Jun 2021 13:10:56 +0200 (CEST) Authentication-Results: phobos.denx.de; dmarc=pass (p=none dis=none) header.from=outlook.com Authentication-Results: phobos.denx.de; spf=pass smtp.mailfrom=u-boot-bounces@lists.denx.de Authentication-Results: phobos.denx.de; dkim=pass (2048-bit key; unprotected) header.d=outlook.com header.i=@outlook.com header.b="R9hH7LQp"; dkim-atps=neutral Received: by phobos.denx.de (Postfix, from userid 109) id D1E848326F; Wed, 30 Jun 2021 13:10:54 +0200 (CEST) X-Spam-Checker-Version: SpamAssassin 3.4.2 (2018-09-13) on phobos.denx.de X-Spam-Level: X-Spam-Status: No, score=-1.0 required=5.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,FORGED_SPF_HELO,FREEMAIL_FROM, MSGID_FROM_MTA_HEADER,SPF_HELO_PASS autolearn=no autolearn_force=no version=3.4.2 Received: from APC01-SG2-obe.outbound.protection.outlook.com (mail-sg2apc01olkn082f.outbound.protection.outlook.com [IPv6:2a01:111:f400:febd::82f]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by phobos.denx.de (Postfix) with ESMTPS id 42335831B9 for ; Wed, 30 Jun 2021 13:10:51 +0200 (CEST) Authentication-Results: phobos.denx.de; dmarc=pass (p=none dis=none) header.from=outlook.com Authentication-Results: phobos.denx.de; spf=pass smtp.mailfrom=tianrui-wei@outlook.com ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=k0IAec6DxA5prpNVAxmXUMLLLfrUbdO8xBF7ybBsshor3G/xzDLZ6YeTDu9kY/Q/sH11e5mQ/0HicLnLSV6RatarGnDV8nINuKyqxMRAqJ1/mWILEAWw/jyVk11OFxNS5g9Aoe9XotDJ3H2Wx+LagzBEUhG1IYXa8eQsLKwsZUhtJKCweaKTWRasXg4HeGoXP4z4P6TQuRv6SF8MfetESPMz1uzyqVINyttoNND3i4wDSQ7XtvVBlGcalDScjQDMmOlnuet25RhDNb65LXB+obeeHv3/SLjBFYPZm8eig4VlX1+8hWAXQQf3naM7JaDBpLYL2s0kSmcySH3Fjj4xmg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector9901; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=4g7ijehgDi3DRHDdG+SxKTYwsS0yG5OLpkeKZMI9kG0=; b=A/H75zi3KY7jaoTVfJemlwj45fn+g/41196+M+e7F5S2XN8XeVSKD1dCBfWM3IP7au+iyloqCNAfSOCosPjTO7bqecIrhYhuaR5ijIlhfxsb0ZV8meu11G8F2cneSeijjcpcQFoZ7QrCfNIb7fFPI/G1sXIy+z+nvk+xd5e7qBP7wmtLVOR5VDJU2dVh0qZW09GSfx8jInCczrJUcZxmsWC1rjFn0AYyasnfUwT1yoP0fj72GNDdVC+5VoII20dB7vQPMMTgiZYdelTpfpdgE+mS7tO5ZO68cPUvLH7mNNe/bApyVzGoyf+JQw7ooGCXjasoF/4B4934APqjJmZ80Q== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=none; dmarc=none; dkim=none; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=outlook.com; s=selector1; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=4g7ijehgDi3DRHDdG+SxKTYwsS0yG5OLpkeKZMI9kG0=; b=R9hH7LQpgbcGqsXe8lB/37q5RsLu/Tjxpd0lejrrAi+yRD5V90lGQNwoCp022i4IBnJ7M8h8LKDlGSi3qG+Yc4ogRfHJs3A4oYYuyIuMPn2HBWqyRKS8SO+H7pXLlhXQsWl0cdRXlKAlPAhsOa8KLERMsUftMWLytPMQPbQjEsNu2+qrFuAceh8/jYJWPxD1GLd9yH2c6UYxXUGfYe2ELuuz7fGrYZJHz34ygZ3rGeQTJmdSLkjKtd41qLPwqgQKBCbC5TKQl6Lu61VlismhCojo+njbg6YkXfpISJfgcGQvS9GygSO2kwdVhuaTM6b0zeVWd4yQ4W8uc23qPTa/Qg== Received: from PS1PR01CA0009.apcprd01.prod.exchangelabs.com (2603:1096:300:75::21) by SG2PR03MB3212.apcprd03.prod.outlook.com (2603:1096:4:d::12) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.4264.15; Wed, 30 Jun 2021 11:10:47 +0000 Received: from PU1APC01FT047.eop-APC01.prod.protection.outlook.com (2603:1096:300:75:cafe::56) by PS1PR01CA0009.outlook.office365.com (2603:1096:300:75::21) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.4287.22 via Frontend Transport; Wed, 30 Jun 2021 11:10:47 +0000 Received: from SY4PR01MB6798.ausprd01.prod.outlook.com (2a01:111:e400:7ebe::4d) by PU1APC01FT047.mail.protection.outlook.com (2a01:111:e400:7ebe::279) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.4287.22 via Frontend Transport; Wed, 30 Jun 2021 11:10:46 +0000 X-IncomingTopHeaderMarker: OriginalChecksum:2A65841EEC19F25621A53CBBBBF6C375098C63FE4368FB3630F5F2A26151BB6A; UpperCasedChecksum:102C16C6F4C4826AE20F8CC6788377E8B7B734D8858037781E2796DE732F3B3D; SizeAsReceived:7505; Count:47 Received: from SY4PR01MB6798.ausprd01.prod.outlook.com ([fe80::5476:5394:7bb7:6941]) by SY4PR01MB6798.ausprd01.prod.outlook.com ([fe80::5476:5394:7bb7:6941%2]) with mapi id 15.20.4264.026; Wed, 30 Jun 2021 11:10:46 +0000 From: Tianrui Wei To: u-boot@lists.denx.de Cc: ycliang@andestech.com, rick@andestech.com, peng.fan@nxp.com, jh80.chung@samsung.com, jbalkind@ucsb.edu, seanga2@gmail.com, bmeng.cn@gmail.com Subject: [PATCH v10 2/2] mmc: openpiton: add piton_mmc driver Date: Wed, 30 Jun 2021 19:10:28 +0800 Message-ID: X-Mailer: git-send-email 2.32.0 In-Reply-To: <20210630111028.5017-1-tianrui-wei@outlook.com> References: <20210630111028.5017-1-tianrui-wei@outlook.com> X-TMN: [vFzzPnCIrVMNCTI0un4CGbJ/uUXGyMhf] X-ClientProxiedBy: HK2P15301CA0012.APCP153.PROD.OUTLOOK.COM (2603:1096:202:1::22) To SY4PR01MB6798.ausprd01.prod.outlook.com (2603:10c6:10:137::12) X-Microsoft-Original-Message-ID: <20210630111028.5017-3-tianrui-wei@outlook.com> MIME-Version: 1.0 X-MS-Exchange-MessageSentRepresentingType: 1 Received: from localhost.localdomain (111.18.44.10) by HK2P15301CA0012.APCP153.PROD.OUTLOOK.COM (2603:1096:202:1::22) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.4308.1 via Frontend Transport; Wed, 30 Jun 2021 11:10:44 +0000 X-MS-PublicTrafficType: Email X-IncomingHeaderCount: 47 X-EOPAttributedMessage: 0 X-MS-Office365-Filtering-Correlation-Id: 9bc56c5e-02be-48f3-b119-08d93bb7b5bc X-MS-TrafficTypeDiagnostic: SG2PR03MB3212: X-Microsoft-Antispam: BCL:0; X-Microsoft-Antispam-Message-Info: nJqb4hO2P/oWIyHizGLgxVzsKWxGJ0VbGx38FSkMrls/Z+OqOKE2Wrky+XogX5nrIBwbWYqRQPN0HI27pG+chZGyhHFxkwYBRp3eP0vGTgkQrKDiIDQs3vDfxef0C9DjPRBpqac2fFW/zaQ8D7gNlfwJiPqPEMAMC7JKLJgLLkGQ3LQsGqzHGTOss69PfyhjUROQPw8tBpufqUeJ6O36kL8FFIQWE5Witc+e3i2Dfg+Nm0eP7Pa0hwsekPWqgmsFWN6LBb0ssK+Lnmv24eR3N4jNm9ixR6f18d9D4hhy0cqep9rZFuWneEZEdhLp6PhVST1SdrS/YTQqrksAkv5HYBmtJfCYIXAZ05moO9TLgAqGYWAoRpYrlP3QCuBBvkYluO3IAAXIaFRnJI/r3sjhshBrQ1DFkyM8g52Wb8vACzSKcPsp7pdUucJ26Sh8yIyu X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: oEYSGHCua4MOA9eoGsagFezYvHDhwHiYPAEgv+hW/D+EkM7gsta0A7/15ni5j6AShSOYNpLzjtZpqPV9CcdlTRcZym7GnSXyM/qtTwWwSSQszMP+fzFcPvXopcQoUFYAl13eP2/VbQC+2NP1BDHRAQ== X-OriginatorOrg: outlook.com X-MS-Exchange-CrossTenant-Network-Message-Id: 9bc56c5e-02be-48f3-b119-08d93bb7b5bc X-MS-Exchange-CrossTenant-OriginalArrivalTime: 30 Jun 2021 11:10:46.7804 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 84df9e7f-e9f6-40af-b435-aaaaaaaaaaaa X-MS-Exchange-CrossTenant-AuthSource: PU1APC01FT047.eop-APC01.prod.protection.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Anonymous X-MS-Exchange-CrossTenant-FromEntityHeader: Internet X-MS-Exchange-CrossTenant-RMS-PersistedConsumerOrg: 00000000-0000-0000-0000-000000000000 X-MS-Exchange-Transport-CrossTenantHeadersStamped: SG2PR03MB3212 X-BeenThere: u-boot@lists.denx.de X-Mailman-Version: 2.1.34 Precedence: list List-Id: U-Boot discussion List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: u-boot-bounces@lists.denx.de Sender: "U-Boot" X-Virus-Scanned: clamav-milter 0.103.2 at phobos.denx.de X-Virus-Status: Clean This commit adds support to piton_mmc driver for OpenPiton-riscv64 This driver has many things set as preconfigured because the hardware automatically configures most of the settings during startup. Signed-off-by: Tianrui Wei Signed-off-by: Jonathan Balkind Reviewed-by: Jaehoon Chung --- drivers/mmc/Kconfig | 9 +++ drivers/mmc/Makefile | 1 + drivers/mmc/piton_mmc.c | 161 ++++++++++++++++++++++++++++++++++++++++ 3 files changed, 171 insertions(+) create mode 100644 drivers/mmc/piton_mmc.c diff --git a/drivers/mmc/Kconfig b/drivers/mmc/Kconfig index 0909f502a1..d0176175e8 100644 --- a/drivers/mmc/Kconfig +++ b/drivers/mmc/Kconfig @@ -727,6 +727,15 @@ config MMC_SUNXI_HAS_MODE_SWITCH bool depends on MMC_SUNXI +config MMC_PITON + bool "MMC support for OpenPiton SoC" + depends on DM_MMC && BLK + help + This selects support for the SD host controller on OpenPiton SoC. + Note that this SD controller directly exposes the contents of the + SD card as memory mapped, so there is no manual configuration + required + config GENERIC_ATMEL_MCI bool "Atmel Multimedia Card Interface support" depends on DM_MMC && BLK && ARCH_AT91 diff --git a/drivers/mmc/Makefile b/drivers/mmc/Makefile index 89d6af3db3..d96ac90719 100644 --- a/drivers/mmc/Makefile +++ b/drivers/mmc/Makefile @@ -72,6 +72,7 @@ obj-$(CONFIG_MMC_SDHCI_XENON) += xenon_sdhci.o obj-$(CONFIG_MMC_SDHCI_ZYNQ) += zynq_sdhci.o obj-$(CONFIG_MMC_SUNXI) += sunxi_mmc.o +obj-$(CONFIG_MMC_PITON) += piton_mmc.o obj-$(CONFIG_MMC_UNIPHIER) += tmio-common.o uniphier-sd.o obj-$(CONFIG_RENESAS_SDHI) += tmio-common.o renesas-sdhi.o obj-$(CONFIG_MMC_BCM2835) += bcm2835_sdhost.o diff --git a/drivers/mmc/piton_mmc.c b/drivers/mmc/piton_mmc.c new file mode 100644 index 0000000000..9f5da6d633 --- /dev/null +++ b/drivers/mmc/piton_mmc.c @@ -0,0 +1,161 @@ +// SPDX-License-Identifier: GPL-2.0+ +/* + * (C) Copyright 2009 SAMSUNG Electronics + * Minkyu Kang + * Jaehoon Chung + * Portions Copyright 2011-2019 NVIDIA Corporation + * Portions Copyright 2021 Tianrui Wei + * This file is adapted from tegra_mmc.c + * Tianrui Wei + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + + +#define PITON_MMC_DUMMY_F_MAX 20000000 +#define PITON_MMC_DUMMY_F_MIN 10000000 +#define PITON_MMC_DUMMY_CAPACITY SZ_4G << 3 +#define PITON_MMC_DUMMY_B_MAX SZ_4G + +struct piton_mmc_plat { + struct mmc_config cfg; + struct mmc mmc; +}; + +struct piton_mmc_priv { + void __iomem *base_addr; +}; + +static int piton_mmc_send_cmd(struct udevice *dev, struct mmc_cmd *cmd, + struct mmc_data *data) +{ + if (!data) + return 0; + + struct piton_mmc_priv *priv = dev_get_priv(dev); + u32 *buff, *start_addr, *write_src; + size_t byte_cnt, start_block; + + buff = (u32 *)data->dest; + write_src = (u32 *)data->src; + start_block = cmd->cmdarg; + start_addr = priv->base_addr + start_block; + + /* if there is a read */ + for (byte_cnt = data->blocks * data->blocksize; byte_cnt; + byte_cnt -= sizeof(u32)) { + if (data->flags & MMC_DATA_READ) { + *buff++ = readl(start_addr++); + } + else if (data->flags & MMC_DATA_WRITE) { + writel(*write_src++,start_addr++); + } + } + return 0; +} + +static int piton_mmc_ofdata_to_platdata(struct udevice *dev) +{ + struct piton_mmc_priv *priv = dev_get_priv(dev); + struct piton_mmc_plat *plat = dev_get_plat(dev); + struct mmc_config *cfg; + struct mmc *mmc; + struct blk_desc *bdesc; + + priv->base_addr = (void *)dev_read_addr(dev); + cfg = &plat->cfg; + cfg->name = "PITON MMC"; + cfg->host_caps = MMC_MODE_8BIT; + cfg->f_max = PITON_MMC_DUMMY_F_MAX; + cfg->f_min = PITON_MMC_DUMMY_F_MIN; + cfg->voltages = MMC_VDD_21_22; + + mmc = &plat->mmc; + mmc->read_bl_len = MMC_MAX_BLOCK_LEN; + mmc->capacity_user = PITON_MMC_DUMMY_CAPACITY; + mmc->capacity_user *= mmc->read_bl_len; + mmc->capacity_boot = 0; + mmc->capacity_rpmb = 0; + for (int i = 0; i < 4; i++) + mmc->capacity_gp[i] = 0; + mmc->capacity = PITON_MMC_DUMMY_CAPACITY; + mmc->has_init = 1; + + bdesc = mmc_get_blk_desc(mmc); + bdesc->lun = 0; + bdesc->hwpart = 0; + bdesc->type = 0; + bdesc->blksz = mmc->read_bl_len; + bdesc->log2blksz = LOG2(bdesc->blksz); + bdesc->lba = lldiv(mmc->capacity, mmc->read_bl_len); + + return 0; +} + +static int piton_mmc_getcd(struct udevice *dev) +{ + return 1; +} + +static const struct dm_mmc_ops piton_mmc_ops = { + .send_cmd = piton_mmc_send_cmd, + .get_cd = piton_mmc_getcd, +}; + +static int piton_mmc_probe(struct udevice *dev) +{ + struct mmc_uclass_priv *upriv = dev_get_uclass_priv(dev); + struct piton_mmc_plat *plat = dev_get_plat(dev); + struct mmc_config *cfg = &plat->cfg; + + cfg->name = dev->name; + upriv->mmc = &plat->mmc; + upriv->mmc->has_init = 1; + upriv->mmc->capacity = PITON_MMC_DUMMY_CAPACITY; + upriv->mmc->read_bl_len = MMC_MAX_BLOCK_LEN; + return 0; +} + +static int piton_mmc_bind(struct udevice *dev) +{ + struct piton_mmc_plat *plat = dev_get_plat(dev); + struct mmc_config *cfg = &plat->cfg; + + cfg->name = dev->name; + cfg->host_caps = MMC_MODE_HS_52MHz | MMC_MODE_HS | MMC_MODE_8BIT; + cfg->voltages = MMC_VDD_165_195 | MMC_VDD_32_33 | MMC_VDD_33_34; + cfg->f_min = PITON_MMC_DUMMY_F_MIN; + cfg->f_max = PITON_MMC_DUMMY_F_MAX; + cfg->b_max = MMC_MAX_BLOCK_LEN; + + return mmc_bind(dev, &plat->mmc, cfg); +} + +static const struct udevice_id piton_mmc_ids[] = { + {.compatible = "openpiton,piton-mmc"}, + {/* sentinel */} +}; + +U_BOOT_DRIVER(piton_mmc_drv) = { + .name = "piton_mmc", + .id = UCLASS_MMC, + .of_match = piton_mmc_ids, + .of_to_plat = piton_mmc_ofdata_to_platdata, + .bind = piton_mmc_bind, + .probe = piton_mmc_probe, + .ops = &piton_mmc_ops, + .plat_auto = sizeof(struct piton_mmc_plat), + .priv_auto = sizeof(struct piton_mmc_priv), +};