Received: by 2002:a25:31c3:0:0:0:0:0 with SMTP id x186csp366039ybx; Mon, 4 Nov 2019 21:53:09 -0800 (PST) X-Google-Smtp-Source: APXvYqyjwVsGV5ESe1a0te6PBk+a0bnl0YugKF1CrHjGCTqjCUAafK7sEaakJvihuROy3FaI4YGc X-Received: by 2002:a17:906:a986:: with SMTP id jr6mr27661241ejb.158.1572933189881; Mon, 04 Nov 2019 21:53:09 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1572933189; cv=none; d=google.com; s=arc-20160816; b=TedIaPrKAmqA7wxKdJ0jOJuAfZODj/r7ZdWrEl8rj5dpjFN4Y5EZPWZOD6wE+epx5W 80CJCDmvlK1OIeB76Zq4gYxkqmD7yyOGIROnIkRQqI8cwQAun7H10I8P7W2OEv+wo9iW 6atboBVUEZWLg72MFf53ZChp5QRlBaVhrfp4CFkeAmvh1Hv6gi238TeJdQznkWjaacgA GZRdIJ0ZhSFiRhlZ37++5oWKzlGi9aesP+R3GMwS/PUjrrkvaQXLmswxNyep2RujEjBG 6E8WC76OuVUDRv+5vfJy+E+rBwDqHgkzZTIX+BsaDOdYUmqr7/Gcg5wJySHtXQIR9jpF cp/A== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:content-transfer-encoding:mime-version :references:in-reply-to:message-id:date:subject:cc:to:from; bh=DxNkc+i/OzHhNrIQDWi9nUC2x1XU33NEXj5a0xs9zxA=; b=ckVGxsGxNyTnp2Gy345EpylcEbOKO7pyWS+isGUltNPuSwtENbm6xYS60Cs30sd+Ds cqd5sHweKVsF7K1EjLJ/88J2XBitlUQHVRA1yTXVRKJEvCvD47rkfxoe8dh/0dB1U0WF nPeCTYtWUoB8L5s0gOsXWdK73AAS9kxe+dfEbbo8+s17clfZiW/LmpBYftxKA0YSTU+v LOtflRfBtFD8auE0SLxzPlXspEMbINWVNEhqH8OXsO0zFbC6kRIh7ifS+UB8VXDaCuId 2z5Kttn9fo5tD/H0gREz2AJhwFwl0vE2Oq6X3qyW1arK6+KJKVbzQCDl/UFhlgxkgHAR ek7g== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id f13si9301322eda.288.2019.11.04.21.52.46; Mon, 04 Nov 2019 21:53:09 -0800 (PST) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S2387454AbfKEFvq (ORCPT + 99 others); Tue, 5 Nov 2019 00:51:46 -0500 Received: from smtp1.de.adit-jv.com ([93.241.18.167]:50763 "EHLO smtp1.de.adit-jv.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1727113AbfKEFvq (ORCPT ); Tue, 5 Nov 2019 00:51:46 -0500 Received: from localhost (smtp1.de.adit-jv.com [127.0.0.1]) by smtp1.de.adit-jv.com (Postfix) with ESMTP id EC4323C0594; Tue, 5 Nov 2019 06:51:42 +0100 (CET) Received: from smtp1.de.adit-jv.com ([127.0.0.1]) by localhost (smtp1.de.adit-jv.com [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id NIvBb3uK3IUk; Tue, 5 Nov 2019 06:51:37 +0100 (CET) Received: from HI2EXCH01.adit-jv.com (hi2exch01.adit-jv.com [10.72.92.24]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-SHA384 (256/256 bits)) (No client certificate requested) by smtp1.de.adit-jv.com (Postfix) with ESMTPS id 807E13C0585; Tue, 5 Nov 2019 06:51:37 +0100 (CET) Received: from vmlxhi-102.adit-jv.com (10.72.93.184) by HI2EXCH01.adit-jv.com (10.72.92.24) with Microsoft SMTP Server (TLS) id 14.3.468.0; Tue, 5 Nov 2019 06:51:36 +0100 From: Eugeniu Rosca To: Ulf Hansson , Adrian Hunter , Wolfram Sang , CC: Linus Walleij , Mathieu Malaterre , Pavel Machek , , , Eugeniu Rosca , Eugeniu Rosca Subject: [PATCH 3/3] mmc: core: Add 'fixed-emmc-driver-type-hs{200,400}' Date: Tue, 5 Nov 2019 06:50:15 +0100 Message-ID: <20191105055015.23656-3-erosca@de.adit-jv.com> X-Mailer: git-send-email 2.23.0 In-Reply-To: <20191105055015.23656-1-erosca@de.adit-jv.com> References: <20191105055015.23656-1-erosca@de.adit-jv.com> MIME-Version: 1.0 Content-Transfer-Encoding: 7BIT Content-Type: text/plain; charset=US-ASCII X-Originating-IP: [10.72.93.184] Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Add support for two more DT bindings, which stem from the need to implement below real-life requirement shared by eMMC vendor: ---snip--- Use "drive strength" value of 4 or 1 for HS400 or 0 for HS200. ---snip--- Inspire from [Y] and [Z] during implementation and testing (H3ULCB-KF). Below decision matrix is intended as function of user's input: [0] [2] [4] [0] hs200:[0] hs200:[2] hs200:[0] hs400:[0] hs400:[0] hs400:[4] [2] hs200:[2] hs200:[2] hs200:[2] hs400:[0] hs400:[R] hs400:[4] [4] hs200:[0] hs200:[2] hs200:[R] hs400:[4] hs400:[4] hs400:[4] [0] "fixed-emmc-driver-type" [2] "fixed-emmc-driver-type-hs200" [4] "fixed-emmc-driver-type-hs400" [R] RAW/ECSD drive strength as implemented in commit cc4f414c885cd0 ("mmc: mmc: Add driver strength selection") [Y] commit 6186d06c519e21 ("mmc: parse new binding for eMMC fixed driver type") [Z] https://www.elinux.org/Tests:eMMC-fixed-drive-strength Cc: Wolfram Sang Signed-off-by: Eugeniu Rosca --- drivers/mmc/core/host.c | 4 ++++ drivers/mmc/core/mmc.c | 19 ++++++++++++++++--- include/linux/mmc/host.h | 2 ++ 3 files changed, 22 insertions(+), 3 deletions(-) diff --git a/drivers/mmc/core/host.c b/drivers/mmc/core/host.c index 54abfdfc69ba..2a3d3b542e0d 100644 --- a/drivers/mmc/core/host.c +++ b/drivers/mmc/core/host.c @@ -336,6 +336,8 @@ int mmc_of_parse(struct mmc_host *host) /* Must be after "non-removable" check */ mmc_of_read_drv_type(host, "fixed-emmc-driver-type", &host->fixed_drv_type); + mmc_of_read_drv_type(host, "fixed-emmc-driver-type-hs200", &host->fixed_drv_type_hs200); + mmc_of_read_drv_type(host, "fixed-emmc-driver-type-hs400", &host->fixed_drv_type_hs400); host->dsr_req = !device_property_read_u32(dev, "dsr", &host->dsr); if (host->dsr_req && (host->dsr & ~0xffff)) { @@ -455,6 +457,8 @@ struct mmc_host *mmc_alloc_host(int extra, struct device *dev) host->max_blk_count = PAGE_SIZE / 512; host->fixed_drv_type = -EINVAL; + host->fixed_drv_type_hs200 = -EINVAL; + host->fixed_drv_type_hs400 = -EINVAL; host->ios.power_delay_ms = 10; return host; diff --git a/drivers/mmc/core/mmc.c b/drivers/mmc/core/mmc.c index c8804895595f..89e6fb9aedeb 100644 --- a/drivers/mmc/core/mmc.c +++ b/drivers/mmc/core/mmc.c @@ -62,6 +62,8 @@ static const unsigned int taac_mant[] = { __res & __mask; \ }) +static void mmc_select_driver_type(struct mmc_card *card, int timing); + /* * Given the decoded CSD structure, decode the raw CID to our CID structure. */ @@ -1192,6 +1194,8 @@ static int mmc_select_hs400(struct mmc_card *card) return err; } + mmc_select_driver_type(card, EXT_CSD_TIMING_HS400); + /* Switch card to HS400 */ val = EXT_CSD_TIMING_HS400 | card->drive_strength << EXT_CSD_DRV_STR_SHIFT; @@ -1270,6 +1274,8 @@ int mmc_hs400_to_hs200(struct mmc_card *card) if (err) goto out_err; + mmc_select_driver_type(card, EXT_CSD_TIMING_HS200); + /* Switch HS to HS200 */ val = EXT_CSD_TIMING_HS200 | card->drive_strength << EXT_CSD_DRV_STR_SHIFT; @@ -1304,10 +1310,17 @@ int mmc_hs400_to_hs200(struct mmc_card *card) return err; } -static void mmc_select_driver_type(struct mmc_card *card) +static void mmc_select_driver_type(struct mmc_card *card, int timing) { int card_drv_type, drive_strength, drv_type = 0; int fixed_drv_type = card->host->fixed_drv_type; + int fixed_drv_type_hs200 = card->host->fixed_drv_type_hs200; + int fixed_drv_type_hs400 = card->host->fixed_drv_type_hs400; + + if (fixed_drv_type_hs200 >= 0 && timing == EXT_CSD_TIMING_HS200) + fixed_drv_type = fixed_drv_type_hs200; + else if (fixed_drv_type_hs400 >= 0 && timing == EXT_CSD_TIMING_HS400) + fixed_drv_type = fixed_drv_type_hs400; card_drv_type = card->ext_csd.raw_driver_strength | mmc_driver_type_mask(0); @@ -1385,7 +1398,7 @@ static int mmc_select_hs400es(struct mmc_card *card) goto out_err; } - mmc_select_driver_type(card); + mmc_select_driver_type(card, EXT_CSD_TIMING_HS400); /* Switch card to HS400 */ val = EXT_CSD_TIMING_HS400 | @@ -1445,7 +1458,7 @@ static int mmc_select_hs200(struct mmc_card *card) if (err) return err; - mmc_select_driver_type(card); + mmc_select_driver_type(card, EXT_CSD_TIMING_HS200); /* * Set the bus width(4 or 8) with host's support and diff --git a/include/linux/mmc/host.h b/include/linux/mmc/host.h index ba703384bea0..6960ba98810a 100644 --- a/include/linux/mmc/host.h +++ b/include/linux/mmc/host.h @@ -371,6 +371,8 @@ struct mmc_host { #define MMC_CAP2_MERGE_CAPABLE (1 << 26) /* Host can merge a segment over the segment size */ int fixed_drv_type; /* fixed driver type for non-removable media */ + int fixed_drv_type_hs200; /* HS200-specific fixed_drv_type */ + int fixed_drv_type_hs400; /* HS400-specific fixed_drv_type */ mmc_pm_flag_t pm_caps; /* supported pm features */ -- 2.23.0