From patchwork Mon Jun 14 17:21:17 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Tianrui Wei X-Patchwork-Id: 1491802 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=KZRgNEs8; 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 4G3dYL5wS4z9s24 for ; Tue, 15 Jun 2021 03:22:14 +1000 (AEST) Received: from h2850616.stratoserver.net (localhost [IPv6:::1]) by phobos.denx.de (Postfix) with ESMTP id B19A782887; Mon, 14 Jun 2021 19:21:57 +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="KZRgNEs8"; dkim-atps=neutral Received: by phobos.denx.de (Postfix, from userid 109) id 5281180F03; Mon, 14 Jun 2021 19:21:49 +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=0.2 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-HK2-obe.outbound.protection.outlook.com (mail-hk2apc01olkn0812.outbound.protection.outlook.com [IPv6:2a01:111:f400:febc::812]) (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 10E5980F03 for ; Mon, 14 Jun 2021 19:21:42 +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=iqgrnbgRbn/9kHQWSiGJ1PUiPiIdf1iV3qTl5EkEFlsdDDxJEpA82XspEv18+qrOu0EswBTyYDei/ekfYelV/QAC9mPxKubtamsvJqaG03kquDhz5pVWKpiXMyXOyy38iPpZj+g7d7siI/y7TMkHsf0MIUkGhA2rDMUybgYOWCZvrF5neGca1ObNsAoRB0g/+P9yW+QvBnKizrV4FtV5xEsGai2WA7MtJDg/YVPM0uhk65DPenY2vYeJwn27u88vpWkFriT1bzsmvC60jCqNzJjqHCBVdXsNjDrwdidOQT9IjdoQ2LGsVJwLbHtuHIBM6z//U/9UcrnBSmPvRqHSmg== 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=rXCEyxGe0FxlkK/A16g+YBhInsX3D3Qnk4Usg4VAZIs=; b=F0Eme3qBqthBZYOn2NeNsRBqZUja7CMUeqG9I7G9m0xk3jd0tcSwJBhiPr4vR6PgcD+Lfr5gmsyvgpUw0MjzC7thCKcV2W0Kwms8cIqXB6dZJyAXPgpWduWuKr6vPsN8ntz6pv2nDL76ZaWpLI0kEOIgBbPt+GjBuZrh0jVRhKaNyeWGA1V094Nik70tnqaYn0WhGR9fHo/OTAn46Kb62uSIaFUKXz2X1cifBPly4IiTXd8cOQeYGz1NSffQAkexkzrbf1qUFGdx4ksc2TOzHMPr9F6EJ7pHyLzkXO/g/Fr8+CsyDA+Yfy7ufh1ZTE/Npvk2qDpCO+9e43P3OdPQ+A== 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=rXCEyxGe0FxlkK/A16g+YBhInsX3D3Qnk4Usg4VAZIs=; b=KZRgNEs8H4682UeEE/pvSZcOqXzYu82ogvo5j4gT+T8TWh0TOOEgYEf5GKp2nA2Hy4NunSa91ZAfDduJrddL1IIEfMLNjyli7nTgk3o6DD57mSyFRDuBSR00gs17J9ZeZ2uZJ3y5A+A8ugthZrUvCEdpdHOlYpOigBzwn6p0ixAscNuBcRpXn9bWgemfWDuWjeTtdvGFrXg+yW9AQSE3uHoSgFfZe+IZcNwSszEEnk/VeogtP0roehKAkoUJG+1DhKZsD+Z8VMUIRNUSI2Ag4mAhxPcGfXU2G8oRyvtGU+RXHJXdpBFa1MOLCZgj+8QLvQOrOLKePh2kEq+CpFtccg== Received: from PS2PR01CA0002.apcprd01.prod.exchangelabs.com (2603:1096:300:2d::14) by HK0PR03MB4004.apcprd03.prod.outlook.com (2603:1096:203:a4::14) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.4242.14; Mon, 14 Jun 2021 17:21:34 +0000 Received: from PU1APC01FT018.eop-APC01.prod.protection.outlook.com (2603:1096:300:2d:cafe::af) by PS2PR01CA0002.outlook.office365.com (2603:1096:300:2d::14) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.4219.21 via Frontend Transport; Mon, 14 Jun 2021 17:21:34 +0000 Received: from SY4PR01MB6798.ausprd01.prod.outlook.com (2a01:111:e400:7ebe::45) by PU1APC01FT018.mail.protection.outlook.com (2a01:111:e400:7ebe::445) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.4219.21 via Frontend Transport; Mon, 14 Jun 2021 17:21:34 +0000 X-IncomingTopHeaderMarker: OriginalChecksum:3B9EBDD5D7C80B643F94A3791DAD8D318033076FACF20214F4A0E4144AC63D56; UpperCasedChecksum:43F1BD6EED816C57D9B6613DA8D3BF4CA01FDF1B314636585B8FB6DF78F55D09; SizeAsReceived:7538; 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.4219.025; Mon, 14 Jun 2021 17:21:34 +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 v7 2/2] mmc: openpiton: add piton_mmc driver Date: Tue, 15 Jun 2021 01:21:17 +0800 Message-ID: X-Mailer: git-send-email 2.32.0 In-Reply-To: <20210614172117.115632-1-tianrui-wei@outlook.com> References: <20210614172117.115632-1-tianrui-wei@outlook.com> X-TMN: [JO0Nas+/GXS+W0eWvrJd0yPlDx8HhwjI] X-ClientProxiedBy: HK0PR03CA0112.apcprd03.prod.outlook.com (2603:1096:203:b0::28) To SY4PR01MB6798.ausprd01.prod.outlook.com (2603:10c6:10:137::12) X-Microsoft-Original-Message-ID: <20210614172117.115632-3-tianrui-wei@outlook.com> MIME-Version: 1.0 X-MS-Exchange-MessageSentRepresentingType: 1 Received: from eva-virtual-machine.localdomain (180.160.51.170) by HK0PR03CA0112.apcprd03.prod.outlook.com (2603:1096:203:b0::28) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.4219.21 via Frontend Transport; Mon, 14 Jun 2021 17:21:30 +0000 X-MS-PublicTrafficType: Email X-IncomingHeaderCount: 47 X-EOPAttributedMessage: 0 X-MS-Office365-Filtering-Correlation-Id: 3bff99a9-4a02-4101-f0b0-08d92f58daa2 X-MS-TrafficTypeDiagnostic: HK0PR03MB4004: X-Microsoft-Antispam: BCL:0; X-Microsoft-Antispam-Message-Info: ZfCN+5DOB8vKVoKycgq5k1dS0xvjmmvTLen+GeZG1RiVWmIPJkPX2DuiSlmABtACJfJfwv118NKQh7Zmu28RtIB5qinhdJILw+PVAvj0WuO0C2IIa80nQytYtSRdVb0zDESxT8zWLEKZZchgFKi4Dsv4ltrdU9CK/moUp+5eLQ7G7Fy9xCvt1xLQWElUv3WFKjUN5c7QbiNmOABvrZ7wHA57jSzzSeejUciPnrAhzC403LdkVA7/7ZsZ6rJc4mcYrB+Gsc7ueOARt0jIKdkTEArWVuSxHu4dLoQnKm21RomBasC+6LZKrt+funTnXPNNMmRMu+WSKRqL5+eOgd/0rZOVnh4lip1eW4huu/yBw+CJM5LM0iVCJhhmBZSFn1Dr3z+jB8qj3IBIcz1/RUc4PA== X-MS-Exchange-AntiSpam-MessageData: esfCwulnlnj/GviNyUagGyuDQZAeex9+yyEhFJrmVS5KDHeY0eeCPhAC1M6ulD4+BwVbOGyUpcU+mchhnGEutHkq+Vp9THGswxhraeMHRl9JHULUwg09PYEkh5ImL+vC+ED51Sibiei1MPQdd6L6gQ== X-OriginatorOrg: outlook.com X-MS-Exchange-CrossTenant-Network-Message-Id: 3bff99a9-4a02-4101-f0b0-08d92f58daa2 X-MS-Exchange-CrossTenant-OriginalArrivalTime: 14 Jun 2021 17:21:32.4282 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 84df9e7f-e9f6-40af-b435-aaaaaaaaaaaa X-MS-Exchange-CrossTenant-AuthSource: PU1APC01FT018.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: HK0PR03MB4004 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 In particular, this driver - V6 . change type of address . move declarations ahead . loop style update - V7 . dm updates . fix indentations Signed-off-by: Tianrui Wei Signed-off-by: Jonathan Balkind --- drivers/mmc/Kconfig | 9 ++ drivers/mmc/Makefile | 1 + drivers/mmc/piton_mmc.c | 181 ++++++++++++++++++++++++++++++++++++++++ 3 files changed, 191 insertions(+) create mode 100644 drivers/mmc/piton_mmc.c diff --git a/drivers/mmc/Kconfig b/drivers/mmc/Kconfig index 8901456967..4948e194e7 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..8517ec8410 --- /dev/null +++ b/drivers/mmc/piton_mmc.c @@ -0,0 +1,181 @@ +// 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 *piton_mmc_base_addr; /* peripheral id */ +}; + +/* + * see mmc_read_blocks to see how it is used. + * start block is hidden at cmd->arg + * also, initialize the block size at init + */ +static int piton_mmc_send_cmd(struct udevice *dev, struct mmc_cmd *cmd, + struct mmc_data *data) +{ + /* check first if this is a pure command */ + 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->piton_mmc_base_addr + start_block; + + /* if there is a read */ + if (data->flags & MMC_DATA_READ) { + for (byte_cnt = data->blocks * data->blocksize; byte_cnt; + byte_cnt -= sizeof(u32)) { + *buff++ = readl(start_addr++); + } + } else { + for (byte_cnt = data->blocks * data->blocksize; byte_cnt; + byte_cnt -= sizeof(u32)) { + 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; + /* fill in device description */ + struct blk_desc *bdesc; + + priv->piton_mmc_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; +} + +/* test if the micro sd card is present + * always return 1, which means present + */ +static int piton_mmc_getcd(struct udevice *dev) +{ + /* + * always return 1 + */ + return 1; +} + +/* dummy function, piton_mmc don't need initialization + * in hw + */ +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), +};