Received: by 2002:ac0:a594:0:0:0:0:0 with SMTP id m20-v6csp3923607imm; Thu, 17 May 2018 18:02:19 -0700 (PDT) X-Google-Smtp-Source: AB8JxZoaXTlz25UWhVX/Wql1irTkIxWwXfuOh3OG7HdyHTS5lueQjm0GvpWoB3EAzMHBZAGWYO2Z X-Received: by 2002:a62:a21e:: with SMTP id m30-v6mr7261430pff.251.1526605339473; Thu, 17 May 2018 18:02:19 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1526605339; cv=none; d=google.com; s=arc-20160816; b=fcu60W4w/ustKAyryXx+tHnSMGbfGr2/gsYfujOnq/KYPWEnr5qdSFRdpXIJydzSHE B4Cr7aqatyiuajrRVNuqBYKTT1kyo96g2b9emWFHK+8haN+bVkVd299Ufu1RnXIgqmbs 9sL+mhaVjFipXYkd3PboBFxqkPKr/L6jD0AzomrZiubJ2zCc3X2KLhR8HkVwOdYHEtc8 R0yOjDcZDb9acx5wCdvBHDEgvLW3jSauYMy7Jaxp2MxwVCD7qZuB61sVJVvhaNa7EHtW IUMUU6WD2QH2arn3Bl6eE+XorypKep5v3Zdai1zxQDOXiLmjQXg9ica/+p/cug+ZtYQE nLxw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:cc:to:subject:message-id:date:from :references:in-reply-to:mime-version:dkim-signature:dkim-signature :arc-authentication-results; bh=e2nBJXIwuFBOodhbcBJeoKMz02nhi7niF6VxUh8XQ7w=; b=byhUhn7LvQtek8TgJrP88X5LhbTK9kju2vcI7OadWRZeTWB81s2dSif8f1/s4zHyoI xWN6/UHis+mV8XXDsaojX+nUZ8YkjmXP997lHFniGV/OpKZWlAQvOM8eyDmf2stRM2+g RlwXEHPnlylLYbbbJbU9ribwigNicaSRaTxSpZ7ZsvFPtkdSudvB5mJG6dUd/RXIAHGN G9qclF9/gyTnIWX1VBBnyRKqIh8lynmduoiIiMtpd6zhdtKC/g0N0uujLnrdIpO4uRee ClcDYbF6/Hphth4ysGE9lWbsvZ5mgPgs1CH7QklPfNWe9HOnxRK45S4U4tIfDXWe1g3p S7wA== ARC-Authentication-Results: i=1; mx.google.com; dkim=fail header.i=@google.com header.s=20161025 header.b=FF5oDZ89; dkim=fail header.i=@chromium.org header.s=google header.b=j+/+V4QM; 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; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=chromium.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id g12-v6si6534749pfm.258.2018.05.17.18.01.31; Thu, 17 May 2018 18:02:19 -0700 (PDT) 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; dkim=fail header.i=@google.com header.s=20161025 header.b=FF5oDZ89; dkim=fail header.i=@chromium.org header.s=google header.b=j+/+V4QM; 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; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=chromium.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1751897AbeERBBU (ORCPT + 99 others); Thu, 17 May 2018 21:01:20 -0400 Received: from mail-vk0-f43.google.com ([209.85.213.43]:37072 "EHLO mail-vk0-f43.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751804AbeERBBS (ORCPT ); Thu, 17 May 2018 21:01:18 -0400 Received: by mail-vk0-f43.google.com with SMTP id m144-v6so3858104vke.4 for ; Thu, 17 May 2018 18:01:18 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20161025; h=mime-version:sender:in-reply-to:references:from:date:message-id :subject:to:cc; bh=e2nBJXIwuFBOodhbcBJeoKMz02nhi7niF6VxUh8XQ7w=; b=FF5oDZ890DCeO7t7lux5lHWvL8le/SGX5m8Ut+MTWNdW+NEaAztoDF8kMbZhw8dfjG Jf7SDlydn4hFVsl5mLqUophavlkqGO9gkvzuREH+S6ovviXtPwg5lqX2GaJlreJb1Zm6 PHgHRTOZpQLcwORrtWquAH/0kQuhovt/mwuG2cnpm0/PbdNfwqiBhaaOZ3IQMDx58dqv xXxbMd9WZhsjnC5q+qUukwERORNVBLGfSbRgX/PNAdgSQiVdwQOcp4tYYJ3m5pe4qNAI QIs9W8B9t5Va7SLtrEt9JmUgjASE+NoFU+xmt9+lsKV2ffa2slzyr9TWDRby6/t+4qBx 9gDw== DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=chromium.org; s=google; h=mime-version:sender:in-reply-to:references:from:date:message-id :subject:to:cc; bh=e2nBJXIwuFBOodhbcBJeoKMz02nhi7niF6VxUh8XQ7w=; b=j+/+V4QM4SGaWutzuRcX1DIe48NvaIXekp/y1BYnG5ggG2aTGmvEJrh4CPiH5ipzqk At/hprFOBQmoDJjF0N3f97pVH+pvE1zg5oD4qmmivq/sNIx0iatgQPkstxATwo06Le3p 0vKSW+9EgCHimiN/OnZOf0Gy0/1WRzdnEPSgE= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:mime-version:sender:in-reply-to:references:from :date:message-id:subject:to:cc; bh=e2nBJXIwuFBOodhbcBJeoKMz02nhi7niF6VxUh8XQ7w=; b=qDOhYFZTN5LuwDBrBTb4XECI1cqOAB74F6ufijMFiQA9CwYER/0G8TOv/61kdpi5uL Yd7Ht65Unph5gJA2jire9oNBPa7JxmIcwqBSFti61TB8xIL5nb5kCXx3/BpoM/2HuVlg EBWfty/3hyHKSAks340M2kqC/HAMB4Bki5w7uO5NDG0uhi8HcCBfyle/IJoH6To8xa5W CHAVQWzvibJQ+PrQaSbGfMRZgdpfCG5OEEGqFqicYm54WneYc9o5+kS6QsZ5oJt+lZH/ wVLsJz77Gvh1U/k/+onvT0BF8/T5nioIvrh33OtyItB2VKD1AiIaFZD2O4NuKPd7DsmR 1e3w== X-Gm-Message-State: ALKqPwcdsqremxrLGy+bjwZrYnSQFgr22gtQXVHEmG67YgFDO2xH9lis i/yeP3IE1TiUNE655VUShJ+dVhWuv5/giFG8hTOjvw== X-Received: by 2002:a1f:fc4a:: with SMTP id a71-v6mr5550535vki.141.1526605276791; Thu, 17 May 2018 18:01:16 -0700 (PDT) MIME-Version: 1.0 Received: by 10.31.48.82 with HTTP; Thu, 17 May 2018 18:01:15 -0700 (PDT) In-Reply-To: <869aad59-1cc5-28ef-1fb5-4ef846696c40@codeaurora.org> References: <41d5df73ddac772551d2966e0752bb0c357b1ded.1526088081.git.collinsd@codeaurora.org> <869aad59-1cc5-28ef-1fb5-4ef846696c40@codeaurora.org> From: Doug Anderson Date: Thu, 17 May 2018 18:01:15 -0700 X-Google-Sender-Auth: DEmt1lB-vRf9MRPJYiRpg6aaAaY Message-ID: Subject: Re: [PATCH v3 1/2] regulator: dt-bindings: add QCOM RPMh regulator bindings To: David Collins Cc: Mark Brown , Liam Girdwood , Rob Herring , Mark Rutland , linux-arm-msm@vger.kernel.org, Linux ARM , devicetree@vger.kernel.org, LKML , Rajendra Nayak , Stephen Boyd Content-Type: text/plain; charset="UTF-8" Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Hi, On Thu, May 17, 2018 at 5:16 PM, David Collins wrote: > On 05/17/2018 02:22 PM, Doug Anderson wrote: >> On Fri, May 11, 2018 at 7:28 PM, David Collins wrote: >>> +- qcom,regulator-initial-microvolt >>> + Usage: optional; VRM regulators only >>> + Value type: >>> + Definition: Specifies the initial voltage in microvolts to request for a >>> + VRM regulator. >> >> Now that Mark has landed the patch adding support for the >> -ENOTRECOVERABLE error code from get_voltage() / get_voltage_sel(), do >> we still need the qcom,regulator-initial-microvolt property? > > Yes, this is still needed. The -ENOTRECOVERABLE patch ensures that > qcom-rpmh-regulator devices can be registered even if > qcom,regulator-initial-microvolt is not specified. However, that will > result in the regulators being configured for the minimum voltage > supported in the DT specified min/max range. The > qcom,regulator-initial-microvolt property allows us to set a specific > voltage that is larger than the min constraint. Ah, OK. In the device tree fragment I saw the initial was always equal to the min, so I wasn't sure if this was really needed in practice. I presume it would only be important if a voltage was left high by the bootloader for some peripheral that needs to continue to function (and use the existing higher voltage) until a real device claims it. For all other voltages, it should be fine if it's set to the min until a real device claims it. Do you have real examples of devices like this in boards using sdm845? >> If this is really still needed, can it be moved to the regulator core? > > I'm not opposed to the idea, but I think that Mark is [1]: Oh right. The downside of weeks between spins I guess. If Mark is fine with the private property I won't fight it. >>> +- regulator-initial-mode >>> + Usage: optional; VRM regulators only >>> + Value type: >>> + Definition: Specifies the initial mode to request for a VRM regulator. >>> + Supported values are RPMH_REGULATOR_MODE_* which are defined >>> + in [1] (i.e. 0 to 3). This property may be specified even >>> + if the regulator-allow-set-load property is not specified. >> >> Every time I read the above I wonder why you're documenting a standard >> regulator regulator property in your bindings. ...then I realize it's >> because you're doing it because you want to explicitly document what >> the valid modes are. I wonder if it makes sense to just put a >> reference somewhere else in this document to go look at the header >> file where these are all nicely documented. > > Isn't that what the [1] in the above snippet is currently doing. Further > down in qcom,rpmh-regulator.txt is this line: > > +[1] include/dt-bindings/regulator/qcom,rpmh-regulator.h Right, but I want to move it so it doesn't look like you're defining a property that's already defined in the common bindings. AKA get rid of the "regulator-initial-mode" property description. Then add above Examples: ======================== Regulator Modes ======================== RPMh regulators are designed to work with the standard regulator mode bindings, using properties like "regulator-initial-mode". See include/dt-bindings/regulator/qcom,rpmh-regulator.h for information on the modes relevant to RPMh regulators. Some RPMh regulators (BOB regulators only) also support bypass using the standard "regulator-allow-bypass" binding. ...feel fee to reword, but basically the idea is to document it but not make it look like you're defining a novel property. >> Speaking of documenting things like that, it might be worth finding >> somewhere in this doc to mention that the "bob" regulator on PMI8998 >> can support "regulator-allow-bypass". That tidbit got lost when we >> moved to the standard regulator bindings for bypass. > > I suppose that I could add something like this: > > +- regulator-allow-bypass > + Usage: optional; BOB type VRM regulators only > + Value type: > + Definition: See [2] for details. > ... > +[2]: Documentation/devicetree/bindings/regulator.txt > > However, I don't want the patch to get NACKed because it is defining a > property that is already defined in the common regulator.txt file. See above for my suggestion. >>> +- qcom,allowed-drms-modes >>> + Usage: required if regulator-allow-set-load is specified; >>> + VRM regulators only >>> + Value type: >>> + Definition: A list of integers specifying the PMIC regulator modes which >>> + can be configured at runtime based upon consumer load needs. >>> + Supported values are RPMH_REGULATOR_MODE_* which are defined >>> + in [1] (i.e. 0 to 3). >> >> Why is this still here? You moved it to the core regulator framework, >> right? It's still in your examples too. Shouldn't this be removed? >> It looks like the driver still needs this and it needs to be an exact >> duplicate of the common binding. That doesn't seem right... > > The qcom,allowed-drms-modes property supports a different feature than the > regulator-allowed-modes property accepted in [2]. The latter specifies > the modes that may be used at all (e.g. in regulator_set_mode() calls) and > it lists the mode values in an unordered fashion. > > qcom,allowed-drms-modes defines a specific subset of the possible allowed > modes that should be set based on DRMS (e.g. in regulator_set_load() > calls). Its values are listed in a specific order and must match 1-to-1 > with qcom,drms-mode-max-microamps entries. > > It would probably be good to change the name of the property from > qcom,allowed-drms-modes to qcom,regulator-drms-modes. Ah, I see. It's unfortunate that now we need to effectively list all modes twice. Have you seen real-life examples where these sets of modes need to be different, or is this just theoretical? If not can we start with one property (that controls both things) and if we really see that we need to specify different sets of modes for the two cases we can add a separate property? ...actually, even if you do have real-life examples of where these need to be different, if 90% of the time they are the same it would still be nice to just have one property apply to both cases. >>> +- qcom,drms-mode-max-microamps >>> + Usage: required if regulator-allow-set-load is specified; >>> + VRM regulators only >>> + Value type: >>> + Definition: A list of integers specifying the maximum allowed load >>> + current in microamps for each of the modes listed in >>> + qcom,allowed-drms-modes (matched 1-to-1 in order). Elements >>> + must be specified in order from lowest to highest value. >> >> Any reason this can't go into the regulator core? You'd basically >> just take the existing concept of rpmh_regulator_vrm_set_load() and >> put it in the core. > > This could be implemented in the core via new constraint elements parsed > in of_regulator and a helper function to specify in regulator_ops. > However, I'm not sure about the wide-spread applicability of this feature. > I'd prefer to leave it in the driver unless Mark would like me to add it > into the core. You're already using pre-existing APIs around specifying the current and having the regulator core call you to map the total current into a mode. That implies that this is applicable to others. Adding this tiny amount of code to the core makes the pre-existing APIs generally useful. >>> +- qcom,headroom-microvolt >>> + Usage: optional; VRM regulators only >>> + Value type: >>> + Definition: Specifies the headroom voltage in microvolts to request for >>> + a VRM regulator. RPMh hardware automatically ensures that >>> + the parent of this regulator outputs a voltage high enough >>> + to satisfy the requested headroom. Supported values are >>> + 0 to 511000. >> >> I'm curious: is this a voted-for value, or a global value? >> >> Said another way: the whole point of RPMh is that there may be more >> than one processor that needs the same rails, right? So the AP might >> request 1.1 V for a rail and the modem might request 1.3 V. RPMh >> would decide to pick the higher of those two (1.3 V), but if the modem >> said it no longer needs the rail it will drop down to 1.1 V. >> >> ...and as an example of why the headroom needs to be in hardware, if >> the source voltage was normally 1.4 V and the headroom was 200 mV then >> the hardware would need to know to bump up the source voltage to 1.5V >> during the period of of time that the modem wants the rail at 1.3V. >> >> So my question is: do the AP and modem in the above situation >> separately vote for headroom? How is it aggregated? ...or is it a >> global value and this sets the headroom for all clients of RPMh? It >> would be interesting to document this as it might help with figuring >> out how this value should be set. > > The headroom voltage voting is supported in hardware per-regulator and > per-master (AP, modem, etc). The headroom voltage and output voltage are > each aggregated (using max) per-regulator across masters. If the > aggregated enable state for a regulator is on, then the aggregated output > voltage and headroom voltage are added together and applied as a min > constraint on the parent's output voltage (if there is a parent). Ah, interesting. I'm not 100% convinced that the RPMh API is at the right abstraction level here. I guess you increase the headroom voltage if you expect a lot of current and need the regulator to still give a clean signal? If you truly wanted to aggregate then if both the modem and AP wanted to draw a lot of current they would both need to increase the headroom and then the headroom should maybe not be the max but something slightly more (you wouldn't want to add, but ...) Since it's just a max, in theory it seems like you get 99% of the way there by just using the Linux APIs to deal with dropout voltage. If Linux was managing it in software then if it needed to account for extra headroom it would just increase the supply voltage. That should play just fine with the modem (which might be using the hardware headroom feature) since it will be making its own completely separate requests and they should be aggregated OK. In another thread you said you'd be OK dropping the headroom voltage since it wasn't needed on SDM845. Maybe we should do that? ...and if someone later needs to account for a larger dropout they can figure out how to hookup the standard linux min_dropout_uV?