From patchwork Fri Jun 4 04:52:48 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Tianrui Wei X-Patchwork-Id: 1487568 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=X0j07zoI; 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 4Fx9Pm6bvBz9sSn for ; Fri, 4 Jun 2021 14:53:16 +1000 (AEST) Received: from h2850616.stratoserver.net (localhost [IPv6:::1]) by phobos.denx.de (Postfix) with ESMTP id 18C7582B8D; Fri, 4 Jun 2021 06:53:07 +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="X0j07zoI"; dkim-atps=neutral Received: by phobos.denx.de (Postfix, from userid 109) id 304E982FEE; Fri, 4 Jun 2021 06:53:05 +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-sg2apc01olkn0804.outbound.protection.outlook.com [IPv6:2a01:111:f400:febd::804]) (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 80B1580207 for ; Fri, 4 Jun 2021 06:53:01 +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=Wc5ma2O9YHUw14yutgghXAoeO/UExLwfguVrEa7cOncPOdCH/XbX5t2al+DuN8N/yoz3yl+HiefYEO2GtU2Ikzbyr5nLleerhIhBHF54bAEyYw+ynmvzsqk70+nse+kSKMbmkpfvHFlICPPExCJXanawMrU/p3NDWxs3zSNKL+LoPxFgBLDxPX4VKVB9L/+tuW3jHrH+RXsoKFcqynYX7iC6seZzd17M9D6YEu3wLl+oYdSU+1QwnoIkGwO7zbMX0YNgwJbDdmDYoLHN/mJ5xskl4zSdtl4qEF86ONF9waS+xA5vMKgwcIb7IUjNFUS8mR7Z4lOmEAuwuOh9S4ayJA== 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=OyQvz/pManDtV7FGr8lD/N6TexhnNXn2E8wejT5QzXQ=; b=Y2MA9rG5zfpvf/KXNc0/lJIjVBYsAwCsltUXba4bmifjpV+gOHt3o7Beo98pbntlgURDbuSDe50q7vIHiah1d8fk2Bk7Xmj6vPJubS2ea13044HUUmOZO7ocqcfigJHGLNGQrQWrqlEY+5AWPfgOW7TZNPwZtOAWrypt80VgRMkIYVHQjHEPeX6LyaMgLmEtWqAFILdlAMk8QOOyqmAtBSjYbOL0YZOwX67ATftKlyv2RQQhcjXdRrggT92KCPICuklUYFMYgln+tuK4715bnJicBVjPgSkmwshs9T8Bn/xyol7Me2OtktKJRn54gQ4AfYRSV1K6z1LrXUc+kCT0SQ== 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=OyQvz/pManDtV7FGr8lD/N6TexhnNXn2E8wejT5QzXQ=; b=X0j07zoIxsijlj5DF6Ub1Jig1OEKQrzL3U3Z278FRzV6N3u4p27Je+jGTwLA84gTZ1K9yN1i74Y06RngowMIp5L+dTad2GLWM8JFgCzmUDkct/uIF/H7ToL5ZrSi9RhxxfRfC7J1+0r6/xq0SnNC1YAozRy0lUWkW4Pg6h0ZDNmhKaDyL4yrut9myE9On4Z3RIxqW9oCXeD2pZ89LkVvzA1uUVrWzLFJS1kWWzHRmlZnmGJHqo1rNjh+NGDJZfPcR8gk/PxYB638/dOX4JkHxKGrVJm/QWUwgkz73yNbkaF6IzCzYf5l70b7JLgSKK+QI83lKWwLDZAWhFFRK0Gybw== Received: from SL2P216CA0043.KORP216.PROD.OUTLOOK.COM (2603:1096:100:1a::29) by HK0PR01MB3426.apcprd01.prod.exchangelabs.com (2603:1096:203:b9::13) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.4195.24; Fri, 4 Jun 2021 04:52:56 +0000 Received: from PU1APC01FT018.eop-APC01.prod.protection.outlook.com (2603:1096:100:1a:cafe::94) by SL2P216CA0043.outlook.office365.com (2603:1096:100:1a::29) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.4173.27 via Frontend Transport; Fri, 4 Jun 2021 04:52:56 +0000 Received: from SY4PR01MB6798.ausprd01.prod.outlook.com (10.152.252.56) by PU1APC01FT018.mail.protection.outlook.com (10.152.253.189) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.4195.18 via Frontend Transport; Fri, 4 Jun 2021 04:52:56 +0000 X-IncomingTopHeaderMarker: OriginalChecksum:0DDBF61D70E1676F3C0413A4877DCB092D4B7D5A7022743FB79E6BE305D9D35F; UpperCasedChecksum:583712FB727A4D6C9F8FF2A92D6BB7865F867E10C6B116976BEEE3640DD7D7C9; SizeAsReceived:8583; Count:45 Received: from SY4PR01MB6798.ausprd01.prod.outlook.com ([fe80::792d:eb0c:5714:a79d]) by SY4PR01MB6798.ausprd01.prod.outlook.com ([fe80::792d:eb0c:5714:a79d%6]) with mapi id 15.20.4195.024; Fri, 4 Jun 2021 04:52:56 +0000 Message-ID: Subject: [PATCH V5 1/2] mmc: add OpenPiton mmc support 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, bmeng.cn@gmail.com, seanga2@gmail.com, xypron.glpk@gmx.de Date: Fri, 04 Jun 2021 12:52:48 +0800 X-Mailer: Evolution 3.28.5-0ubuntu0.18.04.2 X-TMN: [Q5pvNUX+FEsUs3zY5KOeI8pVWTTAeUrI] X-ClientProxiedBy: HK0PR03CA0118.apcprd03.prod.outlook.com (2603:1096:203:b0::34) To SY4PR01MB6798.ausprd01.prod.outlook.com (2603:10c6:10:137::12) X-Microsoft-Original-Message-ID: MIME-Version: 1.0 X-MS-Exchange-MessageSentRepresentingType: 1 Received: from eva-virtual-machine (202.131.71.237) by HK0PR03CA0118.apcprd03.prod.outlook.com (2603:1096:203:b0::34) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.4195.21 via Frontend Transport; Fri, 4 Jun 2021 04:52:54 +0000 X-MS-PublicTrafficType: Email X-IncomingHeaderCount: 45 X-EOPAttributedMessage: 0 X-MS-Office365-Filtering-Correlation-Id: 981e2707-8e19-42bc-0589-08d927149e51 X-MS-TrafficTypeDiagnostic: HK0PR01MB3426: X-Microsoft-Antispam: BCL:0; X-Microsoft-Antispam-Message-Info: EKkJGbg+3xdi5jg6nTNEeTIaEQECuyiLDeCs9jcCNZpVTtJwMa+4az030klwrbQRaVFuA+MsqxULmlgEnzPKJpTX/Ds9SNsSF2O4hLgnuIIckgBQcp09k31JZR9YG8gXOYez+8Ana4CMkoeh9nyFbRchOcPhNNZhpM+qfcVulLcGLjPpgdaWnRSGpX9QxhTyLvXwgddHvXHrgafMSVxOvipHvDaIy94LVynM57joptDb/vp0ZQRZJAy6NjvBozhzTtJFk6QUttkFLpnCssvHpzihO3Q/rkFvvpShl/zHwu8YcKmyL40R1JVg92dad4GUcY5JyBRpRtj8+gK4+92nRmHtBRSCR2ElTqHj3vOHW9hh+6tnpi21JU8cqUqjRXW374a4xpDvWUzqMTt+jswVTA== X-MS-Exchange-AntiSpam-MessageData: fbY10hXovWwz4RXoEWEUu9mmASxhSji3boNevmDqid3j/MYCjSjnAAojFzVCh6pdTr9pnE55jtyG5GsKG5EIDSg8mPz/oA0ac+HvAOgV/8rVciv3liT07MqBTEVK7k0HZi0DGvvTZBIgfBB1h2FXug== X-OriginatorOrg: outlook.com X-MS-Exchange-CrossTenant-Network-Message-Id: 981e2707-8e19-42bc-0589-08d927149e51 X-MS-Exchange-CrossTenant-OriginalArrivalTime: 04 Jun 2021 04:52:56.0914 (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: HK0PR01MB3426 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.102.4 at phobos.denx.de X-Virus-Status: Clean From: Tianrui Wei Date: Fri, 4 June 2021 12:45:29 +0800 Subject: [PATCH v5 1/2] mmc: add OpenPiton mmc support This patch adds mmc support for OpenPiton board. Changelog: v5: move definitions around, changed some incompatible type information Signed-off-by: Tianrui Wei Signed-off-by: Jonathan Balkind --- drivers/mmc/Kconfig | 7 + drivers/mmc/Makefile | 1 + drivers/mmc/piton_mmc.c | 174 +++++ 3 files changed, 182 insertions(+) create mode 100644 drivers/mmc/piton_mmc.c diff --git a/drivers/mmc/Kconfig b/drivers/mmc/Kconfig index 14d79139..1038800f 100644 --- a/drivers/mmc/Kconfig +++ b/drivers/mmc/Kconfig @@ -707,6 +707,13 @@ 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 driver enables SD card support in U-Boot port for + OpenPiton SoC + 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 1c849cba..698dfe05 100644 --- a/drivers/mmc/Makefile +++ b/drivers/mmc/Makefile @@ -71,6 +71,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 00000000..2b2d5756 --- /dev/null +++ b/drivers/mmc/piton_mmc.c @@ -0,0 +1,174 @@ +// 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 + +struct piton_mmc_plat { + struct mmc_config cfg; + struct mmc mmc; +}; + +struct piton_mmc_priv { + u64 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; + + u64 byte_cnt, start_block, start_addr; + + struct piton_mmc_priv *priv = dev_get_priv(dev); + unsigned long *buff = (unsigned long *)data->dest; + + start_addr = priv->piton_mmc_base_addr + (start_block); + byte_cnt = data->blocks * data->blocksize; + start_block = cmd->cmdarg; + + /* if there is a read */ + if (data->flags & MMC_DATA_READ) { + for (u64 i = 0; i < byte_cnt; i += 4) { + *(buff) = readl((void *)(start_addr + i)); + buff++; + } + } else { + /* else there is a write + * we don't handle write, so error right away + */ + return -ENODEV; + } + + 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_platdata(dev); + struct mmc_config *cfg; + struct mmc *mmc; + /* fill in device description */ + struct blk_desc *bdesc; + + priv->piton_mmc_base_addr = dev_read_addr(dev); + cfg = &plat->cfg; + cfg->name = "PITON MMC"; + cfg->host_caps = MMC_MODE_8BIT; + cfg->f_max = 100000; + cfg->f_min = 400000; + cfg->voltages = MMC_VDD_21_22; + + mmc = &plat->mmc; + mmc->read_bl_len = MMC_MAX_BLOCK_LEN; + mmc->capacity_user = 0x100000000; + 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 = 0x2000000000ULL; + 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 piton has the micro mmc card 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_platdata(dev); + struct mmc_config *cfg = &plat->cfg; + + cfg->name = dev->name; + upriv->mmc = &plat->mmc; + upriv->mmc->has_init = 1; + upriv->mmc->capacity = 0x2000000000ULL; + 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_platdata(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 = 1000000; + cfg->f_max = 52000000; + cfg->b_max = U32_MAX; + + 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, + .ofdata_to_platdata = piton_mmc_ofdata_to_platdata, + .bind = piton_mmc_bind, + .probe = piton_mmc_probe, + .ops = &piton_mmc_ops, + .platdata_auto_alloc_size = sizeof(struct piton_mmc_plat), + .priv_auto_alloc_size = sizeof(struct piton_mmc_priv), +};