From: Andy Shevchenko <andriy.shevchenko@intel.com>
To: Mark Hasemeyer <markhas@chromium.org>
Cc: LKML <linux-kernel@vger.kernel.org>,
AngeloGioacchino Del Regno
<angelogioacchino.delregno@collabora.com>,
Krzysztof Kozlowski <krzysztof.kozlowski@linaro.org>,
Tzung-Bi Shih <tzungbi@kernel.org>,
Raul Rangel <rrangel@chromium.org>,
Konrad Dybcio <konrad.dybcio@linaro.org>,
Rob Herring <robh@kernel.org>,
Sudeep Holla <sudeep.holla@arm.com>,
Benson Leung <bleung@chromium.org>,
Bhanu Prakash Maiya <bhanumaiya@chromium.org>,
Chen-Yu Tsai <wenst@chromium.org>,
Guenter Roeck <groeck@chromium.org>, Lee Jones <lee@kernel.org>,
Prashant Malani <pmalani@chromium.org>,
Rob Barnes <robbarnes@google.com>,
Stephen Boyd <swboyd@chromium.org>,
chrome-platform@lists.linux.dev
Subject: Re: [PATCH v2 22/22] platform/chrome: cros_ec: Use PM subsystem to manage wakeirq
Date: Thu, 21 Dec 2023 17:45:16 +0200 [thread overview]
Message-ID: <ZYRdjHVgES1odZAQ@smile.fi.intel.com> (raw)
In-Reply-To: <20231220165423.v2.22.Ieee574a0e94fbaae01fd6883ffe2ceeb98d7df28@changeid>
On Wed, Dec 20, 2023 at 04:54:36PM -0700, Mark Hasemeyer wrote:
> The cros ec driver is manually managing the wake IRQ by calling
> enable_irq_wake()/disable_irq_wake() during suspend/resume.
>
> Modify the driver to use the power management subsystem to manage the
> wakeirq.
>
> Rather than assuming that the IRQ is wake capable, use the underlying
> firmware/device tree to determine whether or not to enable it as a wake
> source. Some Chromebooks rely solely on the ec_sync pin to wake the AP
> but do not specify the interrupt as wake capable in the ACPI _CRS. For
> LPC/ACPI based systems a DMI quirk is introduced listing boards whose
> firmware should not be trusted to provide correct wake capable values.
> For device tree base systems, it is not an issue as the relevant device
> tree entries have been updated and DTS is built from source for each
> ChromeOS update.
>
> The IRQ wake logic was added on an interface basis (lpc, spi, uart) as
> opposed to adding it to cros_ec.c because the i2c subsystem already
> enables the wakirq (if applicable) on our behalf.
...
> +static const struct dmi_system_id untrusted_fw_irq_wake_capable[] = {
> + {
> + .ident = "Brya",
> + .matches = {
> + DMI_MATCH(DMI_PRODUCT_FAMILY, "Google_Brya")
> + }
Leave trailing comma.
> + },
> + {
> + .ident = "Brask",
> + .matches = {
> + DMI_MATCH(DMI_PRODUCT_FAMILY, "Google_Brask")
> + }
Ditto.
It will reduce a churn in the future if adding more fields here.
> + },
> + { }
> +}
...
> +static bool cros_ec_should_force_irq_wake_capable(void)
> +{
> + return dmi_first_match(untrusted_fw_irq_wake_capable) != NULL;
' != NULL' is redundant.
> +}
...
> struct device *dev = &pdev->dev;
> + bool irq_wake = false;
Why not put this...
> struct acpi_device *adev;
> acpi_status status;
> struct cros_ec_device *ec_dev;
> + struct resource irqres;
...here?
> u8 buf[2] = {};
> int irq, ret;
...
> + irq = platform_get_irq_resource_optional(pdev, 0, &irqres);
> + if (irq > 0) {
> ec_dev->irq = irq;
> - else if (irq != -ENXIO) {
> + if (cros_ec_should_force_irq_wake_capable())
> + irq_wake = true;
> + else
> + irq_wake = irqres.flags & IORESOURCE_IRQ_WAKECAPABLE;
> + dev_dbg(dev, "IRQ: %i, wake_capable: %i\n", irq, irq_wake);
> + } else if (irq != -ENXIO) {
> dev_err(dev, "couldn't retrieve IRQ number (%d)\n", irq);
> return irq;
> }
Yeah, this is confusing now. Which one should I trust more: irq or irqres.start?
What is the point to have irqres with this duplication?
...
> - dev_err(dev, "couldn't register ec_dev (%d)\n", ret);
> + dev_err_probe(dev, ret, "couldn't register ec_dev (%d)\n", ret);
> return ret;
return dev_err_probe(...);
...
> + dev_err_probe(dev, ret, "Failed to init device for wakeup");
> + return ret;
Ditto.
...
> + if (!np)
> + return;
Why do you need this now?
I would expect either agnostic code or the very first mandatory of_*() call
will fail with the error anyway.
...
> ret = of_property_read_u32(np, "google,cros-ec-spi-msg-delay", &val);
> if (!ret)
> ec_spi->end_of_msg_delay = val;
> + if (ec_dev->irq > 0 && of_property_read_bool(np, "wakeup-source")) {
> + ec_spi->irq_wake = true;
> + dev_dbg(&spi->dev, "IRQ: %i, wake_capable: %i\n", ec_dev->irq, ec_spi->irq_wake);
> + }
if (ret)
return;
ec_spi->irq_wake = of_property_read_bool(np, "wakeup-source"));
dev_dbg(&spi->dev, "IRQ: %i, wake_capable: %s\n", ec_dev->irq, str_yes_no(ec_spi->irq_wake));
?
...
> + if (ec_spi->irq_wake) {
> + err = device_init_wakeup(dev, true);
> + if (err) {
> + dev_err_probe(dev, err, "Failed to init device for wakeup\n");
> + return err;
return dev_err_probe(...);
> + }
> + err = dev_pm_set_wake_irq(dev, ec_dev->irq);
> + if (err)
> + dev_err_probe(dev, err, "Failed to set irq(%d) for wake\n", ec_dev->irq);
Ditto.
> + }
> - return 0;
> + return err;
Unneeded change (see above how to use dev_err_probe() in an efficient way).
ret / err... Even in one file already some inconsistency...
...
> @@ -78,6 +80,7 @@ struct cros_ec_uart {
> u32 baudrate;
> u8 flowcontrol;
> u32 irq;
> + bool irq_wake;
> struct response_info response;
> };
Run `pahole` and amend respectively to avoid wasting memory.
...
> + dev_dbg(dev, "IRQ: %i, wake_capable: %i\n", ec_uart->irq, ec_uart->irq_wake);
str_yes_no() from string_choices.h?
...
> + /* Register a new cros_ec device */
> + ret = cros_ec_register(ec_dev);
> + if (ret) {
> + dev_err(dev, "Couldn't register ec_dev (%d)\n", ret);
> + return ret;
Why not dev_err_probe() here...
> + }
> +
> + if (ec_uart->irq_wake) {
> + ret = device_init_wakeup(dev, true);
> + if (ret) {
> + dev_err_probe(dev, ret, "Failed to init device for wakeup");
> + return ret;
...and here?
> + }
> + ret = dev_pm_set_wake_irq(dev, ec_uart->irq);
> + }
> + return ret;
> }
--
With Best Regards,
Andy Shevchenko
next prev parent reply other threads:[~2023-12-21 15:45 UTC|newest]
Thread overview: 90+ messages / expand[flat|nested] mbox.gz Atom feed top
2023-12-20 23:54 [PATCH v2 00/22] Improve IRQ wake capability reporting and update the cros_ec driver to use it Mark Hasemeyer
2023-12-20 23:54 ` Mark Hasemeyer
2023-12-20 23:54 ` [PATCH v2 01/22] gpiolib: acpi: Modify acpi_dev_irq_wake_get_by() to use resource Mark Hasemeyer
2023-12-21 15:17 ` Andy Shevchenko
2023-12-23 2:05 ` kernel test robot
2023-12-23 3:09 ` Mark Hasemeyer
2023-12-20 23:54 ` [PATCH v2 02/22] i2c: acpi: Modify i2c_acpi_get_irq() " Mark Hasemeyer
2023-12-21 13:51 ` Andy Shevchenko
2023-12-20 23:54 ` [PATCH v2 03/22] Documentation: devicetree: Clarify wording for wakeup-source property Mark Hasemeyer
2023-12-21 8:13 ` Krzysztof Kozlowski
2023-12-21 18:16 ` Mark Hasemeyer
2023-12-21 18:42 ` Krzysztof Kozlowski
2023-12-20 23:54 ` [PATCH v2 04/22] ARM: dts: tegra: Enable cros-ec-spi as wake source Mark Hasemeyer
2023-12-20 23:54 ` [PATCH v2 05/22] ARM: dts: rockchip: rk3288: " Mark Hasemeyer
2023-12-20 23:54 ` Mark Hasemeyer
2023-12-20 23:54 ` Mark Hasemeyer
2023-12-20 23:54 ` [PATCH v2 06/22] ARM: dts: samsung: exynos5420: " Mark Hasemeyer
2023-12-20 23:54 ` Mark Hasemeyer
2023-12-21 8:14 ` Krzysztof Kozlowski
2023-12-21 8:14 ` Krzysztof Kozlowski
2023-12-21 18:29 ` Mark Hasemeyer
2023-12-21 18:29 ` Mark Hasemeyer
2023-12-21 18:38 ` Krzysztof Kozlowski
2023-12-21 18:38 ` Krzysztof Kozlowski
2023-12-21 19:24 ` Mark Hasemeyer
2023-12-21 19:24 ` Mark Hasemeyer
2023-12-21 20:34 ` Krzysztof Kozlowski
2023-12-21 20:34 ` Krzysztof Kozlowski
2024-01-22 11:15 ` (subset) " Krzysztof Kozlowski
2024-01-22 11:15 ` Krzysztof Kozlowski
2023-12-20 23:54 ` [PATCH v2 07/22] ARM: dts: samsung: exynos5800: " Mark Hasemeyer
2023-12-20 23:54 ` Mark Hasemeyer
2024-01-22 11:15 ` (subset) " Krzysztof Kozlowski
2024-01-22 11:15 ` Krzysztof Kozlowski
2023-12-20 23:54 ` [PATCH v2 08/22] arm64: dts: mediatek: mt8173: " Mark Hasemeyer
2023-12-20 23:54 ` Mark Hasemeyer
2023-12-20 23:54 ` [PATCH v2 09/22] arm64: dts: mediatek: mt8183: " Mark Hasemeyer
2023-12-20 23:54 ` Mark Hasemeyer
2023-12-20 23:54 ` [PATCH v2 10/22] arm64: dts: mediatek: mt8192: " Mark Hasemeyer
2023-12-20 23:54 ` Mark Hasemeyer
2023-12-20 23:54 ` [PATCH v2 11/22] arm64: dts: mediatek: mt8195: " Mark Hasemeyer
2023-12-20 23:54 ` Mark Hasemeyer
2023-12-20 23:54 ` [PATCH v2 12/22] arm64: dts: tegra: " Mark Hasemeyer
2023-12-20 23:54 ` [PATCH v2 13/22] arm64: dts: qcom: sc7180: " Mark Hasemeyer
2023-12-21 0:10 ` Doug Anderson
2023-12-20 23:54 ` [PATCH v2 14/22] arm64: dts: qcom: sc7280: " Mark Hasemeyer
2023-12-21 0:10 ` Doug Anderson
2023-12-20 23:54 ` [PATCH v2 15/22] arm64: dts: qcom: sdm845: " Mark Hasemeyer
2023-12-21 0:11 ` Doug Anderson
2023-12-20 23:54 ` [PATCH v2 16/22] arm64: dts: rockchip: rk3399: " Mark Hasemeyer
2023-12-20 23:54 ` Mark Hasemeyer
2023-12-20 23:54 ` Mark Hasemeyer
2023-12-20 23:54 ` [PATCH v2 17/22] of: irq: add wake capable bit to of_irq_resource() Mark Hasemeyer
2023-12-21 15:25 ` Andy Shevchenko
2023-12-22 22:22 ` Mark Hasemeyer
2023-12-21 20:44 ` Rob Herring
2023-12-20 23:54 ` [PATCH v2 18/22] of: irq: Add default implementation for of_irq_to_resource() Mark Hasemeyer
2023-12-21 20:48 ` Rob Herring
2023-12-20 23:54 ` [PATCH v2 19/22] of: irq: Remove extern from function declarations Mark Hasemeyer
2023-12-21 20:49 ` Rob Herring
2023-12-20 23:54 ` [PATCH v2 20/22] device property: Modify fwnode irq_get() to use resource Mark Hasemeyer
2023-12-21 10:37 ` Sakari Ailus
2023-12-21 23:52 ` Mark Hasemeyer
2023-12-22 12:48 ` Andy Shevchenko
2023-12-21 13:56 ` Andy Shevchenko
2023-12-21 23:46 ` Mark Hasemeyer
[not found] ` <CAHQZ30BOA7zuRrN-kK5Qw+NYSVydfhJ0gDPr9q-U+7VKXHzG8g@mail.gmail.com>
2023-12-21 23:59 ` Mark Hasemeyer
2023-12-22 12:46 ` Andy Shevchenko
2023-12-22 12:46 ` Andy Shevchenko
2023-12-22 12:44 ` Andy Shevchenko
2023-12-20 23:54 ` [PATCH v2 21/22] platform: Modify platform_get_irq_optional() " Mark Hasemeyer
2023-12-21 15:33 ` Andy Shevchenko
2023-12-22 21:51 ` Mark Hasemeyer
2023-12-20 23:54 ` [PATCH v2 22/22] platform/chrome: cros_ec: Use PM subsystem to manage wakeirq Mark Hasemeyer
2023-12-21 8:58 ` Tzung-Bi Shih
2023-12-22 22:19 ` Mark Hasemeyer
2023-12-21 15:45 ` Andy Shevchenko [this message]
2023-12-22 22:21 ` Mark Hasemeyer
2023-12-23 0:32 ` kernel test robot
2023-12-23 3:11 ` Mark Hasemeyer
2023-12-23 16:41 ` kernel test robot
2023-12-21 13:42 ` [PATCH v2 00/22] Improve IRQ wake capability reporting and update the cros_ec driver to use it Andy Shevchenko
2023-12-21 13:42 ` Andy Shevchenko
2023-12-21 13:42 ` Andy Shevchenko
2023-12-22 22:30 ` Mark Hasemeyer
2023-12-22 22:30 ` Mark Hasemeyer
2023-12-22 22:30 ` Mark Hasemeyer
2023-12-27 16:01 ` Andy Shevchenko
2023-12-27 16:01 ` Andy Shevchenko
2023-12-27 16:01 ` Andy Shevchenko
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=ZYRdjHVgES1odZAQ@smile.fi.intel.com \
--to=andriy.shevchenko@intel.com \
--cc=angelogioacchino.delregno@collabora.com \
--cc=bhanumaiya@chromium.org \
--cc=bleung@chromium.org \
--cc=chrome-platform@lists.linux.dev \
--cc=groeck@chromium.org \
--cc=konrad.dybcio@linaro.org \
--cc=krzysztof.kozlowski@linaro.org \
--cc=lee@kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=markhas@chromium.org \
--cc=pmalani@chromium.org \
--cc=robbarnes@google.com \
--cc=robh@kernel.org \
--cc=rrangel@chromium.org \
--cc=sudeep.holla@arm.com \
--cc=swboyd@chromium.org \
--cc=tzungbi@kernel.org \
--cc=wenst@chromium.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.