Received: by 2002:ac0:aed5:0:0:0:0:0 with SMTP id t21csp669475imb; Fri, 1 Mar 2019 10:42:22 -0800 (PST) X-Google-Smtp-Source: APXvYqyOiqJoX24ASDixcmkRUvm/Jwb7ynLYSs9Uvw/cFqXczhUnLxLw70f/JkAMlOHLSYDdMwIZ X-Received: by 2002:a17:902:1122:: with SMTP id d31mr6900807pla.246.1551465741970; Fri, 01 Mar 2019 10:42:21 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1551465741; cv=none; d=google.com; s=arc-20160816; b=AyCJ09Ea4pFyhDxbRyiWS8PFez+7Lyj6aRObtUiVhU5QNsqH6sZzXZKJlH07hwS9DU iDH8xJP9WbDZHymGKTI8eUaTH0CLrd+qAw4BV0qvFIx1u0+d66+QEWLKy8pO9I+576S3 +FGcTcSysS8hks4M9whRR/9HBJfYh8pWP6CAZlX/u9A8mTzJ5J+xLEgrb3zyCXhDyWPp MYyFvua2XmoI+hhkga49KlApDNx86Y3jAslfwJSkHQfHwcsCeaAIrRfTwdeI10e8uSYh dmR91ya+rPdWSB9Wg1SwwdxrX9sZZtWpIhnOVGkCiiOCaQ4Box24rr/JJOzlG7Fnvj4v WhEQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:to:references:message-id :content-transfer-encoding:cc:date:in-reply-to:from:subject :mime-version; bh=NeAO0AEbCWl9/y8OKvRQ05te2SEYrOV+hn6i4vb9Dxg=; b=0F5jve9EUTILL+bvd94KFsAIy8lp88IpVxzRkM5Jz86jSuSVHXSwjsGFNE79HUN8dV DSFSlvsQOlQNQkzw0BR3lHOz9TPOAkGDfqtLo5ip39WzOL2A9EGclexgudEcGzXBkl57 auCgHEQSpmq5wyt/QDkqr02xJo7mqId0iDk0w5POoLmA3FbCnvYxqVIEttjxCD49bVs/ +IBI5wnk8jDWL0Fp2xFOieYBCgVf6Dvi++kzyPgStXBTouqpzCG2o9r9skO2U6/BNiLN SsY0JD1FchKDO/X/YVliDNS9LhIIARVFjMx4nAYsOIJbHpjkbl0aTSfH/elybjUq1BZz oBMA== 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 x130si6696833pgx.221.2019.03.01.10.42.06; Fri, 01 Mar 2019 10:42:21 -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 S1728448AbfCASl1 convert rfc822-to-8bit (ORCPT + 99 others); Fri, 1 Mar 2019 13:41:27 -0500 Received: from vegas.theobroma-systems.com ([144.76.126.164]:43452 "EHLO mail.theobroma-systems.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726195AbfCASl1 (ORCPT ); Fri, 1 Mar 2019 13:41:27 -0500 Received: from 178-18-171-174.customer.bnet.at ([178.18.171.174]:59893 helo=[192.168.2.179]) by mail.theobroma-systems.com with esmtpsa (TLS1.2:DHE_RSA_AES_256_CBC_SHA256:256) (Exim 4.80) (envelope-from ) id 1gzn5n-0007Qu-D0; Fri, 01 Mar 2019 19:41:07 +0100 Content-Type: text/plain; charset=utf-8 Mime-Version: 1.0 (Mac OS X Mail 11.5 \(3445.9.1\)) Subject: Re: [PATCH 1/3] phy: rockchip-emmc: Allow to set drive impedance via DTS. From: Philipp Tomsich In-Reply-To: Date: Fri, 1 Mar 2019 19:41:03 +0100 Cc: Doug Anderson , Rob Herring , Mark Rutland , =?utf-8?Q?Heiko_St=C3=BCbner?= , Shawn Lin , Kishon Vijay Abraham I , Enric Balletbo i Serra , Klaus Goger , Viresh Kumar , Matthias Brugger , Emil Renner Berthing , Tony Xie , Randy Li , Vicente Bergas , Ezequiel Garcia , devicetree@vger.kernel.org, Linux ARM , "open list:ARM/Rockchip SoC..." , LKML Content-Transfer-Encoding: 8BIT Message-Id: <72859695-2E77-4EFF-9555-54907830849F@theobroma-systems.com> References: <20190301153348.29870-1-christoph.muellner@theobroma-systems.com> To: =?utf-8?Q?Christoph_M=C3=BCllner?= X-Mailer: Apple Mail (2.3445.9.1) Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org > On 01.03.2019, at 19:09, Christoph Müllner wrote: > > Hi Doug, > >> On 01.03.2019, at 17:48, Doug Anderson wrote: >> >> Hi, >> >> On Fri, Mar 1, 2019 at 7:37 AM Christoph Muellner >> wrote: >>> >>> The rockchip-emmc PHY can be configured with different >>> drive impedance values. Currenlty a value of 50 Ohm is >>> hard coded into the driver. >>> >>> This patch introduces the DTS property 'drive-impedance-ohm' >>> for the rockchip-emmc phy node, which uses the value from the DTS >>> to setup the drive impedance accordingly. >>> >>> Signed-off-by: Christoph Muellner >>> Signed-off-by: Philipp Tomsich >>> --- >>> drivers/phy/rockchip/phy-rockchip-emmc.c | 38 ++++++++++++++++++++++++++++++-- >>> 1 file changed, 36 insertions(+), 2 deletions(-) >>> >>> diff --git a/drivers/phy/rockchip/phy-rockchip-emmc.c b/drivers/phy/rockchip/phy-rockchip-emmc.c >>> index 19bf84f0bc67..5413fa73dd45 100644 >>> --- a/drivers/phy/rockchip/phy-rockchip-emmc.c >>> +++ b/drivers/phy/rockchip/phy-rockchip-emmc.c >>> @@ -87,6 +87,7 @@ struct rockchip_emmc_phy { >>> unsigned int reg_offset; >>> struct regmap *reg_base; >>> struct clk *emmcclk; >>> + unsigned int drive_impedance; >>> }; >>> >>> static int rockchip_emmc_phy_power(struct phy *phy, bool on_off) >>> @@ -281,10 +282,10 @@ static int rockchip_emmc_phy_power_on(struct phy *phy) >>> { >>> struct rockchip_emmc_phy *rk_phy = phy_get_drvdata(phy); >>> >>> - /* Drive impedance: 50 Ohm */ >>> + /* Drive impedance: from DTS */ >>> regmap_write(rk_phy->reg_base, >>> rk_phy->reg_offset + GRF_EMMCPHY_CON6, >>> - HIWORD_UPDATE(PHYCTRL_DR_50OHM, >>> + HIWORD_UPDATE(rk_phy->drive_impedance, >>> PHYCTRL_DR_MASK, >>> PHYCTRL_DR_SHIFT)); >>> >>> @@ -314,6 +315,28 @@ static const struct phy_ops ops = { >>> .owner = THIS_MODULE, >>> }; >>> >>> +static u32 convert_drive_impedance_ohm(struct platform_device *pdev, u32 dr_ohm) >>> +{ >>> + switch (dr_ohm) { >>> + case 100: >>> + return PHYCTRL_DR_100OHM; >>> + case 66: >>> + return PHYCTRL_DR_66OHM; >>> + case 50: >>> + return PHYCTRL_DR_50OHM; >>> + case 40: >>> + return PHYCTRL_DR_40OHM; >>> + case 33: >>> + return PHYCTRL_DR_33OHM; >>> + } >>> + >>> + dev_warn(&pdev->dev, >>> + "Invalid value %u for drive-impedance-ohm. " >>> + "Falling back to 50 Ohm.\n", >>> + dr_ohm); >>> + return PHYCTRL_DR_50OHM; >>> +} >>> + >>> static int rockchip_emmc_phy_probe(struct platform_device *pdev) >>> { >>> struct device *dev = &pdev->dev; >>> @@ -322,6 +345,7 @@ static int rockchip_emmc_phy_probe(struct platform_device *pdev) >>> struct phy_provider *phy_provider; >>> struct regmap *grf; >>> unsigned int reg_offset; >>> + u32 val; >>> >>> if (!dev->parent || !dev->parent->of_node) >>> return -ENODEV; >>> @@ -345,6 +369,16 @@ static int rockchip_emmc_phy_probe(struct platform_device *pdev) >>> rk_phy->reg_offset = reg_offset; >>> rk_phy->reg_base = grf; >>> >>> + if (of_property_read_u32(dev->of_node, "drive-impedance-ohm", &val)) { >>> + dev_info(dev, >>> + "Missing drive-impedance-ohm property in node %s " >>> + "Falling back to 50 Ohm.\n", >>> + dev->of_node->name); >> >> This is awfully noisy for something that pretty much all existing >> boards will run. debug level instead of info level? Also: > > Removed for v2 as suggested by Robin. > >> >> * Don't split strings >> across lines >> >> * There's a magic % thing to get the name of an OF node. Use that. >> >> >>> + rk_phy->drive_impedance = PHYCTRL_DR_50OHM; >>> + } else { >>> + rk_phy->drive_impedance = convert_drive_impedance_ohm(pdev, val); >>> + } >> >> It's been a long time since I looked at this, but I could have sworn >> that it was more complicated than that. Specifically I though you >> were supposed to query the eMMC card for what it supported and then >> resolve that with what the host could support. >> >> Assuming that this is supposed to be queried from the card (which is >> how I remember it) then you definitely don't want it in the device >> tree since you want to be able to stuff various different eMMC parts >> and we should be able to figure out the impedance at runtime. >> >> >> NOTE: IIRC the old value of 50 ohms is required to be supported by all >> hosts and cards and is specified to be the default. >> > > When using 50 ohms on our board in HS-400 mode (200 MHz), then > we see communication errors. These are cause by additional components > on the clock line, which damp the 200 Mhz signal too much. > > We could do the following: > > * sdhci.c provides a default implementation to set the drive impedance (in HOST_CONTROL2, > like it is done already now as part of sdhci_set_ios()) > * sdhci-of-arasan.c installs an alternative implementation in case of Rockchip's eMMC controller > * the alternative implementation uses a callback to the Rockchip's eMMC phy driver Generally, I would not make this either-or (I may have been less than clear in my comments to the internal ticket), but rather teach the sdhci-driver to always notify the eMMC PHY driver (if there is one) of the change. For the RK3399’s sdhci implementation, the bits in the HOST_CONTROL2 register are ‘reserved’ and marked R/O, so the current implementation will not work anyway and the PHY driver needs to be notified of the change in requested drive-strength. > * the Rockchip eMMC phy driver sets the drive impedance accordingly > > But still we would need a mechanism to override this for our board. > And exactly this override mechanism is provided by the patch series. The PHY would then need to determine the proper operation point (or an mapping from a table) to achieve the requested line characteristic for any given board. In other words: the DTS for puma would still contain an entry to allow us to override to 33 Ohm when switching to HS-400. > Thanks, > Christoph > >> >> I do see at least the summary of what I thought of this before at >> >> >> >> (Sorry if the above is wrong and feel free to correct me--I don't have >> time at the moment to do all the full research but hopefully you can >> dig more based on my pointers. Feel free to call me on my BS) >> >> >> -Doug