Message ID | 20240216203215.40870-1-brgl@bgdev.pl |
---|---|
Headers | show |
Series | power: sequencing: implement the subsystem and add first users | expand |
On Fri, 16 Feb 2024 at 22:33, Bartosz Golaszewski <brgl@bgdev.pl> wrote: > > From: Bartosz Golaszewski <bartosz.golaszewski@linaro.org> > > This adds the power sequencing driver for the QCA6390's PMU module. It > uses the pwrseq subsystem and knows how to match the sequencer to the > consumer device by verifying the relevant properties and DT layout. > > Signed-off-by: Bartosz Golaszewski <bartosz.golaszewski@linaro.org> > --- > drivers/power/sequencing/Kconfig | 16 + > drivers/power/sequencing/Makefile | 2 + > drivers/power/sequencing/pwrseq-qca6390.c | 353 ++++++++++++++++++++++ > 3 files changed, 371 insertions(+) > create mode 100644 drivers/power/sequencing/pwrseq-qca6390.c > > diff --git a/drivers/power/sequencing/Kconfig b/drivers/power/sequencing/Kconfig > index ba5732b1dbf8..84ddf3b4ae56 100644 > --- a/drivers/power/sequencing/Kconfig > +++ b/drivers/power/sequencing/Kconfig > @@ -10,3 +10,19 @@ menuconfig POWER_SEQUENCING > during power-up. > > If unsure, say no. > + > +if POWER_SEQUENCING > + > +config POWER_SEQUENCING_QCA6390 > + tristate "QCA6390 PMU driver" > + default m if ARCH_QCOM > + help > + Say U here to enable the power sequencing driver for Qualcomm > + QCA6390. > + > + The QCA6390 package contains the BT and WLAN modules whose power > + is controlled by the PMU module. As the former two share the power-up > + sequence which is executed by the PMU, this driver is needed for > + correct power control. > + > +endif > diff --git a/drivers/power/sequencing/Makefile b/drivers/power/sequencing/Makefile > index dcdf8c0c159e..628345c4e7ae 100644 > --- a/drivers/power/sequencing/Makefile > +++ b/drivers/power/sequencing/Makefile > @@ -2,3 +2,5 @@ > > obj-$(CONFIG_POWER_SEQUENCING) += pwrseq-core.o > pwrseq-core-y := core.o > + > +obj-$(CONFIG_POWER_SEQUENCING_QCA6390) += pwrseq-qca6390.o > diff --git a/drivers/power/sequencing/pwrseq-qca6390.c b/drivers/power/sequencing/pwrseq-qca6390.c > new file mode 100644 > index 000000000000..5f254f9c71d7 > --- /dev/null > +++ b/drivers/power/sequencing/pwrseq-qca6390.c > @@ -0,0 +1,353 @@ > +// SPDX-License-Identifier: GPL-2.0-only > +/* > + * Copyright (C) 2024 Linaro Ltd. > + */ > + > +#include <linux/delay.h> > +#include <linux/device.h> > +#include <linux/gpio/consumer.h> > +#include <linux/jiffies.h> > +#include <linux/mod_devicetable.h> > +#include <linux/module.h> > +#include <linux/of.h> > +#include <linux/platform_device.h> > +#include <linux/regulator/consumer.h> > +#include <linux/pwrseq/provider.h> > +#include <linux/string.h> > +#include <linux/types.h> > + > +struct pwrseq_qca6390_vreg { > + const char *name; > + unsigned int load_uA; > +}; > + > +struct pwrseq_qca6390_pdata { > + const struct pwrseq_qca6390_vreg *vregs_common; > + size_t num_vregs_common; > + const struct pwrseq_qca6390_vreg *vregs_wlan; > + size_t num_vregs_wlan; > + unsigned int pwup_delay_msec; > +}; > + > +struct pwrseq_qca6390_ctx { > + struct pwrseq_device *pwrseq; > + struct device_node *of_node; > + const struct pwrseq_qca6390_pdata *pdata; > + struct regulator_bulk_data *regs_common; > + struct regulator_bulk_data *regs_wlan; > + struct gpio_desc *bt_gpio; > + struct gpio_desc *wlan_gpio; > + unsigned long last_gpio_enable; > +}; > + > +static const struct pwrseq_qca6390_vreg pwrseq_qca6390_vregs_common[] = { > + { > + .name = "vddio", > + .load_uA = 20000, > + }, > + { > + .name = "vddaon", > + .load_uA = 100000, > + }, > + { > + .name = "vddpmu", > + .load_uA = 1250000, > + }, > + { > + .name = "vddrfa0p95", > + .load_uA = 200000, > + }, > + { > + .name = "vddrfa1p3", > + .load_uA = 400000, > + }, > + { > + .name = "vddrfa1p9", > + .load_uA = 400000, > + }, > +}; > + > +static const struct pwrseq_qca6390_vreg pwrseq_qca6390_vregs_wlan[] = { > + { > + .name = "vddpcie1p3", > + .load_uA = 35000, > + }, > + { > + .name = "vddpcie1p9", > + .load_uA = 15000, > + }, > +}; I thought that we had discussed this already. According to the docs, all PMU supplies should be powered on when the chip is being switched on, no matter whether it is for the WiFi or for the BT. > + > +static void pwrseq_qca6390_ensure_gpio_delay(struct pwrseq_qca6390_ctx *ctx) > +{ > + unsigned long diff_jiffies = jiffies - ctx->last_gpio_enable; > + unsigned int diff_msecs = jiffies_to_msecs(diff_jiffies); > + > + if (diff_msecs < 100) > + msleep(100 - diff_msecs); > +} > + > +static const struct pwrseq_qca6390_pdata pwrseq_qca6390_of_data = { > + .vregs_common = pwrseq_qca6390_vregs_common, > + .num_vregs_common = ARRAY_SIZE(pwrseq_qca6390_vregs_common), > + .vregs_wlan = pwrseq_qca6390_vregs_wlan, > + .num_vregs_wlan = ARRAY_SIZE(pwrseq_qca6390_vregs_wlan), > + .pwup_delay_msec = 16, > +}; > + > +static int pwrseq_qca6390_vregs_enable(struct pwrseq_device *pwrseq) > +{ > + struct pwrseq_qca6390_ctx *ctx = pwrseq_device_get_drvdata(pwrseq); > + > + return regulator_bulk_enable(ctx->pdata->num_vregs_common, > + ctx->regs_common); > +} > + > +static int pwrseq_qca6390_vregs_disable(struct pwrseq_device *pwrseq) > +{ > + struct pwrseq_qca6390_ctx *ctx = pwrseq_device_get_drvdata(pwrseq); > + > + return regulator_bulk_disable(ctx->pdata->num_vregs_common, > + ctx->regs_common); > +} > + > +static const struct pwrseq_unit_data pwrseq_qca6390_vregs_unit_data = { > + .name = "regulators-enable", > + .enable = pwrseq_qca6390_vregs_enable, > + .disable = pwrseq_qca6390_vregs_disable, > +}; > + > +static const struct pwrseq_unit_data *pwrseq_qca6390_unit_deps[] = { > + &pwrseq_qca6390_vregs_unit_data, > + NULL > +}; > + > +static int pwrseq_qca6390_bt_enable(struct pwrseq_device *pwrseq) > +{ > + struct pwrseq_qca6390_ctx *ctx = pwrseq_device_get_drvdata(pwrseq); > + > + pwrseq_qca6390_ensure_gpio_delay(ctx); > + gpiod_set_value_cansleep(ctx->bt_gpio, 1); > + ctx->last_gpio_enable = jiffies; > + > + return 0; > +} > + > +static int pwrseq_qca6390_bt_disable(struct pwrseq_device *pwrseq) > +{ > + struct pwrseq_qca6390_ctx *ctx = pwrseq_device_get_drvdata(pwrseq); > + > + gpiod_set_value_cansleep(ctx->bt_gpio, 0); > + > + return 0; > +} > + > +static const struct pwrseq_unit_data pwrseq_qca6390_bt_unit_data = { > + .name = "bluetooth-enable", > + .deps = pwrseq_qca6390_unit_deps, Can we call corresponding regulator_bulk functions from bt and wlan enable/disable? This will save us from building the tree-like structures (and possible loops inside that tree). > + .enable = pwrseq_qca6390_bt_enable, > + .disable = pwrseq_qca6390_bt_disable, > +}; > + > +static int pwrseq_qca6390_wlan_enable(struct pwrseq_device *pwrseq) > +{ > + struct pwrseq_qca6390_ctx *ctx = pwrseq_device_get_drvdata(pwrseq); > + int ret; > + > + ret = regulator_bulk_enable(ctx->pdata->num_vregs_wlan, ctx->regs_wlan); > + if (ret) > + return ret; > + > + pwrseq_qca6390_ensure_gpio_delay(ctx); > + gpiod_set_value_cansleep(ctx->wlan_gpio, 1); > + ctx->last_gpio_enable = jiffies; > + > + return 0; > +} > + > +static int pwrseq_qca6390_wlan_disable(struct pwrseq_device *pwrseq) > +{ > + struct pwrseq_qca6390_ctx *ctx = pwrseq_device_get_drvdata(pwrseq); > + > + gpiod_set_value_cansleep(ctx->wlan_gpio, 0); > + > + return regulator_bulk_disable(ctx->pdata->num_vregs_wlan, > + ctx->regs_wlan); > +} > + > +static const struct pwrseq_unit_data pwrseq_qca6390_wlan_unit_data = { > + .name = "wlan-enable", > + .deps = pwrseq_qca6390_unit_deps, > + .enable = pwrseq_qca6390_wlan_enable, > + .disable = pwrseq_qca6390_wlan_disable, > +}; > + > +static int pwrseq_qca6390_pwup_delay(struct pwrseq_device *pwrseq) > +{ > + struct pwrseq_qca6390_ctx *ctx = pwrseq_device_get_drvdata(pwrseq); > + > + if (ctx->pdata->pwup_delay_msec) > + msleep(ctx->pdata->pwup_delay_msec); > + > + return 0; > +} > + > +static const struct pwrseq_target_data pwrseq_qca6390_bt_target_data = { > + .name = "bluetooth", > + .unit = &pwrseq_qca6390_bt_unit_data, > + .post_enable = pwrseq_qca6390_pwup_delay, > +}; > + > +static const struct pwrseq_target_data pwrseq_qca6390_wlan_target_data = { > + .name = "wlan", > + .unit = &pwrseq_qca6390_wlan_unit_data, > + .post_enable = pwrseq_qca6390_pwup_delay, > +}; > + > +static const struct pwrseq_target_data *pwrseq_qca6390_targets[] = { > + &pwrseq_qca6390_bt_target_data, > + &pwrseq_qca6390_wlan_target_data, > + NULL > +}; > + > +static int pwrseq_qca6390_match(struct pwrseq_device *pwrseq, > + struct device *dev) > +{ > + struct pwrseq_qca6390_ctx *ctx = pwrseq_device_get_drvdata(pwrseq); > + struct device_node *dev_node = dev->of_node; > + > + /* > + * The PMU supplies power to the Bluetooth and WLAN modules. both > + * consume the PMU AON output so check the presence of the > + * 'vddaon-supply' property and whether it leads us to the right > + * device. > + */ > + if (!of_property_present(dev_node, "vddaon-supply")) > + return 0; > + > + struct device_node *reg_node __free(device_node) = > + of_parse_phandle(dev_node, "vddaon-supply", 0); > + if (!reg_node) > + return 0; > + > + /* > + * `reg_node` is the PMU AON regulator, its parent is the `regulators` > + * node and finally its grandparent is the PMU device node that we're > + * looking for. > + */ > + if (!reg_node->parent || !reg_node->parent->parent || > + reg_node->parent->parent != ctx->of_node) > + return 0; > + > + return 1; > +} > + > +static struct regulator_bulk_data * > +pwrseq_qca6390_get_regs(struct device *dev, size_t num_regs, > + const struct pwrseq_qca6390_vreg *pdata) > +{ > + struct regulator_bulk_data *regs; > + int ret, i; > + > + regs = devm_kcalloc(dev, num_regs, sizeof(*regs), GFP_KERNEL); > + if (!regs) > + return ERR_PTR(-ENOMEM); > + > + for (i = 0; i < num_regs; i++) > + regs[i].supply = pdata[i].name; > + > + ret = devm_regulator_bulk_get(dev, num_regs, regs); > + if (ret < 0) > + return ERR_PTR(ret); > + > + for (i = 0; i < num_regs; i++) { > + if (!pdata[i].load_uA) > + continue; > + > + ret = regulator_set_load(regs[i].consumer, pdata[i].load_uA); > + if (ret) > + return ERR_PTR(ret); > + } > + > + return regs; > +} > + > +static int pwrseq_qca6390_probe(struct platform_device *pdev) > +{ > + struct device *dev = &pdev->dev; > + struct pwrseq_qca6390_ctx *ctx; > + struct pwrseq_config config; > + > + ctx = devm_kzalloc(dev, sizeof(*ctx), GFP_KERNEL); > + if (!ctx) > + return -ENOMEM; > + > + ctx->of_node = dev->of_node; > + > + ctx->pdata = of_device_get_match_data(dev); > + if (!ctx->pdata) > + return dev_err_probe(dev, -ENODEV, > + "Failed to obtain platform data\n"); > + > + ctx->regs_common = pwrseq_qca6390_get_regs(dev, > + ctx->pdata->num_vregs_common, > + ctx->pdata->vregs_common); > + if (IS_ERR(ctx->regs_common)) > + return dev_err_probe(dev, PTR_ERR(ctx->regs_common), > + "Failed to get all regulators\n"); > + > + ctx->regs_wlan = pwrseq_qca6390_get_regs(dev, > + ctx->pdata->num_vregs_wlan, > + ctx->pdata->vregs_wlan); > + if (IS_ERR(ctx->regs_wlan)) > + return dev_err_probe(dev, PTR_ERR(ctx->regs_wlan), > + "Failed to get all regulators\n"); > + > + ctx->bt_gpio = devm_gpiod_get_optional(dev, "bt-enable", GPIOD_OUT_LOW); > + if (IS_ERR(ctx->bt_gpio)) > + return dev_err_probe(dev, PTR_ERR(ctx->bt_gpio), > + "Failed to get the Bluetooth enable GPIO\n"); > + > + ctx->wlan_gpio = devm_gpiod_get_optional(dev, "wlan-enable", > + GPIOD_OUT_LOW); > + if (IS_ERR(ctx->wlan_gpio)) > + return dev_err_probe(dev, PTR_ERR(ctx->wlan_gpio), > + "Failed to get the WLAN enable GPIO\n"); > + > + memset(&config, 0, sizeof(config)); > + > + config.parent = dev; > + config.owner = THIS_MODULE; > + config.drvdata = ctx; > + config.match = pwrseq_qca6390_match; > + config.targets = pwrseq_qca6390_targets; > + > + ctx->pwrseq = devm_pwrseq_device_register(dev, &config); > + if (IS_ERR(ctx->pwrseq)) > + return dev_err_probe(dev, PTR_ERR(ctx->pwrseq), > + "Failed to register the power sequencer\n"); > + > + return 0; > +} > + > +static const struct of_device_id pwrseq_qca6390_of_match[] = { > + { > + .compatible = "qcom,qca6390-pmu", > + .data = &pwrseq_qca6390_of_data, > + }, > + { } > +}; > +MODULE_DEVICE_TABLE(of, pwrseq_qca6390_of_match); > + > +static struct platform_driver pwrseq_qca6390_driver = { > + .driver = { > + .name = "pwrseq-qca6390", > + .of_match_table = pwrseq_qca6390_of_match, > + }, > + .probe = pwrseq_qca6390_probe, > +}; > +module_platform_driver(pwrseq_qca6390_driver); > + > +MODULE_AUTHOR("Bartosz Golaszewski <bartosz.golaszewski@linaro.org>"); > +MODULE_DESCRIPTION("QCA6390 PMU power sequencing driver"); > +MODULE_LICENSE("GPL"); > -- > 2.40.1 >
On Fri, Feb 16, 2024 at 09:32:00PM +0100, Bartosz Golaszewski wrote: > From: Bartosz Golaszewski <bartosz.golaszewski@linaro.org> > > The QCA6390 package contains discreet modules for WLAN and Bluetooth. They > are powered by the Power Management Unit (PMU) that takes inputs from the > host and provides LDO outputs. This document describes this module. Please submit patches using subject lines reflecting the style for the subsystem, this makes it easier for people to identify relevant patches. Look at what existing commits in the area you're changing are doing and make sure your subject lines visually resemble what they're doing. There's no need to resubmit to fix this alone.
On Sat, Feb 17, 2024 at 4:48 PM Mark Brown <broonie@kernel.org> wrote: > > On Fri, Feb 16, 2024 at 09:32:00PM +0100, Bartosz Golaszewski wrote: > > From: Bartosz Golaszewski <bartosz.golaszewski@linaro.org> > > > > The QCA6390 package contains discreet modules for WLAN and Bluetooth. They > > are powered by the Power Management Unit (PMU) that takes inputs from the > > host and provides LDO outputs. This document describes this module. > > Please submit patches using subject lines reflecting the style for the > subsystem, this makes it easier for people to identify relevant patches. > Look at what existing commits in the area you're changing are doing and > make sure your subject lines visually resemble what they're doing. > There's no need to resubmit to fix this alone. Mark, This is quite vague, could you elaborate? I have no idea what is wrong with this patch. Bartosz
On Sat, Feb 17, 2024 at 12:17 AM Dmitry Baryshkov <dmitry.baryshkov@linaro.org> wrote: > > On Fri, 16 Feb 2024 at 22:33, Bartosz Golaszewski <brgl@bgdev.pl> wrote: > > > > From: Bartosz Golaszewski <bartosz.golaszewski@linaro.org> > > > > This adds the power sequencing driver for the QCA6390's PMU module. It > > uses the pwrseq subsystem and knows how to match the sequencer to the > > consumer device by verifying the relevant properties and DT layout. > > > > Signed-off-by: Bartosz Golaszewski <bartosz.golaszewski@linaro.org> > > --- [snip] > > + > > +static const struct pwrseq_qca6390_vreg pwrseq_qca6390_vregs_common[] = { > > + { > > + .name = "vddio", > > + .load_uA = 20000, > > + }, > > + { > > + .name = "vddaon", > > + .load_uA = 100000, > > + }, > > + { > > + .name = "vddpmu", > > + .load_uA = 1250000, > > + }, > > + { > > + .name = "vddrfa0p95", > > + .load_uA = 200000, > > + }, > > + { > > + .name = "vddrfa1p3", > > + .load_uA = 400000, > > + }, > > + { > > + .name = "vddrfa1p9", > > + .load_uA = 400000, > > + }, > > +}; > > + > > +static const struct pwrseq_qca6390_vreg pwrseq_qca6390_vregs_wlan[] = { > > + { > > + .name = "vddpcie1p3", > > + .load_uA = 35000, > > + }, > > + { > > + .name = "vddpcie1p9", > > + .load_uA = 15000, > > + }, > > +}; > > I thought that we had discussed this already. According to the docs, > all PMU supplies should be powered on when the chip is being switched > on, no matter whether it is for the WiFi or for the BT. > I know, I mostly did it to make Bjorn happy because he was adamant we don't need the PCIe regulators for BT and when I checked, it does work in practice so I thought: whatever. But indeed, the docs say otherwise. Noted for v6. [snip] > > + > > +static const struct pwrseq_unit_data pwrseq_qca6390_bt_unit_data = { > > + .name = "bluetooth-enable", > > + .deps = pwrseq_qca6390_unit_deps, > > Can we call corresponding regulator_bulk functions from bt and wlan > enable/disable? This will save us from building the tree-like > structures (and possible loops inside that tree). > Can we? Sure, but the dependency graph (yeah, we should enforce it to be acyclic) is what makes this code future-proof and allows it to avoid repeating calls in different targets. [snip] Bart
On Sat, Feb 17, 2024 at 07:32:16PM +0100, Bartosz Golaszewski wrote: > On Sat, Feb 17, 2024 at 4:48 PM Mark Brown <broonie@kernel.org> wrote: > > Please submit patches using subject lines reflecting the style for the > > subsystem, this makes it easier for people to identify relevant patches. > > Look at what existing commits in the area you're changing are doing and > > make sure your subject lines visually resemble what they're doing. > > There's no need to resubmit to fix this alone. > This is quite vague, could you elaborate? I have no idea what is wrong > with this patch. The subject line does not look like the subject line for a regulator patch rendering it almost invisible in my inbox. As you will see if you follow the above suggestion and look at other commits to the same area you should see that subject lines should start regulator:.
On Fri, 16 Feb 2024 at 22:33, Bartosz Golaszewski <brgl@bgdev.pl> wrote: > > From: Bartosz Golaszewski <bartosz.golaszewski@linaro.org> > > First, I'd like to apologize for the somewhat chaotic previous iterations > of this series and improper versioning which was rightfully pointed out > to me. I figured that the scope changed so much that it didn't make sense > to consider previous submissions part of the same series as the original > RFC but others thought otherwise so this one becomes v5 and I'll keep the > versioning going forward. > > This is the summary of the work so far: > > v1: Original RFC: > > https://lore.kernel.org/lkml/20240104130123.37115-1-brgl@bgdev.pl/T/ > > v2: First real patch series (should have been PATCH v2) adding what I > referred to back then as PCI power sequencing: > > https://lore.kernel.org/linux-arm-kernel/2024021413-grumbling-unlivable-c145@gregkh/T/ > > v3: RFC for the DT representation of the PMU supplying the WLAN and BT > modules inside the QCA6391 package (was largely separate from the > series but probably should have been called PATCH or RFC v3): > > https://lore.kernel.org/all/CAMRc=Mc+GNoi57eTQg71DXkQKjdaoAmCpB=h2ndEpGnmdhVV-Q@mail.gmail.com/T/ > > v4: Second attempt at the full series with changed scope (introduction of > the pwrseq subsystem, should have been RFC v4) > > https://lore.kernel.org/lkml/20240201155532.49707-1-brgl@bgdev.pl/T/ > > === > > With that out of the way, I'd like to get down to explaining the two > problems I'm trying to solve. > > Problem statement #1: Dynamic bus chicken-and-egg problem. > > Certain on-board PCI devices need to be powered up before they are can be > detected but their PCI drivers won't get bound until the device is > powered-up so enabling the relevant resources in the PCI device driver > itself is impossible. > > Problem statement #2: Sharing inter-dependent resources between devices. > > Certain devices that use separate drivers (often on different busses) > share resources (regulators, clocks, etc.). Typically these resources > are reference-counted but in some cases there are additional interactions > between them to consider, for example specific power-up sequence timings. > > === > > The reason for tackling both of these problems in a single series is the > fact the the platform I'm working on - Qualcomm RB5 - deals with both and > both need to be addressed in order to enable WLAN and Bluetooth support > upstream. > > The on-board WLAN/BT package - QCA6391 - has a Power Management Unit that > takes inputs from the host and exposes LDO outputs consumed by the BT and > WLAN modules which can be powered-up and down independently. However > a delay of 100ms must be respected between enabling the BT- and > WLAN-enable GPIOs[*]. > > === > > This series is logically split into several sections. I'll go > patch-by-patch and explain each step. > > Patch 1/18: > > This is a commit taken from the list by Jonathan Cameron that adds > a __free() helper for OF nodes. Not strictly related to the series but > until said commit ends in next, I need to carry it with this series. > > Patch 2/18: > > This enables the ath12k PCI module in arm64 defconfig as Qualcomm sm8650 > and sm8550 reference platforms use it in the WCN7850 module. > > Patches 3/18-6/18: > > These contain all relevant DT bindings changes. We add new documents for > the QCA6390 PMU and ATH12K devices as well as extend the bindings for the > Qualcomm Bluetooth and ATH11K modules with regulators used by them in > QCA6390. > > Patches 7/18-9/18: > > These contain changes to device-tree sources for the three platforms we > work with in this series. As the WCN7850 module doesn't require any > specific timings introducing dependencies between the Bluetooth and WLAN > modules, while the QCA6390 does, we take two different approaches to how > me model them in DT. > > For WCN7850 we hide the existence of the PMU as modeling it is simply not > necessary. The BT and WLAN devices on the device-tree are represented as > consuming the inputs (relevant to the functionality of each) of the PMU > directly. We are describing the hardware. From the hardware point of view, there is a PMU. I think at some point we would really like to describe all Qualcomm/Atheros WiFI+BT units using this PMU approach, including the older ath10k units present on RB3 (WCN3990) and db820c (QCA6174). > For QCA6390 on RB5 we add the PMU node as a platform device. It consumes > regulators and GPIOs from the host and exposed regulators consumer in turn > by the BT and WLAN modules. This represents the internal structure of the > package. > > Patches 10/18-14/18: > > These contain the bulk of the PCI changes for this series. We introduce > a simple framework for powering up PCI devices before detecting them on > the bus and the first user of this library in the form of the WCN7850 PCI > power control driver. > > The general approach is as follows: PCI devices that need special > treatment before they can be powered up, scanned and bound to their PCI > drivers must be described on the device-tree as child nodes of the PCI > port node. These devices will be instantiated on the platform bus. They > will in fact be generic platform devices with the compatible of the form > used for PCI devices already upstream ("pci<vendor ID>,<device ID">). We > add a new directory under drivers/pci/pwrctl/ that contains PCI pwrctl > drivers. These drivers are platform drivers that will now be matched > against the devices instantiated from port children just like any other > platform pairs. > > Both the power control platform device *AND* the associated PCI device > reuse the same OF node and have access to the same properties. The goal > of the platform driver is to request and bring up any required resources > and let the pwrctl framework know that it's now OK to rescan the bus and > detect the devices. When the device is bound, we are notified about it > by the PCI bus notifier event and can establish a device link between the > power control device and the PCI device so that any future extension for > power-management will already be able to work with the correct hierachy. > > The reusing of the OF node is the reason for the small changes to the PCI > OF core: as the bootloader can possibly leave the relevant regulators on > before booting linux, the PCI device can be detected before its platform > abstraction is probed. In this case, we find that device first and mark > its OF node as reused. The pwrctl framework handles the opposite case > (when the PCI device is detected only after the platform driver > successfully enabled it). > > Patches 15/18-16/18: > > These add a relatively simple power sequencing subsystem and the first > driver using it: the pwrseq module for the QCA6390 PMU. > > For the record: Bjorn suggested a different solution: a regulator driver > that would - based on which regulators are enabled by a consumer - enable > relevant resources (drive the enable GPIOs) while respecting the > HW-specific delays. This would however require significant and yet > unprecised changed to the regulator subsystem as well as be an abuse of > the regulator provider API akin to using the reset framework for power > sequencing as proposed before. > > Instead I'm proposing to add a subsystem that allows different devices to > use a shared power sequence split into consumer-specific as well as > common "units". > > A power sequence provider driver registers a set of units with pwrseq > core. Each unit can be enabled and disabled and contains an optional list > of other units which must be enabled before it itself can be. A unit > represents a discreet chunk of the power sequence. > > It also registers a list of targets: a target is an abstraction wrapping > a unit which allows consumers to tell pwrseq which unit they want to > reach. Real-life example is the driver we're adding here: there's a set > of common regulators, two PCIe-specific ones and two enable GPIOs: one > for Bluetooth and one for WLAN. > > The Bluetooth driver requests a descriptor to the power sequencer and > names the target it wants to reach: > > pwrseq = devm_pwrseq_get(dev, "bluetooth"); Is this target tied to the device or not? If not, this might become a limitation, if somebody installs two WiFi/BT modules to a single device. > The pwrseq core then knows that when the driver calls: > > pwrseq_power_on(pwrseq); > > It must enable the "bluetooth-enable" unit but it depends on the > "regulators-common" unit so this one is enabled first. The provider > driver is also in charge of assuring an appropriate delay between > enabling the BT and WLAN enable GPIOs. The WLAN-specific resources are > handled by the "wlan-enable" unit and so are not enabled until the WLAN > driver requests the "wlan" target to be powered on. > > Another thing worth discussing is the way we associate the consumer with > the relevant power sequencer. DT maintainers have expressed a discontent > with the existing mmc pwrseq bindings and have NAKed an earlier > initiative to introduce global pwrseq bindings to the kernel[1]. > > In this approach, we model the existing regulators and GPIOs in DT but > the pwrseq subsystem requires each provider to provide a .match() > callback. Whenever a consumer requests a power sequencer handle, we > iterate over the list of pwrseq drivers and call .match() for each. It's > up to the driver to verify in a platform-specific way whether it deals > with its consumer and let the core pwrseq code know. This looks really nice, it will allow us to migrate the BT driver to always use pwrseq instead of regulators without touching the DT. > > The advantage of this over reusing the regulator or reset subsystem is > that it's more generalized and can handle resources of all kinds as well > as deal with any kind of power-on sequences: for instance, Qualcomm has > a PCI switch they want a driver for but this switch requires enabling > some resources first (PCI pwrctl) and then configuring the device over > I2C (which can be handled by the pwrseq provider). > > Patch 17/18: > > This patch makes the Qualcomm Bluetooth driver get and use the power > sequencer for QCA6390. > > Patch 18/18: > > While tiny, this patch is possibly the highlight of the entire series. > It uses the two abstraction layers we introduced before to create an > elegant power sequencing PCI power control driver and supports the ath11k > module on QCA6390. > > With this series we can now enable BT and WLAN on several new Qualcomm > boards upstream. > > I tested the series on RB5 while Neil tested it on sm8650-qrd and > sm8550-qrd. > > Best Regards, > Bartosz Golaszewski > > It's hard to list the changes between versions here as the scope changed > significantly between each iteration and some versions were not even full > series but rather RFCs for parts of the solution. For this reason, I'll > only start listing changes starting from v6. > > [*] This is what the docs say. In practice it seems that this delay can be > ignored. However the subsequent model - QCA6490 - *does* require users to > respect it, so the problem remains valid. > > [1] https://lore.kernel.org/netdev/20210829131305.534417-1-dmitry.baryshkov@linaro.org/ > > Bartosz Golaszewski (15): > arm64: defconfig: enable ath12k as a module > dt-bindings: regulator: describe the PMU module of the QCA6390 package > dt-bindings: net: bluetooth: qualcomm: describe regulators for QCA6390 > dt-bindings: new: wireless: qcom,ath11k: describe the ath11k on > QCA6390 > dt-bindings: new: wireless: describe the ath12k PCI module > arm64: dts: qcom: qrb5165-rb5: model the PMU of the QCA6391 > PCI: hold the rescan mutex when scanning for the first time > PCI/pwrctl: reuse the OF node for power controlled devices > PCI/pwrctl: create platform devices for child OF nodes of the port > node > PCI/pwrctl: add PCI power control core code > PCI/pwrctl: add a power control driver for WCN7850 > power: sequencing: implement the pwrseq core > power: pwrseq: add a driver for the QCA6390 PMU module > Bluetooth: qca: use the power sequencer for QCA6390 > PCI/pwrctl: add a PCI power control driver for power sequenced devices > > Jonathan Cameron (1): > of: Add cleanup.h based auto release via __free(device_node) markings. > > Neil Armstrong (2): > arm64: dts: qcom: sm8550-qrd: add the Wifi node > arm64: dts: qcom: sm8650-qrd: add the Wifi node > > .../net/bluetooth/qualcomm-bluetooth.yaml | 17 + > .../net/wireless/qcom,ath11k-pci.yaml | 28 + > .../net/wireless/qcom,ath12k-pci.yaml | 103 ++ > .../bindings/regulator/qcom,qca6390-pmu.yaml | 166 +++ > MAINTAINERS | 8 + > arch/arm64/boot/dts/qcom/qrb5165-rb5.dts | 123 +- > arch/arm64/boot/dts/qcom/sm8250.dtsi | 10 + > arch/arm64/boot/dts/qcom/sm8550-qrd.dts | 37 + > arch/arm64/boot/dts/qcom/sm8550.dtsi | 10 + > arch/arm64/boot/dts/qcom/sm8650-qrd.dts | 29 + > arch/arm64/boot/dts/qcom/sm8650.dtsi | 10 + > arch/arm64/configs/defconfig | 1 + > drivers/bluetooth/hci_qca.c | 31 + > drivers/pci/Kconfig | 1 + > drivers/pci/Makefile | 1 + > drivers/pci/bus.c | 9 +- > drivers/pci/of.c | 14 +- > drivers/pci/probe.c | 2 + > drivers/pci/pwrctl/Kconfig | 25 + > drivers/pci/pwrctl/Makefile | 7 + > drivers/pci/pwrctl/core.c | 136 +++ > drivers/pci/pwrctl/pci-pwrctl-pwrseq.c | 84 ++ > drivers/pci/pwrctl/pci-pwrctl-wcn7850.c | 202 ++++ > drivers/pci/remove.c | 2 + > drivers/power/Kconfig | 1 + > drivers/power/Makefile | 1 + > drivers/power/sequencing/Kconfig | 28 + > drivers/power/sequencing/Makefile | 6 + > drivers/power/sequencing/core.c | 1065 +++++++++++++++++ > drivers/power/sequencing/pwrseq-qca6390.c | 353 ++++++ > include/linux/of.h | 2 + > include/linux/pci-pwrctl.h | 51 + > include/linux/pwrseq/consumer.h | 56 + > include/linux/pwrseq/provider.h | 75 ++ > 34 files changed, 2678 insertions(+), 16 deletions(-) > create mode 100644 Documentation/devicetree/bindings/net/wireless/qcom,ath12k-pci.yaml > create mode 100644 Documentation/devicetree/bindings/regulator/qcom,qca6390-pmu.yaml > create mode 100644 drivers/pci/pwrctl/Kconfig > create mode 100644 drivers/pci/pwrctl/Makefile > create mode 100644 drivers/pci/pwrctl/core.c > create mode 100644 drivers/pci/pwrctl/pci-pwrctl-pwrseq.c > create mode 100644 drivers/pci/pwrctl/pci-pwrctl-wcn7850.c > create mode 100644 drivers/power/sequencing/Kconfig > create mode 100644 drivers/power/sequencing/Makefile > create mode 100644 drivers/power/sequencing/core.c > create mode 100644 drivers/power/sequencing/pwrseq-qca6390.c > create mode 100644 include/linux/pci-pwrctl.h > create mode 100644 include/linux/pwrseq/consumer.h > create mode 100644 include/linux/pwrseq/provider.h > > -- > 2.40.1 >
On 17/02/2024 19:32, Bartosz Golaszewski wrote: > On Sat, Feb 17, 2024 at 4:48 PM Mark Brown <broonie@kernel.org> wrote: >> >> On Fri, Feb 16, 2024 at 09:32:00PM +0100, Bartosz Golaszewski wrote: >>> From: Bartosz Golaszewski <bartosz.golaszewski@linaro.org> >>> >>> The QCA6390 package contains discreet modules for WLAN and Bluetooth. They >>> are powered by the Power Management Unit (PMU) that takes inputs from the >>> host and provides LDO outputs. This document describes this module. >> >> Please submit patches using subject lines reflecting the style for the >> subsystem, this makes it easier for people to identify relevant patches. >> Look at what existing commits in the area you're changing are doing and >> make sure your subject lines visually resemble what they're doing. >> There's no need to resubmit to fix this alone. > > Mark, > > This is quite vague, could you elaborate? I have no idea what is wrong > with this patch. Use subject prefixes matching the subsystem. You can get them for example with `git log --oneline -- DIRECTORY_OR_FILE` on the directory your patch is touching. Best regards, Krzysztof
On 16/02/2024 21:32, Bartosz Golaszewski wrote: > From: Bartosz Golaszewski <bartosz.golaszewski@linaro.org> > > The QCA6390 package contains discreet modules for WLAN and Bluetooth. They > are powered by the Power Management Unit (PMU) that takes inputs from the > host and provides LDO outputs. This document describes this module. > > Signed-off-by: Bartosz Golaszewski <bartosz.golaszewski@linaro.org> > --- > .../bindings/regulator/qcom,qca6390-pmu.yaml | 166 ++++++++++++++++++ > 1 file changed, 166 insertions(+) > create mode 100644 Documentation/devicetree/bindings/regulator/qcom,qca6390-pmu.yaml > This matches our internal discussions and how we see the QCA6390 power handling based on datasheet. Reviewed-by: Krzysztof Kozlowski <krzysztof.kozlowski@linaro.org> Best regards, Krzysztof
On 18/02/2024 13:53, Dmitry Baryshkov wrote: > On Fri, 16 Feb 2024 at 22:33, Bartosz Golaszewski <brgl@bgdev.pl> wrote: >> >> From: Bartosz Golaszewski <bartosz.golaszewski@linaro.org> >> >> First, I'd like to apologize for the somewhat chaotic previous iterations >> of this series and improper versioning which was rightfully pointed out >> to me. I figured that the scope changed so much that it didn't make sense >> to consider previous submissions part of the same series as the original >> RFC but others thought otherwise so this one becomes v5 and I'll keep the >> versioning going forward. >> >> This is the summary of the work so far: >> >> v1: Original RFC: >> >> https://lore.kernel.org/lkml/20240104130123.37115-1-brgl@bgdev.pl/T/ >> >> v2: First real patch series (should have been PATCH v2) adding what I >> referred to back then as PCI power sequencing: >> >> https://lore.kernel.org/linux-arm-kernel/2024021413-grumbling-unlivable-c145@gregkh/T/ >> >> v3: RFC for the DT representation of the PMU supplying the WLAN and BT >> modules inside the QCA6391 package (was largely separate from the >> series but probably should have been called PATCH or RFC v3): >> >> https://lore.kernel.org/all/CAMRc=Mc+GNoi57eTQg71DXkQKjdaoAmCpB=h2ndEpGnmdhVV-Q@mail.gmail.com/T/ >> >> v4: Second attempt at the full series with changed scope (introduction of >> the pwrseq subsystem, should have been RFC v4) >> >> https://lore.kernel.org/lkml/20240201155532.49707-1-brgl@bgdev.pl/T/ >> >> === >> >> With that out of the way, I'd like to get down to explaining the two >> problems I'm trying to solve. >> >> Problem statement #1: Dynamic bus chicken-and-egg problem. >> >> Certain on-board PCI devices need to be powered up before they are can be >> detected but their PCI drivers won't get bound until the device is >> powered-up so enabling the relevant resources in the PCI device driver >> itself is impossible. >> >> Problem statement #2: Sharing inter-dependent resources between devices. >> >> Certain devices that use separate drivers (often on different busses) >> share resources (regulators, clocks, etc.). Typically these resources >> are reference-counted but in some cases there are additional interactions >> between them to consider, for example specific power-up sequence timings. >> >> === >> >> The reason for tackling both of these problems in a single series is the >> fact the the platform I'm working on - Qualcomm RB5 - deals with both and >> both need to be addressed in order to enable WLAN and Bluetooth support >> upstream. >> >> The on-board WLAN/BT package - QCA6391 - has a Power Management Unit that >> takes inputs from the host and exposes LDO outputs consumed by the BT and >> WLAN modules which can be powered-up and down independently. However >> a delay of 100ms must be respected between enabling the BT- and >> WLAN-enable GPIOs[*]. >> >> === >> >> This series is logically split into several sections. I'll go >> patch-by-patch and explain each step. >> >> Patch 1/18: >> >> This is a commit taken from the list by Jonathan Cameron that adds >> a __free() helper for OF nodes. Not strictly related to the series but >> until said commit ends in next, I need to carry it with this series. >> >> Patch 2/18: >> >> This enables the ath12k PCI module in arm64 defconfig as Qualcomm sm8650 >> and sm8550 reference platforms use it in the WCN7850 module. >> >> Patches 3/18-6/18: >> >> These contain all relevant DT bindings changes. We add new documents for >> the QCA6390 PMU and ATH12K devices as well as extend the bindings for the >> Qualcomm Bluetooth and ATH11K modules with regulators used by them in >> QCA6390. >> >> Patches 7/18-9/18: >> >> These contain changes to device-tree sources for the three platforms we >> work with in this series. As the WCN7850 module doesn't require any >> specific timings introducing dependencies between the Bluetooth and WLAN >> modules, while the QCA6390 does, we take two different approaches to how >> me model them in DT. >> >> For WCN7850 we hide the existence of the PMU as modeling it is simply not >> necessary. The BT and WLAN devices on the device-tree are represented as >> consuming the inputs (relevant to the functionality of each) of the PMU >> directly. > > We are describing the hardware. From the hardware point of view, there > is a PMU. I think at some point we would really like to describe all > Qualcomm/Atheros WiFI+BT units using this PMU approach, including the > older ath10k units present on RB3 (WCN3990) and db820c (QCA6174). While I agree with older WiFi+BT units, I don't think it's needed for WCN7850 since BT+WiFi are now designed to be fully independent and PMU is transparent. > >> For QCA6390 on RB5 we add the PMU node as a platform device. It consumes >> regulators and GPIOs from the host and exposed regulators consumer in turn >> by the BT and WLAN modules. This represents the internal structure of the >> package. >> >> Patches 10/18-14/18: >> >> These contain the bulk of the PCI changes for this series. We introduce >> a simple framework for powering up PCI devices before detecting them on >> the bus and the first user of this library in the form of the WCN7850 PCI >> power control driver. >> >> The general approach is as follows: PCI devices that need special >> treatment before they can be powered up, scanned and bound to their PCI >> drivers must be described on the device-tree as child nodes of the PCI >> port node. These devices will be instantiated on the platform bus. They >> will in fact be generic platform devices with the compatible of the form >> used for PCI devices already upstream ("pci<vendor ID>,<device ID">). We >> add a new directory under drivers/pci/pwrctl/ that contains PCI pwrctl >> drivers. These drivers are platform drivers that will now be matched >> against the devices instantiated from port children just like any other >> platform pairs. >> >> Both the power control platform device *AND* the associated PCI device >> reuse the same OF node and have access to the same properties. The goal >> of the platform driver is to request and bring up any required resources >> and let the pwrctl framework know that it's now OK to rescan the bus and >> detect the devices. When the device is bound, we are notified about it >> by the PCI bus notifier event and can establish a device link between the >> power control device and the PCI device so that any future extension for >> power-management will already be able to work with the correct hierachy. >> >> The reusing of the OF node is the reason for the small changes to the PCI >> OF core: as the bootloader can possibly leave the relevant regulators on >> before booting linux, the PCI device can be detected before its platform >> abstraction is probed. In this case, we find that device first and mark >> its OF node as reused. The pwrctl framework handles the opposite case >> (when the PCI device is detected only after the platform driver >> successfully enabled it). >> >> Patches 15/18-16/18: >> >> These add a relatively simple power sequencing subsystem and the first >> driver using it: the pwrseq module for the QCA6390 PMU. >> >> For the record: Bjorn suggested a different solution: a regulator driver >> that would - based on which regulators are enabled by a consumer - enable >> relevant resources (drive the enable GPIOs) while respecting the >> HW-specific delays. This would however require significant and yet >> unprecised changed to the regulator subsystem as well as be an abuse of >> the regulator provider API akin to using the reset framework for power >> sequencing as proposed before. >> >> Instead I'm proposing to add a subsystem that allows different devices to >> use a shared power sequence split into consumer-specific as well as >> common "units". >> >> A power sequence provider driver registers a set of units with pwrseq >> core. Each unit can be enabled and disabled and contains an optional list >> of other units which must be enabled before it itself can be. A unit >> represents a discreet chunk of the power sequence. >> >> It also registers a list of targets: a target is an abstraction wrapping >> a unit which allows consumers to tell pwrseq which unit they want to >> reach. Real-life example is the driver we're adding here: there's a set >> of common regulators, two PCIe-specific ones and two enable GPIOs: one >> for Bluetooth and one for WLAN. >> >> The Bluetooth driver requests a descriptor to the power sequencer and >> names the target it wants to reach: >> >> pwrseq = devm_pwrseq_get(dev, "bluetooth"); > > Is this target tied to the device or not? If not, this might become a > limitation, if somebody installs two WiFi/BT modules to a single > device. > >> The pwrseq core then knows that when the driver calls: >> >> pwrseq_power_on(pwrseq); >> >> It must enable the "bluetooth-enable" unit but it depends on the >> "regulators-common" unit so this one is enabled first. The provider >> driver is also in charge of assuring an appropriate delay between >> enabling the BT and WLAN enable GPIOs. The WLAN-specific resources are >> handled by the "wlan-enable" unit and so are not enabled until the WLAN >> driver requests the "wlan" target to be powered on. >> >> Another thing worth discussing is the way we associate the consumer with >> the relevant power sequencer. DT maintainers have expressed a discontent >> with the existing mmc pwrseq bindings and have NAKed an earlier >> initiative to introduce global pwrseq bindings to the kernel[1]. >> >> In this approach, we model the existing regulators and GPIOs in DT but >> the pwrseq subsystem requires each provider to provide a .match() >> callback. Whenever a consumer requests a power sequencer handle, we >> iterate over the list of pwrseq drivers and call .match() for each. It's >> up to the driver to verify in a platform-specific way whether it deals >> with its consumer and let the core pwrseq code know. > > This looks really nice, it will allow us to migrate the BT driver to > always use pwrseq instead of regulators without touching the DT. > >> >> The advantage of this over reusing the regulator or reset subsystem is >> that it's more generalized and can handle resources of all kinds as well >> as deal with any kind of power-on sequences: for instance, Qualcomm has >> a PCI switch they want a driver for but this switch requires enabling >> some resources first (PCI pwrctl) and then configuring the device over >> I2C (which can be handled by the pwrseq provider). >> >> Patch 17/18: >> >> This patch makes the Qualcomm Bluetooth driver get and use the power >> sequencer for QCA6390. >> >> Patch 18/18: >> >> While tiny, this patch is possibly the highlight of the entire series. >> It uses the two abstraction layers we introduced before to create an >> elegant power sequencing PCI power control driver and supports the ath11k >> module on QCA6390. >> >> With this series we can now enable BT and WLAN on several new Qualcomm >> boards upstream. >> >> I tested the series on RB5 while Neil tested it on sm8650-qrd and >> sm8550-qrd. >> >> Best Regards, >> Bartosz Golaszewski >> >> It's hard to list the changes between versions here as the scope changed >> significantly between each iteration and some versions were not even full >> series but rather RFCs for parts of the solution. For this reason, I'll >> only start listing changes starting from v6. >> >> [*] This is what the docs say. In practice it seems that this delay can be >> ignored. However the subsequent model - QCA6490 - *does* require users to >> respect it, so the problem remains valid. >> >> [1] https://lore.kernel.org/netdev/20210829131305.534417-1-dmitry.baryshkov@linaro.org/ >> >> Bartosz Golaszewski (15): >> arm64: defconfig: enable ath12k as a module >> dt-bindings: regulator: describe the PMU module of the QCA6390 package >> dt-bindings: net: bluetooth: qualcomm: describe regulators for QCA6390 >> dt-bindings: new: wireless: qcom,ath11k: describe the ath11k on >> QCA6390 >> dt-bindings: new: wireless: describe the ath12k PCI module >> arm64: dts: qcom: qrb5165-rb5: model the PMU of the QCA6391 >> PCI: hold the rescan mutex when scanning for the first time >> PCI/pwrctl: reuse the OF node for power controlled devices >> PCI/pwrctl: create platform devices for child OF nodes of the port >> node >> PCI/pwrctl: add PCI power control core code >> PCI/pwrctl: add a power control driver for WCN7850 >> power: sequencing: implement the pwrseq core >> power: pwrseq: add a driver for the QCA6390 PMU module >> Bluetooth: qca: use the power sequencer for QCA6390 >> PCI/pwrctl: add a PCI power control driver for power sequenced devices >> >> Jonathan Cameron (1): >> of: Add cleanup.h based auto release via __free(device_node) markings. >> >> Neil Armstrong (2): >> arm64: dts: qcom: sm8550-qrd: add the Wifi node >> arm64: dts: qcom: sm8650-qrd: add the Wifi node >> >> .../net/bluetooth/qualcomm-bluetooth.yaml | 17 + >> .../net/wireless/qcom,ath11k-pci.yaml | 28 + >> .../net/wireless/qcom,ath12k-pci.yaml | 103 ++ >> .../bindings/regulator/qcom,qca6390-pmu.yaml | 166 +++ >> MAINTAINERS | 8 + >> arch/arm64/boot/dts/qcom/qrb5165-rb5.dts | 123 +- >> arch/arm64/boot/dts/qcom/sm8250.dtsi | 10 + >> arch/arm64/boot/dts/qcom/sm8550-qrd.dts | 37 + >> arch/arm64/boot/dts/qcom/sm8550.dtsi | 10 + >> arch/arm64/boot/dts/qcom/sm8650-qrd.dts | 29 + >> arch/arm64/boot/dts/qcom/sm8650.dtsi | 10 + >> arch/arm64/configs/defconfig | 1 + >> drivers/bluetooth/hci_qca.c | 31 + >> drivers/pci/Kconfig | 1 + >> drivers/pci/Makefile | 1 + >> drivers/pci/bus.c | 9 +- >> drivers/pci/of.c | 14 +- >> drivers/pci/probe.c | 2 + >> drivers/pci/pwrctl/Kconfig | 25 + >> drivers/pci/pwrctl/Makefile | 7 + >> drivers/pci/pwrctl/core.c | 136 +++ >> drivers/pci/pwrctl/pci-pwrctl-pwrseq.c | 84 ++ >> drivers/pci/pwrctl/pci-pwrctl-wcn7850.c | 202 ++++ >> drivers/pci/remove.c | 2 + >> drivers/power/Kconfig | 1 + >> drivers/power/Makefile | 1 + >> drivers/power/sequencing/Kconfig | 28 + >> drivers/power/sequencing/Makefile | 6 + >> drivers/power/sequencing/core.c | 1065 +++++++++++++++++ >> drivers/power/sequencing/pwrseq-qca6390.c | 353 ++++++ >> include/linux/of.h | 2 + >> include/linux/pci-pwrctl.h | 51 + >> include/linux/pwrseq/consumer.h | 56 + >> include/linux/pwrseq/provider.h | 75 ++ >> 34 files changed, 2678 insertions(+), 16 deletions(-) >> create mode 100644 Documentation/devicetree/bindings/net/wireless/qcom,ath12k-pci.yaml >> create mode 100644 Documentation/devicetree/bindings/regulator/qcom,qca6390-pmu.yaml >> create mode 100644 drivers/pci/pwrctl/Kconfig >> create mode 100644 drivers/pci/pwrctl/Makefile >> create mode 100644 drivers/pci/pwrctl/core.c >> create mode 100644 drivers/pci/pwrctl/pci-pwrctl-pwrseq.c >> create mode 100644 drivers/pci/pwrctl/pci-pwrctl-wcn7850.c >> create mode 100644 drivers/power/sequencing/Kconfig >> create mode 100644 drivers/power/sequencing/Makefile >> create mode 100644 drivers/power/sequencing/core.c >> create mode 100644 drivers/power/sequencing/pwrseq-qca6390.c >> create mode 100644 include/linux/pci-pwrctl.h >> create mode 100644 include/linux/pwrseq/consumer.h >> create mode 100644 include/linux/pwrseq/provider.h >> >> -- >> 2.40.1 >> > >
On 16/02/2024 21:31, Bartosz Golaszewski wrote: > From: Bartosz Golaszewski <bartosz.golaszewski@linaro.org> > > First, I'd like to apologize for the somewhat chaotic previous iterations > of this series and improper versioning which was rightfully pointed out > to me. I figured that the scope changed so much that it didn't make sense > to consider previous submissions part of the same series as the original > RFC but others thought otherwise so this one becomes v5 and I'll keep the > versioning going forward. > > This is the summary of the work so far: > > v1: Original RFC: > > https://lore.kernel.org/lkml/20240104130123.37115-1-brgl@bgdev.pl/T/ > > v2: First real patch series (should have been PATCH v2) adding what I > referred to back then as PCI power sequencing: > > https://lore.kernel.org/linux-arm-kernel/2024021413-grumbling-unlivable-c145@gregkh/T/ > > v3: RFC for the DT representation of the PMU supplying the WLAN and BT > modules inside the QCA6391 package (was largely separate from the > series but probably should have been called PATCH or RFC v3): > > https://lore.kernel.org/all/CAMRc=Mc+GNoi57eTQg71DXkQKjdaoAmCpB=h2ndEpGnmdhVV-Q@mail.gmail.com/T/ > > v4: Second attempt at the full series with changed scope (introduction of > the pwrseq subsystem, should have been RFC v4) > > https://lore.kernel.org/lkml/20240201155532.49707-1-brgl@bgdev.pl/T/ > > === > > With that out of the way, I'd like to get down to explaining the two > problems I'm trying to solve. > > Problem statement #1: Dynamic bus chicken-and-egg problem. > > Certain on-board PCI devices need to be powered up before they are can be > detected but their PCI drivers won't get bound until the device is > powered-up so enabling the relevant resources in the PCI device driver > itself is impossible. > > Problem statement #2: Sharing inter-dependent resources between devices. > > Certain devices that use separate drivers (often on different busses) > share resources (regulators, clocks, etc.). Typically these resources > are reference-counted but in some cases there are additional interactions > between them to consider, for example specific power-up sequence timings. > > === > > The reason for tackling both of these problems in a single series is the > fact the the platform I'm working on - Qualcomm RB5 - deals with both and > both need to be addressed in order to enable WLAN and Bluetooth support > upstream. > > The on-board WLAN/BT package - QCA6391 - has a Power Management Unit that > takes inputs from the host and exposes LDO outputs consumed by the BT and > WLAN modules which can be powered-up and down independently. However > a delay of 100ms must be respected between enabling the BT- and > WLAN-enable GPIOs[*]. > > === > > This series is logically split into several sections. I'll go > patch-by-patch and explain each step. > > Patch 1/18: > > This is a commit taken from the list by Jonathan Cameron that adds > a __free() helper for OF nodes. Not strictly related to the series but > until said commit ends in next, I need to carry it with this series. > > Patch 2/18: > > This enables the ath12k PCI module in arm64 defconfig as Qualcomm sm8650 > and sm8550 reference platforms use it in the WCN7850 module. > > Patches 3/18-6/18: > > These contain all relevant DT bindings changes. We add new documents for > the QCA6390 PMU and ATH12K devices as well as extend the bindings for the > Qualcomm Bluetooth and ATH11K modules with regulators used by them in > QCA6390. > > Patches 7/18-9/18: > > These contain changes to device-tree sources for the three platforms we > work with in this series. As the WCN7850 module doesn't require any > specific timings introducing dependencies between the Bluetooth and WLAN > modules, while the QCA6390 does, we take two different approaches to how > me model them in DT. > > For WCN7850 we hide the existence of the PMU as modeling it is simply not > necessary. The BT and WLAN devices on the device-tree are represented as > consuming the inputs (relevant to the functionality of each) of the PMU > directly. > > For QCA6390 on RB5 we add the PMU node as a platform device. It consumes > regulators and GPIOs from the host and exposed regulators consumer in turn > by the BT and WLAN modules. This represents the internal structure of the > package. > > Patches 10/18-14/18: > > These contain the bulk of the PCI changes for this series. We introduce > a simple framework for powering up PCI devices before detecting them on > the bus and the first user of this library in the form of the WCN7850 PCI > power control driver. > > The general approach is as follows: PCI devices that need special > treatment before they can be powered up, scanned and bound to their PCI > drivers must be described on the device-tree as child nodes of the PCI > port node. These devices will be instantiated on the platform bus. They > will in fact be generic platform devices with the compatible of the form > used for PCI devices already upstream ("pci<vendor ID>,<device ID">). We > add a new directory under drivers/pci/pwrctl/ that contains PCI pwrctl > drivers. These drivers are platform drivers that will now be matched > against the devices instantiated from port children just like any other > platform pairs. > > Both the power control platform device *AND* the associated PCI device > reuse the same OF node and have access to the same properties. The goal > of the platform driver is to request and bring up any required resources > and let the pwrctl framework know that it's now OK to rescan the bus and > detect the devices. When the device is bound, we are notified about it > by the PCI bus notifier event and can establish a device link between the > power control device and the PCI device so that any future extension for > power-management will already be able to work with the correct hierachy. > > The reusing of the OF node is the reason for the small changes to the PCI > OF core: as the bootloader can possibly leave the relevant regulators on > before booting linux, the PCI device can be detected before its platform > abstraction is probed. In this case, we find that device first and mark > its OF node as reused. The pwrctl framework handles the opposite case > (when the PCI device is detected only after the platform driver > successfully enabled it). > > Patches 15/18-16/18: > > These add a relatively simple power sequencing subsystem and the first > driver using it: the pwrseq module for the QCA6390 PMU. > > For the record: Bjorn suggested a different solution: a regulator driver > that would - based on which regulators are enabled by a consumer - enable > relevant resources (drive the enable GPIOs) while respecting the > HW-specific delays. This would however require significant and yet > unprecised changed to the regulator subsystem as well as be an abuse of > the regulator provider API akin to using the reset framework for power > sequencing as proposed before. > > Instead I'm proposing to add a subsystem that allows different devices to > use a shared power sequence split into consumer-specific as well as > common "units". > > A power sequence provider driver registers a set of units with pwrseq > core. Each unit can be enabled and disabled and contains an optional list > of other units which must be enabled before it itself can be. A unit > represents a discreet chunk of the power sequence. > > It also registers a list of targets: a target is an abstraction wrapping > a unit which allows consumers to tell pwrseq which unit they want to > reach. Real-life example is the driver we're adding here: there's a set > of common regulators, two PCIe-specific ones and two enable GPIOs: one > for Bluetooth and one for WLAN. > > The Bluetooth driver requests a descriptor to the power sequencer and > names the target it wants to reach: > > pwrseq = devm_pwrseq_get(dev, "bluetooth"); > > The pwrseq core then knows that when the driver calls: > > pwrseq_power_on(pwrseq); > > It must enable the "bluetooth-enable" unit but it depends on the > "regulators-common" unit so this one is enabled first. The provider > driver is also in charge of assuring an appropriate delay between > enabling the BT and WLAN enable GPIOs. The WLAN-specific resources are > handled by the "wlan-enable" unit and so are not enabled until the WLAN > driver requests the "wlan" target to be powered on. > > Another thing worth discussing is the way we associate the consumer with > the relevant power sequencer. DT maintainers have expressed a discontent > with the existing mmc pwrseq bindings and have NAKed an earlier > initiative to introduce global pwrseq bindings to the kernel[1]. > > In this approach, we model the existing regulators and GPIOs in DT but > the pwrseq subsystem requires each provider to provide a .match() > callback. Whenever a consumer requests a power sequencer handle, we > iterate over the list of pwrseq drivers and call .match() for each. It's > up to the driver to verify in a platform-specific way whether it deals > with its consumer and let the core pwrseq code know. > > The advantage of this over reusing the regulator or reset subsystem is > that it's more generalized and can handle resources of all kinds as well > as deal with any kind of power-on sequences: for instance, Qualcomm has > a PCI switch they want a driver for but this switch requires enabling > some resources first (PCI pwrctl) and then configuring the device over > I2C (which can be handled by the pwrseq provider). > > Patch 17/18: > > This patch makes the Qualcomm Bluetooth driver get and use the power > sequencer for QCA6390. > > Patch 18/18: > > While tiny, this patch is possibly the highlight of the entire series. > It uses the two abstraction layers we introduced before to create an > elegant power sequencing PCI power control driver and supports the ath11k > module on QCA6390. > > With this series we can now enable BT and WLAN on several new Qualcomm > boards upstream. > > I tested the series on RB5 while Neil tested it on sm8650-qrd and > sm8550-qrd. > > Best Regards, > Bartosz Golaszewski > > It's hard to list the changes between versions here as the scope changed > significantly between each iteration and some versions were not even full > series but rather RFCs for parts of the solution. For this reason, I'll > only start listing changes starting from v6. > > [*] This is what the docs say. In practice it seems that this delay can be > ignored. However the subsequent model - QCA6490 - *does* require users to > respect it, so the problem remains valid. > > [1] https://lore.kernel.org/netdev/20210829131305.534417-1-dmitry.baryshkov@linaro.org/ > > Bartosz Golaszewski (15): > arm64: defconfig: enable ath12k as a module > dt-bindings: regulator: describe the PMU module of the QCA6390 package > dt-bindings: net: bluetooth: qualcomm: describe regulators for QCA6390 > dt-bindings: new: wireless: qcom,ath11k: describe the ath11k on > QCA6390 > dt-bindings: new: wireless: describe the ath12k PCI module > arm64: dts: qcom: qrb5165-rb5: model the PMU of the QCA6391 > PCI: hold the rescan mutex when scanning for the first time > PCI/pwrctl: reuse the OF node for power controlled devices > PCI/pwrctl: create platform devices for child OF nodes of the port > node > PCI/pwrctl: add PCI power control core code > PCI/pwrctl: add a power control driver for WCN7850 > power: sequencing: implement the pwrseq core > power: pwrseq: add a driver for the QCA6390 PMU module > Bluetooth: qca: use the power sequencer for QCA6390 > PCI/pwrctl: add a PCI power control driver for power sequenced devices > > Jonathan Cameron (1): > of: Add cleanup.h based auto release via __free(device_node) markings. > > Neil Armstrong (2): > arm64: dts: qcom: sm8550-qrd: add the Wifi node > arm64: dts: qcom: sm8650-qrd: add the Wifi node > > .../net/bluetooth/qualcomm-bluetooth.yaml | 17 + > .../net/wireless/qcom,ath11k-pci.yaml | 28 + > .../net/wireless/qcom,ath12k-pci.yaml | 103 ++ > .../bindings/regulator/qcom,qca6390-pmu.yaml | 166 +++ > MAINTAINERS | 8 + > arch/arm64/boot/dts/qcom/qrb5165-rb5.dts | 123 +- > arch/arm64/boot/dts/qcom/sm8250.dtsi | 10 + > arch/arm64/boot/dts/qcom/sm8550-qrd.dts | 37 + > arch/arm64/boot/dts/qcom/sm8550.dtsi | 10 + > arch/arm64/boot/dts/qcom/sm8650-qrd.dts | 29 + > arch/arm64/boot/dts/qcom/sm8650.dtsi | 10 + > arch/arm64/configs/defconfig | 1 + > drivers/bluetooth/hci_qca.c | 31 + > drivers/pci/Kconfig | 1 + > drivers/pci/Makefile | 1 + > drivers/pci/bus.c | 9 +- > drivers/pci/of.c | 14 +- > drivers/pci/probe.c | 2 + > drivers/pci/pwrctl/Kconfig | 25 + > drivers/pci/pwrctl/Makefile | 7 + > drivers/pci/pwrctl/core.c | 136 +++ > drivers/pci/pwrctl/pci-pwrctl-pwrseq.c | 84 ++ > drivers/pci/pwrctl/pci-pwrctl-wcn7850.c | 202 ++++ > drivers/pci/remove.c | 2 + > drivers/power/Kconfig | 1 + > drivers/power/Makefile | 1 + > drivers/power/sequencing/Kconfig | 28 + > drivers/power/sequencing/Makefile | 6 + > drivers/power/sequencing/core.c | 1065 +++++++++++++++++ > drivers/power/sequencing/pwrseq-qca6390.c | 353 ++++++ > include/linux/of.h | 2 + > include/linux/pci-pwrctl.h | 51 + > include/linux/pwrseq/consumer.h | 56 + > include/linux/pwrseq/provider.h | 75 ++ > 34 files changed, 2678 insertions(+), 16 deletions(-) > create mode 100644 Documentation/devicetree/bindings/net/wireless/qcom,ath12k-pci.yaml > create mode 100644 Documentation/devicetree/bindings/regulator/qcom,qca6390-pmu.yaml > create mode 100644 drivers/pci/pwrctl/Kconfig > create mode 100644 drivers/pci/pwrctl/Makefile > create mode 100644 drivers/pci/pwrctl/core.c > create mode 100644 drivers/pci/pwrctl/pci-pwrctl-pwrseq.c > create mode 100644 drivers/pci/pwrctl/pci-pwrctl-wcn7850.c > create mode 100644 drivers/power/sequencing/Kconfig > create mode 100644 drivers/power/sequencing/Makefile > create mode 100644 drivers/power/sequencing/core.c > create mode 100644 drivers/power/sequencing/pwrseq-qca6390.c > create mode 100644 include/linux/pci-pwrctl.h > create mode 100644 include/linux/pwrseq/consumer.h > create mode 100644 include/linux/pwrseq/provider.h > Tested-by: Neil Armstrong <neil.armstrong@linaro.org> # on SM8650-QRD Tested-by: Neil Armstrong <neil.armstrong@linaro.org> # on SM8550-QRD Thanks, Neil
On Mon, 19 Feb 2024 at 10:14, Neil Armstrong <neil.armstrong@linaro.org> wrote: > > On 18/02/2024 13:53, Dmitry Baryshkov wrote: > > On Fri, 16 Feb 2024 at 22:33, Bartosz Golaszewski <brgl@bgdev.pl> wrote: > >> > >> From: Bartosz Golaszewski <bartosz.golaszewski@linaro.org> > >> > >> First, I'd like to apologize for the somewhat chaotic previous iterations > >> of this series and improper versioning which was rightfully pointed out > >> to me. I figured that the scope changed so much that it didn't make sense > >> to consider previous submissions part of the same series as the original > >> RFC but others thought otherwise so this one becomes v5 and I'll keep the > >> versioning going forward. > >> > >> This is the summary of the work so far: > >> > >> v1: Original RFC: > >> > >> https://lore.kernel.org/lkml/20240104130123.37115-1-brgl@bgdev.pl/T/ > >> > >> v2: First real patch series (should have been PATCH v2) adding what I > >> referred to back then as PCI power sequencing: > >> > >> https://lore.kernel.org/linux-arm-kernel/2024021413-grumbling-unlivable-c145@gregkh/T/ > >> > >> v3: RFC for the DT representation of the PMU supplying the WLAN and BT > >> modules inside the QCA6391 package (was largely separate from the > >> series but probably should have been called PATCH or RFC v3): > >> > >> https://lore.kernel.org/all/CAMRc=Mc+GNoi57eTQg71DXkQKjdaoAmCpB=h2ndEpGnmdhVV-Q@mail.gmail.com/T/ > >> > >> v4: Second attempt at the full series with changed scope (introduction of > >> the pwrseq subsystem, should have been RFC v4) > >> > >> https://lore.kernel.org/lkml/20240201155532.49707-1-brgl@bgdev.pl/T/ > >> > >> === > >> > >> With that out of the way, I'd like to get down to explaining the two > >> problems I'm trying to solve. > >> > >> Problem statement #1: Dynamic bus chicken-and-egg problem. > >> > >> Certain on-board PCI devices need to be powered up before they are can be > >> detected but their PCI drivers won't get bound until the device is > >> powered-up so enabling the relevant resources in the PCI device driver > >> itself is impossible. > >> > >> Problem statement #2: Sharing inter-dependent resources between devices. > >> > >> Certain devices that use separate drivers (often on different busses) > >> share resources (regulators, clocks, etc.). Typically these resources > >> are reference-counted but in some cases there are additional interactions > >> between them to consider, for example specific power-up sequence timings. > >> > >> === > >> > >> The reason for tackling both of these problems in a single series is the > >> fact the the platform I'm working on - Qualcomm RB5 - deals with both and > >> both need to be addressed in order to enable WLAN and Bluetooth support > >> upstream. > >> > >> The on-board WLAN/BT package - QCA6391 - has a Power Management Unit that > >> takes inputs from the host and exposes LDO outputs consumed by the BT and > >> WLAN modules which can be powered-up and down independently. However > >> a delay of 100ms must be respected between enabling the BT- and > >> WLAN-enable GPIOs[*]. > >> > >> === > >> > >> This series is logically split into several sections. I'll go > >> patch-by-patch and explain each step. > >> > >> Patch 1/18: > >> > >> This is a commit taken from the list by Jonathan Cameron that adds > >> a __free() helper for OF nodes. Not strictly related to the series but > >> until said commit ends in next, I need to carry it with this series. > >> > >> Patch 2/18: > >> > >> This enables the ath12k PCI module in arm64 defconfig as Qualcomm sm8650 > >> and sm8550 reference platforms use it in the WCN7850 module. > >> > >> Patches 3/18-6/18: > >> > >> These contain all relevant DT bindings changes. We add new documents for > >> the QCA6390 PMU and ATH12K devices as well as extend the bindings for the > >> Qualcomm Bluetooth and ATH11K modules with regulators used by them in > >> QCA6390. > >> > >> Patches 7/18-9/18: > >> > >> These contain changes to device-tree sources for the three platforms we > >> work with in this series. As the WCN7850 module doesn't require any > >> specific timings introducing dependencies between the Bluetooth and WLAN > >> modules, while the QCA6390 does, we take two different approaches to how > >> me model them in DT. > >> > >> For WCN7850 we hide the existence of the PMU as modeling it is simply not > >> necessary. The BT and WLAN devices on the device-tree are represented as > >> consuming the inputs (relevant to the functionality of each) of the PMU > >> directly. > > > > We are describing the hardware. From the hardware point of view, there > > is a PMU. I think at some point we would really like to describe all > > Qualcomm/Atheros WiFI+BT units using this PMU approach, including the > > older ath10k units present on RB3 (WCN3990) and db820c (QCA6174). > > While I agree with older WiFi+BT units, I don't think it's needed for > WCN7850 since BT+WiFi are now designed to be fully independent and PMU is > transparent. I don't see any significant difference between WCN6750/WCN6855 and WCN7850 from the PMU / power up point of view. Could you please point me to the difference?
On 19/02/2024 10:22, Dmitry Baryshkov wrote: > On Mon, 19 Feb 2024 at 10:14, Neil Armstrong <neil.armstrong@linaro.org> wrote: >> >> On 18/02/2024 13:53, Dmitry Baryshkov wrote: >>> On Fri, 16 Feb 2024 at 22:33, Bartosz Golaszewski <brgl@bgdev.pl> wrote: >>>> >>>> From: Bartosz Golaszewski <bartosz.golaszewski@linaro.org> >>>> >>>> First, I'd like to apologize for the somewhat chaotic previous iterations >>>> of this series and improper versioning which was rightfully pointed out >>>> to me. I figured that the scope changed so much that it didn't make sense >>>> to consider previous submissions part of the same series as the original >>>> RFC but others thought otherwise so this one becomes v5 and I'll keep the >>>> versioning going forward. >>>> >>>> This is the summary of the work so far: >>>> >>>> v1: Original RFC: >>>> >>>> https://lore.kernel.org/lkml/20240104130123.37115-1-brgl@bgdev.pl/T/ >>>> >>>> v2: First real patch series (should have been PATCH v2) adding what I >>>> referred to back then as PCI power sequencing: >>>> >>>> https://lore.kernel.org/linux-arm-kernel/2024021413-grumbling-unlivable-c145@gregkh/T/ >>>> >>>> v3: RFC for the DT representation of the PMU supplying the WLAN and BT >>>> modules inside the QCA6391 package (was largely separate from the >>>> series but probably should have been called PATCH or RFC v3): >>>> >>>> https://lore.kernel.org/all/CAMRc=Mc+GNoi57eTQg71DXkQKjdaoAmCpB=h2ndEpGnmdhVV-Q@mail.gmail.com/T/ >>>> >>>> v4: Second attempt at the full series with changed scope (introduction of >>>> the pwrseq subsystem, should have been RFC v4) >>>> >>>> https://lore.kernel.org/lkml/20240201155532.49707-1-brgl@bgdev.pl/T/ >>>> >>>> === >>>> >>>> With that out of the way, I'd like to get down to explaining the two >>>> problems I'm trying to solve. >>>> >>>> Problem statement #1: Dynamic bus chicken-and-egg problem. >>>> >>>> Certain on-board PCI devices need to be powered up before they are can be >>>> detected but their PCI drivers won't get bound until the device is >>>> powered-up so enabling the relevant resources in the PCI device driver >>>> itself is impossible. >>>> >>>> Problem statement #2: Sharing inter-dependent resources between devices. >>>> >>>> Certain devices that use separate drivers (often on different busses) >>>> share resources (regulators, clocks, etc.). Typically these resources >>>> are reference-counted but in some cases there are additional interactions >>>> between them to consider, for example specific power-up sequence timings. >>>> >>>> === >>>> >>>> The reason for tackling both of these problems in a single series is the >>>> fact the the platform I'm working on - Qualcomm RB5 - deals with both and >>>> both need to be addressed in order to enable WLAN and Bluetooth support >>>> upstream. >>>> >>>> The on-board WLAN/BT package - QCA6391 - has a Power Management Unit that >>>> takes inputs from the host and exposes LDO outputs consumed by the BT and >>>> WLAN modules which can be powered-up and down independently. However >>>> a delay of 100ms must be respected between enabling the BT- and >>>> WLAN-enable GPIOs[*]. >>>> >>>> === >>>> >>>> This series is logically split into several sections. I'll go >>>> patch-by-patch and explain each step. >>>> >>>> Patch 1/18: >>>> >>>> This is a commit taken from the list by Jonathan Cameron that adds >>>> a __free() helper for OF nodes. Not strictly related to the series but >>>> until said commit ends in next, I need to carry it with this series. >>>> >>>> Patch 2/18: >>>> >>>> This enables the ath12k PCI module in arm64 defconfig as Qualcomm sm8650 >>>> and sm8550 reference platforms use it in the WCN7850 module. >>>> >>>> Patches 3/18-6/18: >>>> >>>> These contain all relevant DT bindings changes. We add new documents for >>>> the QCA6390 PMU and ATH12K devices as well as extend the bindings for the >>>> Qualcomm Bluetooth and ATH11K modules with regulators used by them in >>>> QCA6390. >>>> >>>> Patches 7/18-9/18: >>>> >>>> These contain changes to device-tree sources for the three platforms we >>>> work with in this series. As the WCN7850 module doesn't require any >>>> specific timings introducing dependencies between the Bluetooth and WLAN >>>> modules, while the QCA6390 does, we take two different approaches to how >>>> me model them in DT. >>>> >>>> For WCN7850 we hide the existence of the PMU as modeling it is simply not >>>> necessary. The BT and WLAN devices on the device-tree are represented as >>>> consuming the inputs (relevant to the functionality of each) of the PMU >>>> directly. >>> >>> We are describing the hardware. From the hardware point of view, there >>> is a PMU. I think at some point we would really like to describe all >>> Qualcomm/Atheros WiFI+BT units using this PMU approach, including the >>> older ath10k units present on RB3 (WCN3990) and db820c (QCA6174). >> >> While I agree with older WiFi+BT units, I don't think it's needed for >> WCN7850 since BT+WiFi are now designed to be fully independent and PMU is >> transparent. > > I don't see any significant difference between WCN6750/WCN6855 and > WCN7850 from the PMU / power up point of view. Could you please point > me to the difference? > The WCN7850 datasheet clearly states there's not contraint on the WLAN_EN and BT_EN ordering and the only requirement is to have all input regulators up before pulling up WLAN_EN and/or BT_EN. This makes the PMU transparent and BT and WLAN can be described as independent. Neil
On Mon, 19 Feb 2024 at 11:42, <neil.armstrong@linaro.org> wrote: > > On 19/02/2024 10:22, Dmitry Baryshkov wrote: > > On Mon, 19 Feb 2024 at 10:14, Neil Armstrong <neil.armstrong@linaro.org> wrote: > >> > >> On 18/02/2024 13:53, Dmitry Baryshkov wrote: > >>> On Fri, 16 Feb 2024 at 22:33, Bartosz Golaszewski <brgl@bgdev.pl> wrote: > >>>> > >>>> From: Bartosz Golaszewski <bartosz.golaszewski@linaro.org> > >>>> > >>>> First, I'd like to apologize for the somewhat chaotic previous iterations > >>>> of this series and improper versioning which was rightfully pointed out > >>>> to me. I figured that the scope changed so much that it didn't make sense > >>>> to consider previous submissions part of the same series as the original > >>>> RFC but others thought otherwise so this one becomes v5 and I'll keep the > >>>> versioning going forward. > >>>> > >>>> This is the summary of the work so far: > >>>> > >>>> v1: Original RFC: > >>>> > >>>> https://lore.kernel.org/lkml/20240104130123.37115-1-brgl@bgdev.pl/T/ > >>>> > >>>> v2: First real patch series (should have been PATCH v2) adding what I > >>>> referred to back then as PCI power sequencing: > >>>> > >>>> https://lore.kernel.org/linux-arm-kernel/2024021413-grumbling-unlivable-c145@gregkh/T/ > >>>> > >>>> v3: RFC for the DT representation of the PMU supplying the WLAN and BT > >>>> modules inside the QCA6391 package (was largely separate from the > >>>> series but probably should have been called PATCH or RFC v3): > >>>> > >>>> https://lore.kernel.org/all/CAMRc=Mc+GNoi57eTQg71DXkQKjdaoAmCpB=h2ndEpGnmdhVV-Q@mail.gmail.com/T/ > >>>> > >>>> v4: Second attempt at the full series with changed scope (introduction of > >>>> the pwrseq subsystem, should have been RFC v4) > >>>> > >>>> https://lore.kernel.org/lkml/20240201155532.49707-1-brgl@bgdev.pl/T/ > >>>> > >>>> === > >>>> > >>>> With that out of the way, I'd like to get down to explaining the two > >>>> problems I'm trying to solve. > >>>> > >>>> Problem statement #1: Dynamic bus chicken-and-egg problem. > >>>> > >>>> Certain on-board PCI devices need to be powered up before they are can be > >>>> detected but their PCI drivers won't get bound until the device is > >>>> powered-up so enabling the relevant resources in the PCI device driver > >>>> itself is impossible. > >>>> > >>>> Problem statement #2: Sharing inter-dependent resources between devices. > >>>> > >>>> Certain devices that use separate drivers (often on different busses) > >>>> share resources (regulators, clocks, etc.). Typically these resources > >>>> are reference-counted but in some cases there are additional interactions > >>>> between them to consider, for example specific power-up sequence timings. > >>>> > >>>> === > >>>> > >>>> The reason for tackling both of these problems in a single series is the > >>>> fact the the platform I'm working on - Qualcomm RB5 - deals with both and > >>>> both need to be addressed in order to enable WLAN and Bluetooth support > >>>> upstream. > >>>> > >>>> The on-board WLAN/BT package - QCA6391 - has a Power Management Unit that > >>>> takes inputs from the host and exposes LDO outputs consumed by the BT and > >>>> WLAN modules which can be powered-up and down independently. However > >>>> a delay of 100ms must be respected between enabling the BT- and > >>>> WLAN-enable GPIOs[*]. > >>>> > >>>> === > >>>> > >>>> This series is logically split into several sections. I'll go > >>>> patch-by-patch and explain each step. > >>>> > >>>> Patch 1/18: > >>>> > >>>> This is a commit taken from the list by Jonathan Cameron that adds > >>>> a __free() helper for OF nodes. Not strictly related to the series but > >>>> until said commit ends in next, I need to carry it with this series. > >>>> > >>>> Patch 2/18: > >>>> > >>>> This enables the ath12k PCI module in arm64 defconfig as Qualcomm sm8650 > >>>> and sm8550 reference platforms use it in the WCN7850 module. > >>>> > >>>> Patches 3/18-6/18: > >>>> > >>>> These contain all relevant DT bindings changes. We add new documents for > >>>> the QCA6390 PMU and ATH12K devices as well as extend the bindings for the > >>>> Qualcomm Bluetooth and ATH11K modules with regulators used by them in > >>>> QCA6390. > >>>> > >>>> Patches 7/18-9/18: > >>>> > >>>> These contain changes to device-tree sources for the three platforms we > >>>> work with in this series. As the WCN7850 module doesn't require any > >>>> specific timings introducing dependencies between the Bluetooth and WLAN > >>>> modules, while the QCA6390 does, we take two different approaches to how > >>>> me model them in DT. > >>>> > >>>> For WCN7850 we hide the existence of the PMU as modeling it is simply not > >>>> necessary. The BT and WLAN devices on the device-tree are represented as > >>>> consuming the inputs (relevant to the functionality of each) of the PMU > >>>> directly. > >>> > >>> We are describing the hardware. From the hardware point of view, there > >>> is a PMU. I think at some point we would really like to describe all > >>> Qualcomm/Atheros WiFI+BT units using this PMU approach, including the > >>> older ath10k units present on RB3 (WCN3990) and db820c (QCA6174). > >> > >> While I agree with older WiFi+BT units, I don't think it's needed for > >> WCN7850 since BT+WiFi are now designed to be fully independent and PMU is > >> transparent. > > > > I don't see any significant difference between WCN6750/WCN6855 and > > WCN7850 from the PMU / power up point of view. Could you please point > > me to the difference? > > > > The WCN7850 datasheet clearly states there's not contraint on the WLAN_EN > and BT_EN ordering and the only requirement is to have all input regulators > up before pulling up WLAN_EN and/or BT_EN. > > This makes the PMU transparent and BT and WLAN can be described as independent.
On Mon, Feb 19, 2024 at 11:26 AM Dmitry Baryshkov <dmitry.baryshkov@linaro.org> wrote: > [snip] > > >>>> > > >>>> For WCN7850 we hide the existence of the PMU as modeling it is simply not > > >>>> necessary. The BT and WLAN devices on the device-tree are represented as > > >>>> consuming the inputs (relevant to the functionality of each) of the PMU > > >>>> directly. > > >>> > > >>> We are describing the hardware. From the hardware point of view, there > > >>> is a PMU. I think at some point we would really like to describe all > > >>> Qualcomm/Atheros WiFI+BT units using this PMU approach, including the > > >>> older ath10k units present on RB3 (WCN3990) and db820c (QCA6174). > > >> > > >> While I agree with older WiFi+BT units, I don't think it's needed for > > >> WCN7850 since BT+WiFi are now designed to be fully independent and PMU is > > >> transparent. > > > > > > I don't see any significant difference between WCN6750/WCN6855 and > > > WCN7850 from the PMU / power up point of view. Could you please point > > > me to the difference? > > > > > > > The WCN7850 datasheet clearly states there's not contraint on the WLAN_EN > > and BT_EN ordering and the only requirement is to have all input regulators > > up before pulling up WLAN_EN and/or BT_EN. > > > > This makes the PMU transparent and BT and WLAN can be described as independent. > > From the hardware perspective, there is a PMU. It has several LDOs. So > the device tree should have the same style as the previous > generations. > My thinking was this: yes, there is a PMU but describing it has no benefit (unlike QCA6x90). If we do describe, then we'll end up having to use pwrseq here despite it not being needed because now we won't be able to just get regulators from WLAN/BT drivers directly. So I also vote for keeping it this way. Let's go into the package detail only if it's required. Bartosz
On Mon, 19 Feb 2024 at 14:23, Bartosz Golaszewski <brgl@bgdev.pl> wrote: > > On Mon, Feb 19, 2024 at 11:26 AM Dmitry Baryshkov > <dmitry.baryshkov@linaro.org> wrote: > > > > [snip] > > > > >>>> > > > >>>> For WCN7850 we hide the existence of the PMU as modeling it is simply not > > > >>>> necessary. The BT and WLAN devices on the device-tree are represented as > > > >>>> consuming the inputs (relevant to the functionality of each) of the PMU > > > >>>> directly. > > > >>> > > > >>> We are describing the hardware. From the hardware point of view, there > > > >>> is a PMU. I think at some point we would really like to describe all > > > >>> Qualcomm/Atheros WiFI+BT units using this PMU approach, including the > > > >>> older ath10k units present on RB3 (WCN3990) and db820c (QCA6174). > > > >> > > > >> While I agree with older WiFi+BT units, I don't think it's needed for > > > >> WCN7850 since BT+WiFi are now designed to be fully independent and PMU is > > > >> transparent. > > > > > > > > I don't see any significant difference between WCN6750/WCN6855 and > > > > WCN7850 from the PMU / power up point of view. Could you please point > > > > me to the difference? > > > > > > > > > > The WCN7850 datasheet clearly states there's not contraint on the WLAN_EN > > > and BT_EN ordering and the only requirement is to have all input regulators > > > up before pulling up WLAN_EN and/or BT_EN. > > > > > > This makes the PMU transparent and BT and WLAN can be described as independent. > > > > From the hardware perspective, there is a PMU. It has several LDOs. So > > the device tree should have the same style as the previous > > generations. > > > > My thinking was this: yes, there is a PMU but describing it has no > benefit (unlike QCA6x90). If we do describe, then we'll end up having > to use pwrseq here despite it not being needed because now we won't be > able to just get regulators from WLAN/BT drivers directly. > > So I also vote for keeping it this way. Let's go into the package > detail only if it's required. The WiFi / BT parts are not powered up by the board regulators. They are powered up by the PSU. So we are not describing it in the accurate way. Moreover, I think we definitely want to move BT driver to use only the pwrseq power up method. Doing it in the other way results in the code duplication and possible issues because of the regulator / pwrseq taking different code paths.
On Mon, Feb 19, 2024 at 8:32 AM Krzysztof Kozlowski <krzysztof.kozlowski@linaro.org> wrote: > > On 17/02/2024 19:32, Bartosz Golaszewski wrote: > > On Sat, Feb 17, 2024 at 4:48 PM Mark Brown <broonie@kernel.org> wrote: > >> > >> On Fri, Feb 16, 2024 at 09:32:00PM +0100, Bartosz Golaszewski wrote: > >>> From: Bartosz Golaszewski <bartosz.golaszewski@linaro.org> > >>> > >>> The QCA6390 package contains discreet modules for WLAN and Bluetooth. They > >>> are powered by the Power Management Unit (PMU) that takes inputs from the > >>> host and provides LDO outputs. This document describes this module. > >> > >> Please submit patches using subject lines reflecting the style for the > >> subsystem, this makes it easier for people to identify relevant patches. > >> Look at what existing commits in the area you're changing are doing and > >> make sure your subject lines visually resemble what they're doing. > >> There's no need to resubmit to fix this alone. > > > > Mark, > > > > This is quite vague, could you elaborate? I have no idea what is wrong > > with this patch. > > Use subject prefixes matching the subsystem. You can get them for > example with `git log --oneline -- DIRECTORY_OR_FILE` on the directory > your patch is touching. > > Best regards, > Krzysztof > Yes, I always do. And for Documentation/devicetree/bindings/regulator/ the subjects are split 50:50 between "dt-bindings: regulator: ..." and "regulator: dt-bindings: ...". For Documentation/devicetree/bindings/ it's overwhelmingly "dt-bindings: <subsystem>: ...". It's the first time someone wants me to send a DT bindings patch without "dt-bindings" coming first in the subject. I mean: I can do it alright but it's not stated anywhere explicitly. Bartosz
On 19/02/2024 13:33, Dmitry Baryshkov wrote: > On Mon, 19 Feb 2024 at 14:23, Bartosz Golaszewski <brgl@bgdev.pl> wrote: >> >> On Mon, Feb 19, 2024 at 11:26 AM Dmitry Baryshkov >> <dmitry.baryshkov@linaro.org> wrote: >>> >> >> [snip] >> >>>>>>>> >>>>>>>> For WCN7850 we hide the existence of the PMU as modeling it is simply not >>>>>>>> necessary. The BT and WLAN devices on the device-tree are represented as >>>>>>>> consuming the inputs (relevant to the functionality of each) of the PMU >>>>>>>> directly. >>>>>>> >>>>>>> We are describing the hardware. From the hardware point of view, there >>>>>>> is a PMU. I think at some point we would really like to describe all >>>>>>> Qualcomm/Atheros WiFI+BT units using this PMU approach, including the >>>>>>> older ath10k units present on RB3 (WCN3990) and db820c (QCA6174). >>>>>> >>>>>> While I agree with older WiFi+BT units, I don't think it's needed for >>>>>> WCN7850 since BT+WiFi are now designed to be fully independent and PMU is >>>>>> transparent. >>>>> >>>>> I don't see any significant difference between WCN6750/WCN6855 and >>>>> WCN7850 from the PMU / power up point of view. Could you please point >>>>> me to the difference? >>>>> >>>> >>>> The WCN7850 datasheet clearly states there's not contraint on the WLAN_EN >>>> and BT_EN ordering and the only requirement is to have all input regulators >>>> up before pulling up WLAN_EN and/or BT_EN. >>>> >>>> This makes the PMU transparent and BT and WLAN can be described as independent. >>> >>> From the hardware perspective, there is a PMU. It has several LDOs. So >>> the device tree should have the same style as the previous >>> generations. >>> >> >> My thinking was this: yes, there is a PMU but describing it has no >> benefit (unlike QCA6x90). If we do describe, then we'll end up having >> to use pwrseq here despite it not being needed because now we won't be >> able to just get regulators from WLAN/BT drivers directly. >> >> So I also vote for keeping it this way. Let's go into the package >> detail only if it's required. > > The WiFi / BT parts are not powered up by the board regulators. They > are powered up by the PSU. So we are not describing it in the accurate > way. I disagree, the WCN7850 can also be used as a discrete PCIe M.2 card, and in this situation the PCIe part is powered with the M.2 slot and the BT side is powered separately as we currently do it now. So yes there's a PMU, but it's not an always visible hardware part, from the SoC PoV, only the separate PCIe and BT subsystems are visible/controllable/powerable. Neil > > Moreover, I think we definitely want to move BT driver to use only the > pwrseq power up method. Doing it in the other way results in the code > duplication and possible issues because of the regulator / pwrseq > taking different code paths. > >
On Fri, Feb 16, 2024 at 09:32:06PM +0100, Bartosz Golaszewski wrote: > + vreg_pmu_aon_0p59: ldo1 { > + regulator-name = "vreg_pmu_aon_0p59"; > + regulator-min-microvolt = <540000>; > + regulator-max-microvolt = <840000>; > + }; That's a *very* wide voltage range for a supply that's got a name ending in _0_p59 which sounds a lot like it should be fixed at 0.59V. Similarly for a bunch of the other supplies, and I'm not seeing any evidence that the consumers do any voltage changes here? There doesn't appear to be any logic here, I'm not convinced these are validated or safe constraints.
On Mon, Feb 19, 2024 at 7:03 PM Mark Brown <broonie@kernel.org> wrote: > > On Fri, Feb 16, 2024 at 09:32:06PM +0100, Bartosz Golaszewski wrote: > > > + vreg_pmu_aon_0p59: ldo1 { > > + regulator-name = "vreg_pmu_aon_0p59"; > > + regulator-min-microvolt = <540000>; > > + regulator-max-microvolt = <840000>; > > + }; > > That's a *very* wide voltage range for a supply that's got a name ending > in _0_p59 which sounds a lot like it should be fixed at 0.59V. > Similarly for a bunch of the other supplies, and I'm not seeing any > evidence that the consumers do any voltage changes here? There doesn't > appear to be any logic here, I'm not convinced these are validated or > safe constraints. No, the users don't request any regulators (or rather: software representations thereof) because - as per the cover letter - no regulators are created by the PMU driver. This is what is physically on the board - as the schematics and the datasheet define it. I took the values from the docs verbatim. In C, we create a power sequencing provider which doesn't use the regulator framework at all. Bartosz
On Mon, Feb 19, 2024 at 07:48:20PM +0100, Bartosz Golaszewski wrote: > On Mon, Feb 19, 2024 at 7:03 PM Mark Brown <broonie@kernel.org> wrote: > > On Fri, Feb 16, 2024 at 09:32:06PM +0100, Bartosz Golaszewski wrote: > > > + vreg_pmu_aon_0p59: ldo1 { > > > + regulator-name = "vreg_pmu_aon_0p59"; > > > + regulator-min-microvolt = <540000>; > > > + regulator-max-microvolt = <840000>; > > > + }; > > That's a *very* wide voltage range for a supply that's got a name ending > > in _0_p59 which sounds a lot like it should be fixed at 0.59V. > > Similarly for a bunch of the other supplies, and I'm not seeing any > > evidence that the consumers do any voltage changes here? There doesn't > > appear to be any logic here, I'm not convinced these are validated or > > safe constraints. > No, the users don't request any regulators (or rather: software > representations thereof) because - as per the cover letter - no > regulators are created by the PMU driver. This is what is physically > on the board - as the schematics and the datasheet define it. I took The above makes no sense. How can constraints be "what is physically on the board", particularly variable constrants when there isn't even a consumer? What values are you taking from which documentation? The cover letter and binding both claimed (buried after large amounts of changelog) that these PMUs were exposing regulators to consumers and the DTS puports to do exactly that... > the values from the docs verbatim. In C, we create a power sequencing > provider which doesn't use the regulator framework at all. For something that doesn't use the regulator framework at all what appears to be a provider in patch 16 ("power: pwrseq: add a driver for the QCA6390 PMU module") seems to have a lot of regualtor API calls?
On 19/02/2024 13:53, Bartosz Golaszewski wrote: > On Mon, Feb 19, 2024 at 8:32 AM Krzysztof Kozlowski > <krzysztof.kozlowski@linaro.org> wrote: >> >> On 17/02/2024 19:32, Bartosz Golaszewski wrote: >>> On Sat, Feb 17, 2024 at 4:48 PM Mark Brown <broonie@kernel.org> wrote: >>>> >>>> On Fri, Feb 16, 2024 at 09:32:00PM +0100, Bartosz Golaszewski wrote: >>>>> From: Bartosz Golaszewski <bartosz.golaszewski@linaro.org> >>>>> >>>>> The QCA6390 package contains discreet modules for WLAN and Bluetooth. They >>>>> are powered by the Power Management Unit (PMU) that takes inputs from the >>>>> host and provides LDO outputs. This document describes this module. >>>> >>>> Please submit patches using subject lines reflecting the style for the >>>> subsystem, this makes it easier for people to identify relevant patches. >>>> Look at what existing commits in the area you're changing are doing and >>>> make sure your subject lines visually resemble what they're doing. >>>> There's no need to resubmit to fix this alone. >>> >>> Mark, >>> >>> This is quite vague, could you elaborate? I have no idea what is wrong >>> with this patch. >> >> Use subject prefixes matching the subsystem. You can get them for >> example with `git log --oneline -- DIRECTORY_OR_FILE` on the directory >> your patch is touching. >> >> Best regards, >> Krzysztof >> > > Yes, I always do. And for Documentation/devicetree/bindings/regulator/ > the subjects are split 50:50 between "dt-bindings: regulator: ..." and No, there are only ~54 "dt + regulator" ones and around 400 starting with "regulator" (Mark removes first prefix if it is not regulator:). So 50 to 400 is not 50:50. > "regulator: dt-bindings: ...". For Documentation/devicetree/bindings/ > it's overwhelmingly "dt-bindings: <subsystem>: ...". It's the first > time someone wants me to send a DT bindings patch without > "dt-bindings" coming first in the subject. > > I mean: I can do it alright but it's not stated anywhere explicitly. Well, practice was kind of known and obvious, but it is also stated: https://git.kernel.org/pub/scm/linux/kernel/git/next/linux-next.git/tree/Documentation/devicetree/bindings/submitting-patches.rst?h=next-20240219#n18 Best regards, Krzysztof
On Mon, 19 Feb 2024 at 19:18, <neil.armstrong@linaro.org> wrote: > > On 19/02/2024 13:33, Dmitry Baryshkov wrote: > > On Mon, 19 Feb 2024 at 14:23, Bartosz Golaszewski <brgl@bgdev.pl> wrote: > >> > >> On Mon, Feb 19, 2024 at 11:26 AM Dmitry Baryshkov > >> <dmitry.baryshkov@linaro.org> wrote: > >>> > >> > >> [snip] > >> > >>>>>>>> > >>>>>>>> For WCN7850 we hide the existence of the PMU as modeling it is simply not > >>>>>>>> necessary. The BT and WLAN devices on the device-tree are represented as > >>>>>>>> consuming the inputs (relevant to the functionality of each) of the PMU > >>>>>>>> directly. > >>>>>>> > >>>>>>> We are describing the hardware. From the hardware point of view, there > >>>>>>> is a PMU. I think at some point we would really like to describe all > >>>>>>> Qualcomm/Atheros WiFI+BT units using this PMU approach, including the > >>>>>>> older ath10k units present on RB3 (WCN3990) and db820c (QCA6174). > >>>>>> > >>>>>> While I agree with older WiFi+BT units, I don't think it's needed for > >>>>>> WCN7850 since BT+WiFi are now designed to be fully independent and PMU is > >>>>>> transparent. > >>>>> > >>>>> I don't see any significant difference between WCN6750/WCN6855 and > >>>>> WCN7850 from the PMU / power up point of view. Could you please point > >>>>> me to the difference? > >>>>> > >>>> > >>>> The WCN7850 datasheet clearly states there's not contraint on the WLAN_EN > >>>> and BT_EN ordering and the only requirement is to have all input regulators > >>>> up before pulling up WLAN_EN and/or BT_EN. > >>>> > >>>> This makes the PMU transparent and BT and WLAN can be described as independent. > >>> > >>> From the hardware perspective, there is a PMU. It has several LDOs. So > >>> the device tree should have the same style as the previous > >>> generations. > >>> > >> > >> My thinking was this: yes, there is a PMU but describing it has no > >> benefit (unlike QCA6x90). If we do describe, then we'll end up having > >> to use pwrseq here despite it not being needed because now we won't be > >> able to just get regulators from WLAN/BT drivers directly. > >> > >> So I also vote for keeping it this way. Let's go into the package > >> detail only if it's required. > > > > The WiFi / BT parts are not powered up by the board regulators. They > > are powered up by the PSU. So we are not describing it in the accurate > > way. > > I disagree, the WCN7850 can also be used as a discrete PCIe M.2 card, and in > this situation the PCIe part is powered with the M.2 slot and the BT side > is powered separately as we currently do it now. QCA6390 can also be used as a discrete M.2 card. > So yes there's a PMU, but it's not an always visible hardware part, from the > SoC PoV, only the separate PCIe and BT subsystems are visible/controllable/powerable.
On Mon, Feb 19, 2024 at 8:59 PM Mark Brown <broonie@kernel.org> wrote: > > On Mon, Feb 19, 2024 at 07:48:20PM +0100, Bartosz Golaszewski wrote: > > On Mon, Feb 19, 2024 at 7:03 PM Mark Brown <broonie@kernel.org> wrote: > > > On Fri, Feb 16, 2024 at 09:32:06PM +0100, Bartosz Golaszewski wrote: > > > > > + vreg_pmu_aon_0p59: ldo1 { > > > > + regulator-name = "vreg_pmu_aon_0p59"; > > > > + regulator-min-microvolt = <540000>; > > > > + regulator-max-microvolt = <840000>; > > > > + }; > > > > That's a *very* wide voltage range for a supply that's got a name ending Because it's an error, it should have been 640000. Thanks for spotting it. > > > in _0_p59 which sounds a lot like it should be fixed at 0.59V. > > > Similarly for a bunch of the other supplies, and I'm not seeing any > > > evidence that the consumers do any voltage changes here? There doesn't > > > appear to be any logic here, I'm not convinced these are validated or > > > safe constraints. > > > No, the users don't request any regulators (or rather: software > > representations thereof) because - as per the cover letter - no > > regulators are created by the PMU driver. This is what is physically > > on the board - as the schematics and the datasheet define it. I took > > The above makes no sense. How can constraints be "what is physically on > the board", particularly variable constrants when there isn't even a > consumer? What values are you taking from which documentation? > The operating conditions for PMU outputs. I took them from a confidential datasheet. There's a table for input constraints and possible output values. And what do you mean by there not being any consumers? The WLAN and BT *are* the consumers. > The cover letter and binding both claimed (buried after large amounts of > changelog) that these PMUs were exposing regulators to consumers and the > DTS puports to do exactly that... > Yes, but I'm not sure what the question is. > > the values from the docs verbatim. In C, we create a power sequencing > > provider which doesn't use the regulator framework at all. > > For something that doesn't use the regulator framework at all what > appears to be a provider in patch 16 ("power: pwrseq: add a driver for > the QCA6390 PMU module") seems to have a lot of regualtor API calls? This driver is a power sequencing *provider* but also a regulator *consumer*. It gets regulators from the host and exposes a power sequencer to *its* consumers (WLAN and BT). On DT it exposes regulators (LDO outputs of the PMU) but we don't instantiate them in C. Bart
On Tue, Feb 20, 2024 at 12:16:10PM +0100, Bartosz Golaszewski wrote: > On Mon, Feb 19, 2024 at 8:59 PM Mark Brown <broonie@kernel.org> wrote: > > On Mon, Feb 19, 2024 at 07:48:20PM +0100, Bartosz Golaszewski wrote: > > > No, the users don't request any regulators (or rather: software > > > representations thereof) because - as per the cover letter - no > > > regulators are created by the PMU driver. This is what is physically > > > on the board - as the schematics and the datasheet define it. I took > > The above makes no sense. How can constraints be "what is physically on > > the board", particularly variable constrants when there isn't even a > > consumer? What values are you taking from which documentation? > The operating conditions for PMU outputs. I took them from a > confidential datasheet. There's a table for input constraints and > possible output values. That sounds like you're just putting the maximum range of voltages that the PMU can output in there. This is a fundamental misunderstanding of what the constraints are for, the constraints exist to specify what is safe on a specific board which will in essentially all cases be much more restricted. The regulator driver should describe whatever the PMU can support by itself, the constraints whatever is actually safe and functional on the specific board. > And what do you mean by there not being any consumers? The WLAN and BT > *are* the consumers. There are no drivers that bind to the regulators and vary the voltages at runtime. > > > the values from the docs verbatim. In C, we create a power sequencing > > > provider which doesn't use the regulator framework at all. > > For something that doesn't use the regulator framework at all what > > appears to be a provider in patch 16 ("power: pwrseq: add a driver for > > the QCA6390 PMU module") seems to have a lot of regualtor API calls? > This driver is a power sequencing *provider* but also a regulator > *consumer*. It gets regulators from the host and exposes a power > sequencer to *its* consumers (WLAN and BT). On DT it exposes > regulators (LDO outputs of the PMU) but we don't instantiate them in > C. Right, which sounds a lot like being a user of the regualtor framework.
On Tue, Feb 20, 2024 at 2:31 PM Mark Brown <broonie@kernel.org> wrote: > > On Tue, Feb 20, 2024 at 12:16:10PM +0100, Bartosz Golaszewski wrote: > > On Mon, Feb 19, 2024 at 8:59 PM Mark Brown <broonie@kernel.org> wrote: > > > On Mon, Feb 19, 2024 at 07:48:20PM +0100, Bartosz Golaszewski wrote: > > > > > No, the users don't request any regulators (or rather: software > > > > representations thereof) because - as per the cover letter - no > > > > regulators are created by the PMU driver. This is what is physically > > > > on the board - as the schematics and the datasheet define it. I took > > > > The above makes no sense. How can constraints be "what is physically on > > > the board", particularly variable constrants when there isn't even a > > > consumer? What values are you taking from which documentation? > > > The operating conditions for PMU outputs. I took them from a > > confidential datasheet. There's a table for input constraints and > > possible output values. > > That sounds like you're just putting the maximum range of voltages that > the PMU can output in there. This is a fundamental misunderstanding of > what the constraints are for, the constraints exist to specify what is > safe on a specific board which will in essentially all cases be much > more restricted. The regulator driver should describe whatever the PMU > can support by itself, the constraints whatever is actually safe and > functional on the specific board. > Ok, got it. Yeah I misunderstood that, but I think it's maybe the second or third time I'm adding a regulators node myself to DT. I'll change that. > > And what do you mean by there not being any consumers? The WLAN and BT > > *are* the consumers. > > There are no drivers that bind to the regulators and vary the voltages > at runtime. > Even with the above misunderstanding clarified: so what? DT is the representation of hardware. There's nothing that obligates us to model DT sources in drivers 1:1. > > > > the values from the docs verbatim. In C, we create a power sequencing > > > > provider which doesn't use the regulator framework at all. > > > > For something that doesn't use the regulator framework at all what > > > appears to be a provider in patch 16 ("power: pwrseq: add a driver for > > > the QCA6390 PMU module") seems to have a lot of regualtor API calls? > > > This driver is a power sequencing *provider* but also a regulator > > *consumer*. It gets regulators from the host and exposes a power > > sequencer to *its* consumers (WLAN and BT). On DT it exposes > > regulators (LDO outputs of the PMU) but we don't instantiate them in > > C. > > Right, which sounds a lot like being a user of the regualtor framework. Ok, I meant "user" as a regulator provider but maybe I wasn't clear enough. Bart
On Tue, Feb 20, 2024 at 02:38:33PM +0100, Bartosz Golaszewski wrote: > On Tue, Feb 20, 2024 at 2:31 PM Mark Brown <broonie@kernel.org> wrote: > > On Tue, Feb 20, 2024 at 12:16:10PM +0100, Bartosz Golaszewski wrote: > > > And what do you mean by there not being any consumers? The WLAN and BT > > > *are* the consumers. > > There are no drivers that bind to the regulators and vary the voltages > > at runtime. > Even with the above misunderstanding clarified: so what? DT is the > representation of hardware. There's nothing that obligates us to model > DT sources in drivers 1:1. It is generally a bad sign if there is a voltage range specified on a regulator that's not got any indication that the voltage is going to be actively managed, especially in situations like with several of the supplies the DT was specifying where there are clear indications that the supply is intended to be fixed voltage (or cases where every single supply has a voltage range which would be highly unusual). Looking at the consumers might provide an explanation for such unusual and likely incorrect constraints, and the lack of any consumers in conjunction with other warning signs reenforces those warning signs.
On Tue, Feb 20, 2024 at 2:48 PM Mark Brown <broonie@kernel.org> wrote: > > On Tue, Feb 20, 2024 at 02:38:33PM +0100, Bartosz Golaszewski wrote: > > On Tue, Feb 20, 2024 at 2:31 PM Mark Brown <broonie@kernel.org> wrote: > > > On Tue, Feb 20, 2024 at 12:16:10PM +0100, Bartosz Golaszewski wrote: > > > > > And what do you mean by there not being any consumers? The WLAN and BT > > > > *are* the consumers. > > > > There are no drivers that bind to the regulators and vary the voltages > > > at runtime. > > > Even with the above misunderstanding clarified: so what? DT is the > > representation of hardware. There's nothing that obligates us to model > > DT sources in drivers 1:1. > > It is generally a bad sign if there is a voltage range specified on a > regulator that's not got any indication that the voltage is going to be > actively managed, especially in situations like with several of the > supplies the DT was specifying where there are clear indications that > the supply is intended to be fixed voltage (or cases where every single > supply has a voltage range which would be highly unusual). Looking at > the consumers might provide an explanation for such unusual and likely > incorrect constraints, and the lack of any consumers in conjunction with > other warning signs reenforces those warning signs. What do you recommend? No values at all in these regulators as it's the PMU which will manage those on its own once powered up by the host PMIC? Bartosz
On Tue, Feb 20, 2024 at 02:51:25PM +0100, Bartosz Golaszewski wrote: > On Tue, Feb 20, 2024 at 2:48 PM Mark Brown <broonie@kernel.org> wrote: > > It is generally a bad sign if there is a voltage range specified on a > > regulator that's not got any indication that the voltage is going to be > > actively managed, especially in situations like with several of the > > supplies the DT was specifying where there are clear indications that > > the supply is intended to be fixed voltage (or cases where every single > > supply has a voltage range which would be highly unusual). Looking at > > the consumers might provide an explanation for such unusual and likely > > incorrect constraints, and the lack of any consumers in conjunction with > > other warning signs reenforces those warning signs. > What do you recommend? No values at all in these regulators as it's > the PMU which will manage those on its own once powered up by the host > PMIC? Unless something is actively going to change the voltages at runtime or Linux needs to set a specific voltage (in which case minimum and maximum should be identical) there should be nothing specified.
On Tue, 20 Feb 2024 at 13:16, Bartosz Golaszewski <brgl@bgdev.pl> wrote: > > On Mon, Feb 19, 2024 at 8:59 PM Mark Brown <broonie@kernel.org> wrote: > > > > On Mon, Feb 19, 2024 at 07:48:20PM +0100, Bartosz Golaszewski wrote: > > > On Mon, Feb 19, 2024 at 7:03 PM Mark Brown <broonie@kernel.org> wrote: > > > > On Fri, Feb 16, 2024 at 09:32:06PM +0100, Bartosz Golaszewski wrote: > > > > > > > + vreg_pmu_aon_0p59: ldo1 { > > > > > + regulator-name = "vreg_pmu_aon_0p59"; > > > > > + regulator-min-microvolt = <540000>; > > > > > + regulator-max-microvolt = <840000>; > > > > > + }; > > > > > > That's a *very* wide voltage range for a supply that's got a name ending > > Because it's an error, it should have been 640000. Thanks for spotting it. According to the datasheet, VDD08_PMU_AON_O goes up to 0.85V then down to 0.59V, which is the working voltage. VDD08_PMU_RFA_CMN is normally at 0.8V, but goes to 0.4V during sleep. > > > > > in _0_p59 which sounds a lot like it should be fixed at 0.59V. > > > > Similarly for a bunch of the other supplies, and I'm not seeing any > > > > evidence that the consumers do any voltage changes here? There doesn't > > > > appear to be any logic here, I'm not convinced these are validated or > > > > safe constraints. > > > > > No, the users don't request any regulators (or rather: software > > > representations thereof) because - as per the cover letter - no > > > regulators are created by the PMU driver. This is what is physically > > > on the board - as the schematics and the datasheet define it. I took > > > > The above makes no sense. How can constraints be "what is physically on > > the board", particularly variable constrants when there isn't even a > > consumer? What values are you taking from which documentation? > > > > The operating conditions for PMU outputs. I took them from a > confidential datasheet. There's a table for input constraints and > possible output values. > > And what do you mean by there not being any consumers? The WLAN and BT > *are* the consumers. > > > The cover letter and binding both claimed (buried after large amounts of > > changelog) that these PMUs were exposing regulators to consumers and the > > DTS puports to do exactly that... > > > > Yes, but I'm not sure what the question is. > > > > the values from the docs verbatim. In C, we create a power sequencing > > > provider which doesn't use the regulator framework at all. > > > > For something that doesn't use the regulator framework at all what > > appears to be a provider in patch 16 ("power: pwrseq: add a driver for > > the QCA6390 PMU module") seems to have a lot of regualtor API calls? > > This driver is a power sequencing *provider* but also a regulator > *consumer*. It gets regulators from the host and exposes a power > sequencer to *its* consumers (WLAN and BT). On DT it exposes > regulators (LDO outputs of the PMU) but we don't instantiate them in > C. > > Bart
On Tue, Feb 20, 2024 at 5:30 PM Dmitry Baryshkov <dmitry.baryshkov@linaro.org> wrote: > > On Tue, 20 Feb 2024 at 13:16, Bartosz Golaszewski <brgl@bgdev.pl> wrote: > > > > On Mon, Feb 19, 2024 at 8:59 PM Mark Brown <broonie@kernel.org> wrote: > > > > > > On Mon, Feb 19, 2024 at 07:48:20PM +0100, Bartosz Golaszewski wrote: > > > > On Mon, Feb 19, 2024 at 7:03 PM Mark Brown <broonie@kernel.org> wrote: > > > > > On Fri, Feb 16, 2024 at 09:32:06PM +0100, Bartosz Golaszewski wrote: > > > > > > > > > + vreg_pmu_aon_0p59: ldo1 { > > > > > > + regulator-name = "vreg_pmu_aon_0p59"; > > > > > > + regulator-min-microvolt = <540000>; > > > > > > + regulator-max-microvolt = <840000>; > > > > > > + }; > > > > > > > > That's a *very* wide voltage range for a supply that's got a name ending > > > > Because it's an error, it should have been 640000. Thanks for spotting it. > > According to the datasheet, VDD08_PMU_AON_O goes up to 0.85V then down > to 0.59V, which is the working voltage. > Hmm indeed this is what figure 3.4 says but table 3-2 says the maximum is 0.64V. > VDD08_PMU_RFA_CMN is normally at 0.8V, but goes to 0.4V during sleep. > Again figure 3.4 and table 3-2 disagree unless I'm missing something. Bart [snip]
On Tue, 20 Feb 2024 at 19:53, Bartosz Golaszewski <brgl@bgdev.pl> wrote: > > On Tue, Feb 20, 2024 at 5:30 PM Dmitry Baryshkov > <dmitry.baryshkov@linaro.org> wrote: > > > > On Tue, 20 Feb 2024 at 13:16, Bartosz Golaszewski <brgl@bgdev.pl> wrote: > > > > > > On Mon, Feb 19, 2024 at 8:59 PM Mark Brown <broonie@kernel.org> wrote: > > > > > > > > On Mon, Feb 19, 2024 at 07:48:20PM +0100, Bartosz Golaszewski wrote: > > > > > On Mon, Feb 19, 2024 at 7:03 PM Mark Brown <broonie@kernel.org> wrote: > > > > > > On Fri, Feb 16, 2024 at 09:32:06PM +0100, Bartosz Golaszewski wrote: > > > > > > > > > > > + vreg_pmu_aon_0p59: ldo1 { > > > > > > > + regulator-name = "vreg_pmu_aon_0p59"; > > > > > > > + regulator-min-microvolt = <540000>; > > > > > > > + regulator-max-microvolt = <840000>; > > > > > > > + }; > > > > > > > > > > That's a *very* wide voltage range for a supply that's got a name ending > > > > > > Because it's an error, it should have been 640000. Thanks for spotting it. > > > > According to the datasheet, VDD08_PMU_AON_O goes up to 0.85V then down > > to 0.59V, which is the working voltage. > > > > Hmm indeed this is what figure 3.4 says but table 3-2 says the maximum is 0.64V. > > > VDD08_PMU_RFA_CMN is normally at 0.8V, but goes to 0.4V during sleep. > > > > Again figure 3.4 and table 3-2 disagree unless I'm missing something. I suspect that the table you have mentioned provides normal working conditions for the PMU, while power-up and sleep might be outside of 'normal' conditions. I suppose that these outputs are underspecified in the datasheet. I think we can omit the values here.
On Mon, Feb 19, 2024 at 11:21 PM Dmitry Baryshkov <dmitry.baryshkov@linaro.org> wrote: > > On Mon, 19 Feb 2024 at 19:18, <neil.armstrong@linaro.org> wrote: > > > > On 19/02/2024 13:33, Dmitry Baryshkov wrote: > > > On Mon, 19 Feb 2024 at 14:23, Bartosz Golaszewski <brgl@bgdev.pl> wrote: > > >> > > >> On Mon, Feb 19, 2024 at 11:26 AM Dmitry Baryshkov > > >> <dmitry.baryshkov@linaro.org> wrote: > > >>> > > >> > > >> [snip] > > >> > > >>>>>>>> > > >>>>>>>> For WCN7850 we hide the existence of the PMU as modeling it is simply not > > >>>>>>>> necessary. The BT and WLAN devices on the device-tree are represented as > > >>>>>>>> consuming the inputs (relevant to the functionality of each) of the PMU > > >>>>>>>> directly. > > >>>>>>> > > >>>>>>> We are describing the hardware. From the hardware point of view, there > > >>>>>>> is a PMU. I think at some point we would really like to describe all > > >>>>>>> Qualcomm/Atheros WiFI+BT units using this PMU approach, including the > > >>>>>>> older ath10k units present on RB3 (WCN3990) and db820c (QCA6174). > > >>>>>> > > >>>>>> While I agree with older WiFi+BT units, I don't think it's needed for > > >>>>>> WCN7850 since BT+WiFi are now designed to be fully independent and PMU is > > >>>>>> transparent. > > >>>>> > > >>>>> I don't see any significant difference between WCN6750/WCN6855 and > > >>>>> WCN7850 from the PMU / power up point of view. Could you please point > > >>>>> me to the difference? > > >>>>> > > >>>> > > >>>> The WCN7850 datasheet clearly states there's not contraint on the WLAN_EN > > >>>> and BT_EN ordering and the only requirement is to have all input regulators > > >>>> up before pulling up WLAN_EN and/or BT_EN. > > >>>> > > >>>> This makes the PMU transparent and BT and WLAN can be described as independent. > > >>> > > >>> From the hardware perspective, there is a PMU. It has several LDOs. So > > >>> the device tree should have the same style as the previous > > >>> generations. > > >>> > > >> > > >> My thinking was this: yes, there is a PMU but describing it has no > > >> benefit (unlike QCA6x90). If we do describe, then we'll end up having > > >> to use pwrseq here despite it not being needed because now we won't be > > >> able to just get regulators from WLAN/BT drivers directly. > > >> > > >> So I also vote for keeping it this way. Let's go into the package > > >> detail only if it's required. > > > > > > The WiFi / BT parts are not powered up by the board regulators. They > > > are powered up by the PSU. So we are not describing it in the accurate > > > way. > > > > I disagree, the WCN7850 can also be used as a discrete PCIe M.2 card, and in > > this situation the PCIe part is powered with the M.2 slot and the BT side > > is powered separately as we currently do it now. > > QCA6390 can also be used as a discrete M.2 card. > > > So yes there's a PMU, but it's not an always visible hardware part, from the > > SoC PoV, only the separate PCIe and BT subsystems are visible/controllable/powerable. > > From the hardware point: > - There is a PMU > - The PMU is connected to the board supplies > - Both WiFi and BT parts are connected to the PMU > - The BT_EN / WLAN_EN pins are not connected to the PMU > > So, not representing the PMU in the device tree is a simplification. > What about the existing WLAN and BT users of similar packages? We would have to deprecate a lot of existing bindings. I don't think it's worth it. The WCN7850 is already described in bindings as consuming what is PMUs inputs and not its outputs. Bart > > > > Neil > > > > > > > > Moreover, I think we definitely want to move BT driver to use only the > > > pwrseq power up method. Doing it in the other way results in the code > > > duplication and possible issues because of the regulator / pwrseq > > > taking different code paths. > > -- > With best wishes > Dmitry
On Thu, 22 Feb 2024 at 14:27, Bartosz Golaszewski <brgl@bgdev.pl> wrote: > > On Thu, Feb 22, 2024 at 12:27 PM Dmitry Baryshkov > <dmitry.baryshkov@linaro.org> wrote: > > > > On Thu, 22 Feb 2024 at 13:00, Bartosz Golaszewski <brgl@bgdev.pl> wrote: > > > > > > On Mon, Feb 19, 2024 at 11:21 PM Dmitry Baryshkov > > > <dmitry.baryshkov@linaro.org> wrote: > > > > > > > > On Mon, 19 Feb 2024 at 19:18, <neil.armstrong@linaro.org> wrote: > > > > > > > > > > On 19/02/2024 13:33, Dmitry Baryshkov wrote: > > > > > > On Mon, 19 Feb 2024 at 14:23, Bartosz Golaszewski <brgl@bgdev.pl> wrote: > > > > > >> > > > > > >> On Mon, Feb 19, 2024 at 11:26 AM Dmitry Baryshkov > > > > > >> <dmitry.baryshkov@linaro.org> wrote: > > > > > >>> > > > > > >> > > > > > >> [snip] > > > > > >> > > > > > >>>>>>>> > > > > > >>>>>>>> For WCN7850 we hide the existence of the PMU as modeling it is simply not > > > > > >>>>>>>> necessary. The BT and WLAN devices on the device-tree are represented as > > > > > >>>>>>>> consuming the inputs (relevant to the functionality of each) of the PMU > > > > > >>>>>>>> directly. > > > > > >>>>>>> > > > > > >>>>>>> We are describing the hardware. From the hardware point of view, there > > > > > >>>>>>> is a PMU. I think at some point we would really like to describe all > > > > > >>>>>>> Qualcomm/Atheros WiFI+BT units using this PMU approach, including the > > > > > >>>>>>> older ath10k units present on RB3 (WCN3990) and db820c (QCA6174). > > > > > >>>>>> > > > > > >>>>>> While I agree with older WiFi+BT units, I don't think it's needed for > > > > > >>>>>> WCN7850 since BT+WiFi are now designed to be fully independent and PMU is > > > > > >>>>>> transparent. > > > > > >>>>> > > > > > >>>>> I don't see any significant difference between WCN6750/WCN6855 and > > > > > >>>>> WCN7850 from the PMU / power up point of view. Could you please point > > > > > >>>>> me to the difference? > > > > > >>>>> > > > > > >>>> > > > > > >>>> The WCN7850 datasheet clearly states there's not contraint on the WLAN_EN > > > > > >>>> and BT_EN ordering and the only requirement is to have all input regulators > > > > > >>>> up before pulling up WLAN_EN and/or BT_EN. > > > > > >>>> > > > > > >>>> This makes the PMU transparent and BT and WLAN can be described as independent. > > > > > >>> > > > > > >>> From the hardware perspective, there is a PMU. It has several LDOs. So > > > > > >>> the device tree should have the same style as the previous > > > > > >>> generations. > > > > > >>> > > > > > >> > > > > > >> My thinking was this: yes, there is a PMU but describing it has no > > > > > >> benefit (unlike QCA6x90). If we do describe, then we'll end up having > > > > > >> to use pwrseq here despite it not being needed because now we won't be > > > > > >> able to just get regulators from WLAN/BT drivers directly. > > > > > >> > > > > > >> So I also vote for keeping it this way. Let's go into the package > > > > > >> detail only if it's required. > > > > > > > > > > > > The WiFi / BT parts are not powered up by the board regulators. They > > > > > > are powered up by the PSU. So we are not describing it in the accurate > > > > > > way. > > > > > > > > > > I disagree, the WCN7850 can also be used as a discrete PCIe M.2 card, and in > > > > > this situation the PCIe part is powered with the M.2 slot and the BT side > > > > > is powered separately as we currently do it now. > > > > > > > > QCA6390 can also be used as a discrete M.2 card. > > > > > > > > > So yes there's a PMU, but it's not an always visible hardware part, from the > > > > > SoC PoV, only the separate PCIe and BT subsystems are visible/controllable/powerable. > > > > > > > > From the hardware point: > > > > - There is a PMU > > > > - The PMU is connected to the board supplies > > > > - Both WiFi and BT parts are connected to the PMU > > > > - The BT_EN / WLAN_EN pins are not connected to the PMU > > > > > > > > So, not representing the PMU in the device tree is a simplification. > > > > > > > > > > What about the existing WLAN and BT users of similar packages? We > > > would have to deprecate a lot of existing bindings. I don't think it's > > > worth it. > > > > We have bindings that are not reflecting the hardware. So yes, we > > should gradually update them once the powerseq is merged. > > > > > The WCN7850 is already described in bindings as consuming what is PMUs > > > inputs and not its outputs. > > > > So do WCN6855 and QCA6391 BlueTooth parts. > > > > That is not true for the latter, this series is adding regulators for it. But the bindings exist already, so you still have to extend it, deprecating regulator-less bindings. Bartosz, I really don't understand what is the issue there. There is a PMU. As such it should be represented in the DT and it can be handled by the same driver as you are adding for QCA6390. > > Bart > > > > > > > Bart > > > > > > > > > > > > > Neil > > > > > > > > > > > > > > > > > Moreover, I think we definitely want to move BT driver to use only the > > > > > > pwrseq power up method. Doing it in the other way results in the code > > > > > > duplication and possible issues because of the regulator / pwrseq > > > > > > taking different code paths. > > > > > > > > -- > > > > With best wishes > > > > Dmitry > > > > > > > > -- > > With best wishes > > Dmitry
On 22/02/2024 13:50, Bartosz Golaszewski wrote: > On Thu, Feb 22, 2024 at 1:47 PM Dmitry Baryshkov > <dmitry.baryshkov@linaro.org> wrote: >> >> On Thu, 22 Feb 2024 at 14:27, Bartosz Golaszewski <brgl@bgdev.pl> wrote: >>> >>> On Thu, Feb 22, 2024 at 12:27 PM Dmitry Baryshkov >>> <dmitry.baryshkov@linaro.org> wrote: >>>> >>>> On Thu, 22 Feb 2024 at 13:00, Bartosz Golaszewski <brgl@bgdev.pl> wrote: >>>>> >>>>> On Mon, Feb 19, 2024 at 11:21 PM Dmitry Baryshkov >>>>> <dmitry.baryshkov@linaro.org> wrote: >>>>>> >>>>>> On Mon, 19 Feb 2024 at 19:18, <neil.armstrong@linaro.org> wrote: >>>>>>> >>>>>>> On 19/02/2024 13:33, Dmitry Baryshkov wrote: >>>>>>>> On Mon, 19 Feb 2024 at 14:23, Bartosz Golaszewski <brgl@bgdev.pl> wrote: >>>>>>>>> >>>>>>>>> On Mon, Feb 19, 2024 at 11:26 AM Dmitry Baryshkov >>>>>>>>> <dmitry.baryshkov@linaro.org> wrote: >>>>>>>>>> >>>>>>>>> >>>>>>>>> [snip] >>>>>>>>> >>>>>>>>>>>>>>> >>>>>>>>>>>>>>> For WCN7850 we hide the existence of the PMU as modeling it is simply not >>>>>>>>>>>>>>> necessary. The BT and WLAN devices on the device-tree are represented as >>>>>>>>>>>>>>> consuming the inputs (relevant to the functionality of each) of the PMU >>>>>>>>>>>>>>> directly. >>>>>>>>>>>>>> >>>>>>>>>>>>>> We are describing the hardware. From the hardware point of view, there >>>>>>>>>>>>>> is a PMU. I think at some point we would really like to describe all >>>>>>>>>>>>>> Qualcomm/Atheros WiFI+BT units using this PMU approach, including the >>>>>>>>>>>>>> older ath10k units present on RB3 (WCN3990) and db820c (QCA6174). >>>>>>>>>>>>> >>>>>>>>>>>>> While I agree with older WiFi+BT units, I don't think it's needed for >>>>>>>>>>>>> WCN7850 since BT+WiFi are now designed to be fully independent and PMU is >>>>>>>>>>>>> transparent. >>>>>>>>>>>> >>>>>>>>>>>> I don't see any significant difference between WCN6750/WCN6855 and >>>>>>>>>>>> WCN7850 from the PMU / power up point of view. Could you please point >>>>>>>>>>>> me to the difference? >>>>>>>>>>>> >>>>>>>>>>> >>>>>>>>>>> The WCN7850 datasheet clearly states there's not contraint on the WLAN_EN >>>>>>>>>>> and BT_EN ordering and the only requirement is to have all input regulators >>>>>>>>>>> up before pulling up WLAN_EN and/or BT_EN. >>>>>>>>>>> >>>>>>>>>>> This makes the PMU transparent and BT and WLAN can be described as independent. >>>>>>>>>> >>>>>>>>>> From the hardware perspective, there is a PMU. It has several LDOs. So >>>>>>>>>> the device tree should have the same style as the previous >>>>>>>>>> generations. >>>>>>>>>> >>>>>>>>> >>>>>>>>> My thinking was this: yes, there is a PMU but describing it has no >>>>>>>>> benefit (unlike QCA6x90). If we do describe, then we'll end up having >>>>>>>>> to use pwrseq here despite it not being needed because now we won't be >>>>>>>>> able to just get regulators from WLAN/BT drivers directly. >>>>>>>>> >>>>>>>>> So I also vote for keeping it this way. Let's go into the package >>>>>>>>> detail only if it's required. >>>>>>>> >>>>>>>> The WiFi / BT parts are not powered up by the board regulators. They >>>>>>>> are powered up by the PSU. So we are not describing it in the accurate >>>>>>>> way. >>>>>>> >>>>>>> I disagree, the WCN7850 can also be used as a discrete PCIe M.2 card, and in >>>>>>> this situation the PCIe part is powered with the M.2 slot and the BT side >>>>>>> is powered separately as we currently do it now. >>>>>> >>>>>> QCA6390 can also be used as a discrete M.2 card. >>>>>> >>>>>>> So yes there's a PMU, but it's not an always visible hardware part, from the >>>>>>> SoC PoV, only the separate PCIe and BT subsystems are visible/controllable/powerable. >>>>>> >>>>>> From the hardware point: >>>>>> - There is a PMU >>>>>> - The PMU is connected to the board supplies >>>>>> - Both WiFi and BT parts are connected to the PMU >>>>>> - The BT_EN / WLAN_EN pins are not connected to the PMU >>>>>> >>>>>> So, not representing the PMU in the device tree is a simplification. >>>>>> >>>>> >>>>> What about the existing WLAN and BT users of similar packages? We >>>>> would have to deprecate a lot of existing bindings. I don't think it's >>>>> worth it. >>>> >>>> We have bindings that are not reflecting the hardware. So yes, we >>>> should gradually update them once the powerseq is merged. >>>> >>>>> The WCN7850 is already described in bindings as consuming what is PMUs >>>>> inputs and not its outputs. >>>> >>>> So do WCN6855 and QCA6391 BlueTooth parts. >>>> >>> >>> That is not true for the latter, this series is adding regulators for it. >> >> But the bindings exist already, so you still have to extend it, >> deprecating regulator-less bindings. >> >> Bartosz, I really don't understand what is the issue there. There is a >> PMU. As such it should be represented in the DT and it can be handled >> by the same driver as you are adding for QCA6390. >> > > The issue is that we'll pull in the pwrseq subsystem for WCN7850 which > clearly does not require it in practice. > > I'd like to hear Krzysztof, Conor or Rob chime in here and make the > decision on how to proceed. There's like 12 emails here, so please don't just point "MR X, please read everything to find the question I want to ask", but just ask the question with short intro. We all (and I bet you as well) are way too busy to read long threads... If I got it correctly, you ask if some other, existing QCA/WCN chips should be changed to this PMU approach? If yes, then: 1. It depends whether they have the PMU, so some sort of analysis of datasheet should be done. 2. You could but you don't have to. Bindings were done, they represent the hardware more-or-less, maybe less, but still good enough. 3. It does not have to impact actual behavior of Linux. You don't have to bind entire pwrseq driver to that QCA/WCN compatible. Anyway Linux behavior is here a bit separate question - it can change, it can stay the same, up to you. Best regards, Krzysztof
On Sat, 17 Feb 2024 at 02:03, Bartosz Golaszewski <brgl@bgdev.pl> wrote: > > From: Bartosz Golaszewski <bartosz.golaszewski@linaro.org> > > First, I'd like to apologize for the somewhat chaotic previous iterations > of this series and improper versioning which was rightfully pointed out > to me. I figured that the scope changed so much that it didn't make sense > to consider previous submissions part of the same series as the original > RFC but others thought otherwise so this one becomes v5 and I'll keep the > versioning going forward. > > This is the summary of the work so far: > > v1: Original RFC: > > https://lore.kernel.org/lkml/20240104130123.37115-1-brgl@bgdev.pl/T/ > > v2: First real patch series (should have been PATCH v2) adding what I > referred to back then as PCI power sequencing: > > https://lore.kernel.org/linux-arm-kernel/2024021413-grumbling-unlivable-c145@gregkh/T/ > > v3: RFC for the DT representation of the PMU supplying the WLAN and BT > modules inside the QCA6391 package (was largely separate from the > series but probably should have been called PATCH or RFC v3): > > https://lore.kernel.org/all/CAMRc=Mc+GNoi57eTQg71DXkQKjdaoAmCpB=h2ndEpGnmdhVV-Q@mail.gmail.com/T/ > > v4: Second attempt at the full series with changed scope (introduction of > the pwrseq subsystem, should have been RFC v4) > > https://lore.kernel.org/lkml/20240201155532.49707-1-brgl@bgdev.pl/T/ > > === > > With that out of the way, I'd like to get down to explaining the two > problems I'm trying to solve. > > Problem statement #1: Dynamic bus chicken-and-egg problem. > > Certain on-board PCI devices need to be powered up before they are can be > detected but their PCI drivers won't get bound until the device is > powered-up so enabling the relevant resources in the PCI device driver > itself is impossible. > > Problem statement #2: Sharing inter-dependent resources between devices. > > Certain devices that use separate drivers (often on different busses) > share resources (regulators, clocks, etc.). Typically these resources > are reference-counted but in some cases there are additional interactions > between them to consider, for example specific power-up sequence timings. > > === > > The reason for tackling both of these problems in a single series is the > fact the the platform I'm working on - Qualcomm RB5 - deals with both and > both need to be addressed in order to enable WLAN and Bluetooth support > upstream. > > The on-board WLAN/BT package - QCA6391 - has a Power Management Unit that > takes inputs from the host and exposes LDO outputs consumed by the BT and > WLAN modules which can be powered-up and down independently. However > a delay of 100ms must be respected between enabling the BT- and > WLAN-enable GPIOs[*]. > > === > > This series is logically split into several sections. I'll go > patch-by-patch and explain each step. > > Patch 1/18: > > This is a commit taken from the list by Jonathan Cameron that adds > a __free() helper for OF nodes. Not strictly related to the series but > until said commit ends in next, I need to carry it with this series. > > Patch 2/18: > > This enables the ath12k PCI module in arm64 defconfig as Qualcomm sm8650 > and sm8550 reference platforms use it in the WCN7850 module. > > Patches 3/18-6/18: > > These contain all relevant DT bindings changes. We add new documents for > the QCA6390 PMU and ATH12K devices as well as extend the bindings for the > Qualcomm Bluetooth and ATH11K modules with regulators used by them in > QCA6390. > > Patches 7/18-9/18: > > These contain changes to device-tree sources for the three platforms we > work with in this series. As the WCN7850 module doesn't require any > specific timings introducing dependencies between the Bluetooth and WLAN > modules, while the QCA6390 does, we take two different approaches to how > me model them in DT. > > For WCN7850 we hide the existence of the PMU as modeling it is simply not > necessary. The BT and WLAN devices on the device-tree are represented as > consuming the inputs (relevant to the functionality of each) of the PMU > directly. > > For QCA6390 on RB5 we add the PMU node as a platform device. It consumes > regulators and GPIOs from the host and exposed regulators consumer in turn > by the BT and WLAN modules. This represents the internal structure of the > package. > > Patches 10/18-14/18: > > These contain the bulk of the PCI changes for this series. We introduce > a simple framework for powering up PCI devices before detecting them on > the bus and the first user of this library in the form of the WCN7850 PCI > power control driver. > > The general approach is as follows: PCI devices that need special > treatment before they can be powered up, scanned and bound to their PCI > drivers must be described on the device-tree as child nodes of the PCI > port node. These devices will be instantiated on the platform bus. They > will in fact be generic platform devices with the compatible of the form > used for PCI devices already upstream ("pci<vendor ID>,<device ID">). We > add a new directory under drivers/pci/pwrctl/ that contains PCI pwrctl > drivers. These drivers are platform drivers that will now be matched > against the devices instantiated from port children just like any other > platform pairs. > > Both the power control platform device *AND* the associated PCI device > reuse the same OF node and have access to the same properties. The goal > of the platform driver is to request and bring up any required resources > and let the pwrctl framework know that it's now OK to rescan the bus and > detect the devices. When the device is bound, we are notified about it > by the PCI bus notifier event and can establish a device link between the > power control device and the PCI device so that any future extension for > power-management will already be able to work with the correct hierachy. > > The reusing of the OF node is the reason for the small changes to the PCI > OF core: as the bootloader can possibly leave the relevant regulators on > before booting linux, the PCI device can be detected before its platform > abstraction is probed. In this case, we find that device first and mark > its OF node as reused. The pwrctl framework handles the opposite case > (when the PCI device is detected only after the platform driver > successfully enabled it). > > Patches 15/18-16/18: > > These add a relatively simple power sequencing subsystem and the first > driver using it: the pwrseq module for the QCA6390 PMU. > > For the record: Bjorn suggested a different solution: a regulator driver > that would - based on which regulators are enabled by a consumer - enable > relevant resources (drive the enable GPIOs) while respecting the > HW-specific delays. This would however require significant and yet > unprecised changed to the regulator subsystem as well as be an abuse of > the regulator provider API akin to using the reset framework for power > sequencing as proposed before. > > Instead I'm proposing to add a subsystem that allows different devices to > use a shared power sequence split into consumer-specific as well as > common "units". > > A power sequence provider driver registers a set of units with pwrseq > core. Each unit can be enabled and disabled and contains an optional list > of other units which must be enabled before it itself can be. A unit > represents a discreet chunk of the power sequence. > > It also registers a list of targets: a target is an abstraction wrapping > a unit which allows consumers to tell pwrseq which unit they want to > reach. Real-life example is the driver we're adding here: there's a set > of common regulators, two PCIe-specific ones and two enable GPIOs: one > for Bluetooth and one for WLAN. > > The Bluetooth driver requests a descriptor to the power sequencer and > names the target it wants to reach: > > pwrseq = devm_pwrseq_get(dev, "bluetooth"); > > The pwrseq core then knows that when the driver calls: > > pwrseq_power_on(pwrseq); > > It must enable the "bluetooth-enable" unit but it depends on the > "regulators-common" unit so this one is enabled first. The provider > driver is also in charge of assuring an appropriate delay between > enabling the BT and WLAN enable GPIOs. The WLAN-specific resources are > handled by the "wlan-enable" unit and so are not enabled until the WLAN > driver requests the "wlan" target to be powered on. > > Another thing worth discussing is the way we associate the consumer with > the relevant power sequencer. DT maintainers have expressed a discontent > with the existing mmc pwrseq bindings and have NAKed an earlier > initiative to introduce global pwrseq bindings to the kernel[1]. > > In this approach, we model the existing regulators and GPIOs in DT but > the pwrseq subsystem requires each provider to provide a .match() > callback. Whenever a consumer requests a power sequencer handle, we > iterate over the list of pwrseq drivers and call .match() for each. It's > up to the driver to verify in a platform-specific way whether it deals > with its consumer and let the core pwrseq code know. > > The advantage of this over reusing the regulator or reset subsystem is > that it's more generalized and can handle resources of all kinds as well > as deal with any kind of power-on sequences: for instance, Qualcomm has > a PCI switch they want a driver for but this switch requires enabling > some resources first (PCI pwrctl) and then configuring the device over > I2C (which can be handled by the pwrseq provider). > > Patch 17/18: > > This patch makes the Qualcomm Bluetooth driver get and use the power > sequencer for QCA6390. > > Patch 18/18: > > While tiny, this patch is possibly the highlight of the entire series. > It uses the two abstraction layers we introduced before to create an > elegant power sequencing PCI power control driver and supports the ath11k > module on QCA6390. > > With this series we can now enable BT and WLAN on several new Qualcomm > boards upstream. > > I tested the series on RB5 while Neil tested it on sm8650-qrd and > sm8550-qrd. Tested-by: Amit Pundir <amit.pundir@linaro.org> # On RB5 running AOSP > > Best Regards, > Bartosz Golaszewski > > It's hard to list the changes between versions here as the scope changed > significantly between each iteration and some versions were not even full > series but rather RFCs for parts of the solution. For this reason, I'll > only start listing changes starting from v6. > > [*] This is what the docs say. In practice it seems that this delay can be > ignored. However the subsequent model - QCA6490 - *does* require users to > respect it, so the problem remains valid. > > [1] https://lore.kernel.org/netdev/20210829131305.534417-1-dmitry.baryshkov@linaro.org/ > > Bartosz Golaszewski (15): > arm64: defconfig: enable ath12k as a module > dt-bindings: regulator: describe the PMU module of the QCA6390 package > dt-bindings: net: bluetooth: qualcomm: describe regulators for QCA6390 > dt-bindings: new: wireless: qcom,ath11k: describe the ath11k on > QCA6390 > dt-bindings: new: wireless: describe the ath12k PCI module > arm64: dts: qcom: qrb5165-rb5: model the PMU of the QCA6391 > PCI: hold the rescan mutex when scanning for the first time > PCI/pwrctl: reuse the OF node for power controlled devices > PCI/pwrctl: create platform devices for child OF nodes of the port > node > PCI/pwrctl: add PCI power control core code > PCI/pwrctl: add a power control driver for WCN7850 > power: sequencing: implement the pwrseq core > power: pwrseq: add a driver for the QCA6390 PMU module > Bluetooth: qca: use the power sequencer for QCA6390 > PCI/pwrctl: add a PCI power control driver for power sequenced devices > > Jonathan Cameron (1): > of: Add cleanup.h based auto release via __free(device_node) markings. > > Neil Armstrong (2): > arm64: dts: qcom: sm8550-qrd: add the Wifi node > arm64: dts: qcom: sm8650-qrd: add the Wifi node > > .../net/bluetooth/qualcomm-bluetooth.yaml | 17 + > .../net/wireless/qcom,ath11k-pci.yaml | 28 + > .../net/wireless/qcom,ath12k-pci.yaml | 103 ++ > .../bindings/regulator/qcom,qca6390-pmu.yaml | 166 +++ > MAINTAINERS | 8 + > arch/arm64/boot/dts/qcom/qrb5165-rb5.dts | 123 +- > arch/arm64/boot/dts/qcom/sm8250.dtsi | 10 + > arch/arm64/boot/dts/qcom/sm8550-qrd.dts | 37 + > arch/arm64/boot/dts/qcom/sm8550.dtsi | 10 + > arch/arm64/boot/dts/qcom/sm8650-qrd.dts | 29 + > arch/arm64/boot/dts/qcom/sm8650.dtsi | 10 + > arch/arm64/configs/defconfig | 1 + > drivers/bluetooth/hci_qca.c | 31 + > drivers/pci/Kconfig | 1 + > drivers/pci/Makefile | 1 + > drivers/pci/bus.c | 9 +- > drivers/pci/of.c | 14 +- > drivers/pci/probe.c | 2 + > drivers/pci/pwrctl/Kconfig | 25 + > drivers/pci/pwrctl/Makefile | 7 + > drivers/pci/pwrctl/core.c | 136 +++ > drivers/pci/pwrctl/pci-pwrctl-pwrseq.c | 84 ++ > drivers/pci/pwrctl/pci-pwrctl-wcn7850.c | 202 ++++ > drivers/pci/remove.c | 2 + > drivers/power/Kconfig | 1 + > drivers/power/Makefile | 1 + > drivers/power/sequencing/Kconfig | 28 + > drivers/power/sequencing/Makefile | 6 + > drivers/power/sequencing/core.c | 1065 +++++++++++++++++ > drivers/power/sequencing/pwrseq-qca6390.c | 353 ++++++ > include/linux/of.h | 2 + > include/linux/pci-pwrctl.h | 51 + > include/linux/pwrseq/consumer.h | 56 + > include/linux/pwrseq/provider.h | 75 ++ > 34 files changed, 2678 insertions(+), 16 deletions(-) > create mode 100644 Documentation/devicetree/bindings/net/wireless/qcom,ath12k-pci.yaml > create mode 100644 Documentation/devicetree/bindings/regulator/qcom,qca6390-pmu.yaml > create mode 100644 drivers/pci/pwrctl/Kconfig > create mode 100644 drivers/pci/pwrctl/Makefile > create mode 100644 drivers/pci/pwrctl/core.c > create mode 100644 drivers/pci/pwrctl/pci-pwrctl-pwrseq.c > create mode 100644 drivers/pci/pwrctl/pci-pwrctl-wcn7850.c > create mode 100644 drivers/power/sequencing/Kconfig > create mode 100644 drivers/power/sequencing/Makefile > create mode 100644 drivers/power/sequencing/core.c > create mode 100644 drivers/power/sequencing/pwrseq-qca6390.c > create mode 100644 include/linux/pci-pwrctl.h > create mode 100644 include/linux/pwrseq/consumer.h > create mode 100644 include/linux/pwrseq/provider.h > > -- > 2.40.1 > >
From: Bartosz Golaszewski <bartosz.golaszewski@linaro.org> First, I'd like to apologize for the somewhat chaotic previous iterations of this series and improper versioning which was rightfully pointed out to me. I figured that the scope changed so much that it didn't make sense to consider previous submissions part of the same series as the original RFC but others thought otherwise so this one becomes v5 and I'll keep the versioning going forward. This is the summary of the work so far: v1: Original RFC: https://lore.kernel.org/lkml/20240104130123.37115-1-brgl@bgdev.pl/T/ v2: First real patch series (should have been PATCH v2) adding what I referred to back then as PCI power sequencing: https://lore.kernel.org/linux-arm-kernel/2024021413-grumbling-unlivable-c145@gregkh/T/ v3: RFC for the DT representation of the PMU supplying the WLAN and BT modules inside the QCA6391 package (was largely separate from the series but probably should have been called PATCH or RFC v3): https://lore.kernel.org/all/CAMRc=Mc+GNoi57eTQg71DXkQKjdaoAmCpB=h2ndEpGnmdhVV-Q@mail.gmail.com/T/ v4: Second attempt at the full series with changed scope (introduction of the pwrseq subsystem, should have been RFC v4) https://lore.kernel.org/lkml/20240201155532.49707-1-brgl@bgdev.pl/T/ === With that out of the way, I'd like to get down to explaining the two problems I'm trying to solve. Problem statement #1: Dynamic bus chicken-and-egg problem. Certain on-board PCI devices need to be powered up before they are can be detected but their PCI drivers won't get bound until the device is powered-up so enabling the relevant resources in the PCI device driver itself is impossible. Problem statement #2: Sharing inter-dependent resources between devices. Certain devices that use separate drivers (often on different busses) share resources (regulators, clocks, etc.). Typically these resources are reference-counted but in some cases there are additional interactions between them to consider, for example specific power-up sequence timings. === The reason for tackling both of these problems in a single series is the fact the the platform I'm working on - Qualcomm RB5 - deals with both and both need to be addressed in order to enable WLAN and Bluetooth support upstream. The on-board WLAN/BT package - QCA6391 - has a Power Management Unit that takes inputs from the host and exposes LDO outputs consumed by the BT and WLAN modules which can be powered-up and down independently. However a delay of 100ms must be respected between enabling the BT- and WLAN-enable GPIOs[*]. === This series is logically split into several sections. I'll go patch-by-patch and explain each step. Patch 1/18: This is a commit taken from the list by Jonathan Cameron that adds a __free() helper for OF nodes. Not strictly related to the series but until said commit ends in next, I need to carry it with this series. Patch 2/18: This enables the ath12k PCI module in arm64 defconfig as Qualcomm sm8650 and sm8550 reference platforms use it in the WCN7850 module. Patches 3/18-6/18: These contain all relevant DT bindings changes. We add new documents for the QCA6390 PMU and ATH12K devices as well as extend the bindings for the Qualcomm Bluetooth and ATH11K modules with regulators used by them in QCA6390. Patches 7/18-9/18: These contain changes to device-tree sources for the three platforms we work with in this series. As the WCN7850 module doesn't require any specific timings introducing dependencies between the Bluetooth and WLAN modules, while the QCA6390 does, we take two different approaches to how me model them in DT. For WCN7850 we hide the existence of the PMU as modeling it is simply not necessary. The BT and WLAN devices on the device-tree are represented as consuming the inputs (relevant to the functionality of each) of the PMU directly. For QCA6390 on RB5 we add the PMU node as a platform device. It consumes regulators and GPIOs from the host and exposed regulators consumer in turn by the BT and WLAN modules. This represents the internal structure of the package. Patches 10/18-14/18: These contain the bulk of the PCI changes for this series. We introduce a simple framework for powering up PCI devices before detecting them on the bus and the first user of this library in the form of the WCN7850 PCI power control driver. The general approach is as follows: PCI devices that need special treatment before they can be powered up, scanned and bound to their PCI drivers must be described on the device-tree as child nodes of the PCI port node. These devices will be instantiated on the platform bus. They will in fact be generic platform devices with the compatible of the form used for PCI devices already upstream ("pci<vendor ID>,<device ID">). We add a new directory under drivers/pci/pwrctl/ that contains PCI pwrctl drivers. These drivers are platform drivers that will now be matched against the devices instantiated from port children just like any other platform pairs. Both the power control platform device *AND* the associated PCI device reuse the same OF node and have access to the same properties. The goal of the platform driver is to request and bring up any required resources and let the pwrctl framework know that it's now OK to rescan the bus and detect the devices. When the device is bound, we are notified about it by the PCI bus notifier event and can establish a device link between the power control device and the PCI device so that any future extension for power-management will already be able to work with the correct hierachy. The reusing of the OF node is the reason for the small changes to the PCI OF core: as the bootloader can possibly leave the relevant regulators on before booting linux, the PCI device can be detected before its platform abstraction is probed. In this case, we find that device first and mark its OF node as reused. The pwrctl framework handles the opposite case (when the PCI device is detected only after the platform driver successfully enabled it). Patches 15/18-16/18: These add a relatively simple power sequencing subsystem and the first driver using it: the pwrseq module for the QCA6390 PMU. For the record: Bjorn suggested a different solution: a regulator driver that would - based on which regulators are enabled by a consumer - enable relevant resources (drive the enable GPIOs) while respecting the HW-specific delays. This would however require significant and yet unprecised changed to the regulator subsystem as well as be an abuse of the regulator provider API akin to using the reset framework for power sequencing as proposed before. Instead I'm proposing to add a subsystem that allows different devices to use a shared power sequence split into consumer-specific as well as common "units". A power sequence provider driver registers a set of units with pwrseq core. Each unit can be enabled and disabled and contains an optional list of other units which must be enabled before it itself can be. A unit represents a discreet chunk of the power sequence. It also registers a list of targets: a target is an abstraction wrapping a unit which allows consumers to tell pwrseq which unit they want to reach. Real-life example is the driver we're adding here: there's a set of common regulators, two PCIe-specific ones and two enable GPIOs: one for Bluetooth and one for WLAN. The Bluetooth driver requests a descriptor to the power sequencer and names the target it wants to reach: pwrseq = devm_pwrseq_get(dev, "bluetooth"); The pwrseq core then knows that when the driver calls: pwrseq_power_on(pwrseq); It must enable the "bluetooth-enable" unit but it depends on the "regulators-common" unit so this one is enabled first. The provider driver is also in charge of assuring an appropriate delay between enabling the BT and WLAN enable GPIOs. The WLAN-specific resources are handled by the "wlan-enable" unit and so are not enabled until the WLAN driver requests the "wlan" target to be powered on. Another thing worth discussing is the way we associate the consumer with the relevant power sequencer. DT maintainers have expressed a discontent with the existing mmc pwrseq bindings and have NAKed an earlier initiative to introduce global pwrseq bindings to the kernel[1]. In this approach, we model the existing regulators and GPIOs in DT but the pwrseq subsystem requires each provider to provide a .match() callback. Whenever a consumer requests a power sequencer handle, we iterate over the list of pwrseq drivers and call .match() for each. It's up to the driver to verify in a platform-specific way whether it deals with its consumer and let the core pwrseq code know. The advantage of this over reusing the regulator or reset subsystem is that it's more generalized and can handle resources of all kinds as well as deal with any kind of power-on sequences: for instance, Qualcomm has a PCI switch they want a driver for but this switch requires enabling some resources first (PCI pwrctl) and then configuring the device over I2C (which can be handled by the pwrseq provider). Patch 17/18: This patch makes the Qualcomm Bluetooth driver get and use the power sequencer for QCA6390. Patch 18/18: While tiny, this patch is possibly the highlight of the entire series. It uses the two abstraction layers we introduced before to create an elegant power sequencing PCI power control driver and supports the ath11k module on QCA6390. With this series we can now enable BT and WLAN on several new Qualcomm boards upstream. I tested the series on RB5 while Neil tested it on sm8650-qrd and sm8550-qrd. Best Regards, Bartosz Golaszewski It's hard to list the changes between versions here as the scope changed significantly between each iteration and some versions were not even full series but rather RFCs for parts of the solution. For this reason, I'll only start listing changes starting from v6. [*] This is what the docs say. In practice it seems that this delay can be ignored. However the subsequent model - QCA6490 - *does* require users to respect it, so the problem remains valid. [1] https://lore.kernel.org/netdev/20210829131305.534417-1-dmitry.baryshkov@linaro.org/ Bartosz Golaszewski (15): arm64: defconfig: enable ath12k as a module dt-bindings: regulator: describe the PMU module of the QCA6390 package dt-bindings: net: bluetooth: qualcomm: describe regulators for QCA6390 dt-bindings: new: wireless: qcom,ath11k: describe the ath11k on QCA6390 dt-bindings: new: wireless: describe the ath12k PCI module arm64: dts: qcom: qrb5165-rb5: model the PMU of the QCA6391 PCI: hold the rescan mutex when scanning for the first time PCI/pwrctl: reuse the OF node for power controlled devices PCI/pwrctl: create platform devices for child OF nodes of the port node PCI/pwrctl: add PCI power control core code PCI/pwrctl: add a power control driver for WCN7850 power: sequencing: implement the pwrseq core power: pwrseq: add a driver for the QCA6390 PMU module Bluetooth: qca: use the power sequencer for QCA6390 PCI/pwrctl: add a PCI power control driver for power sequenced devices Jonathan Cameron (1): of: Add cleanup.h based auto release via __free(device_node) markings. Neil Armstrong (2): arm64: dts: qcom: sm8550-qrd: add the Wifi node arm64: dts: qcom: sm8650-qrd: add the Wifi node .../net/bluetooth/qualcomm-bluetooth.yaml | 17 + .../net/wireless/qcom,ath11k-pci.yaml | 28 + .../net/wireless/qcom,ath12k-pci.yaml | 103 ++ .../bindings/regulator/qcom,qca6390-pmu.yaml | 166 +++ MAINTAINERS | 8 + arch/arm64/boot/dts/qcom/qrb5165-rb5.dts | 123 +- arch/arm64/boot/dts/qcom/sm8250.dtsi | 10 + arch/arm64/boot/dts/qcom/sm8550-qrd.dts | 37 + arch/arm64/boot/dts/qcom/sm8550.dtsi | 10 + arch/arm64/boot/dts/qcom/sm8650-qrd.dts | 29 + arch/arm64/boot/dts/qcom/sm8650.dtsi | 10 + arch/arm64/configs/defconfig | 1 + drivers/bluetooth/hci_qca.c | 31 + drivers/pci/Kconfig | 1 + drivers/pci/Makefile | 1 + drivers/pci/bus.c | 9 +- drivers/pci/of.c | 14 +- drivers/pci/probe.c | 2 + drivers/pci/pwrctl/Kconfig | 25 + drivers/pci/pwrctl/Makefile | 7 + drivers/pci/pwrctl/core.c | 136 +++ drivers/pci/pwrctl/pci-pwrctl-pwrseq.c | 84 ++ drivers/pci/pwrctl/pci-pwrctl-wcn7850.c | 202 ++++ drivers/pci/remove.c | 2 + drivers/power/Kconfig | 1 + drivers/power/Makefile | 1 + drivers/power/sequencing/Kconfig | 28 + drivers/power/sequencing/Makefile | 6 + drivers/power/sequencing/core.c | 1065 +++++++++++++++++ drivers/power/sequencing/pwrseq-qca6390.c | 353 ++++++ include/linux/of.h | 2 + include/linux/pci-pwrctl.h | 51 + include/linux/pwrseq/consumer.h | 56 + include/linux/pwrseq/provider.h | 75 ++ 34 files changed, 2678 insertions(+), 16 deletions(-) create mode 100644 Documentation/devicetree/bindings/net/wireless/qcom,ath12k-pci.yaml create mode 100644 Documentation/devicetree/bindings/regulator/qcom,qca6390-pmu.yaml create mode 100644 drivers/pci/pwrctl/Kconfig create mode 100644 drivers/pci/pwrctl/Makefile create mode 100644 drivers/pci/pwrctl/core.c create mode 100644 drivers/pci/pwrctl/pci-pwrctl-pwrseq.c create mode 100644 drivers/pci/pwrctl/pci-pwrctl-wcn7850.c create mode 100644 drivers/power/sequencing/Kconfig create mode 100644 drivers/power/sequencing/Makefile create mode 100644 drivers/power/sequencing/core.c create mode 100644 drivers/power/sequencing/pwrseq-qca6390.c create mode 100644 include/linux/pci-pwrctl.h create mode 100644 include/linux/pwrseq/consumer.h create mode 100644 include/linux/pwrseq/provider.h