firmware: ti_sci: Use system_state to determine polling
authorNishanth Menon <nm@ti.com>
Tue, 20 Jun 2023 13:03:29 +0000 (08:03 -0500)
committerNishanth Menon <nm@ti.com>
Tue, 11 Jul 2023 18:01:08 +0000 (13:01 -0500)
Commit b9e8a7d950ff ("firmware: ti_sci: Switch transport to polled
mode during system suspend") aims to resolve issues with tisci
operations during system suspend operation. However, the system may
enter a no_irq stage in various other usage modes, including power-off
and restart. To determine if polling mode is appropriate, use the
system_state instead.

While at this, drop the unused is_suspending state variable and
related helpers.

Fixes: b9e8a7d950ff ("firmware: ti_sci: Switch transport to polled mode during system suspend")
Reported-by: Francesco Dolcini <francesco@dolcini.it>
Reported-by: Wadim Egorov <w.egorov@phytec.de>
Tested-by: Francesco Dolcini <francesco.dolcini@toradex.com> # Toradex Verdin AM62
Link: https://lore.kernel.org/r/20230620130329.4120443-1-nm@ti.com
Closes: https://lore.kernel.org/all/ZGeHMjlnob2GFyHF@francesco-nb.int.toradex.com/
Signed-off-by: Nishanth Menon <nm@ti.com>
drivers/firmware/ti_sci.c

index 039d92a595ec6873fd8d34fbe7a939abfb947bc0..91aaa0ca9bde8698b0f6532a2b04a1aab3b38694 100644 (file)
@@ -97,7 +97,6 @@ struct ti_sci_desc {
  * @node:      list head
  * @host_id:   Host ID
  * @users:     Number of users of this instance
- * @is_suspending: Flag set to indicate in suspend path.
  */
 struct ti_sci_info {
        struct device *dev;
@@ -116,7 +115,6 @@ struct ti_sci_info {
        u8 host_id;
        /* protected by ti_sci_list_mutex */
        int users;
-       bool is_suspending;
 };
 
 #define cl_to_ti_sci_info(c)   container_of(c, struct ti_sci_info, cl)
@@ -418,14 +416,14 @@ static inline int ti_sci_do_xfer(struct ti_sci_info *info,
 
        ret = 0;
 
-       if (!info->is_suspending) {
+       if (system_state <= SYSTEM_RUNNING) {
                /* And we wait for the response. */
                timeout = msecs_to_jiffies(info->desc->max_rx_timeout_ms);
                if (!wait_for_completion_timeout(&xfer->done, timeout))
                        ret = -ETIMEDOUT;
        } else {
                /*
-                * If we are suspending, we cannot use wait_for_completion_timeout
+                * If we are !running, we cannot use wait_for_completion_timeout
                 * during noirq phase, so we must manually poll the completion.
                 */
                ret = read_poll_timeout_atomic(try_wait_for_completion, done_state,
@@ -3281,35 +3279,6 @@ static int tisci_reboot_handler(struct notifier_block *nb, unsigned long mode,
        return NOTIFY_BAD;
 }
 
-static void ti_sci_set_is_suspending(struct ti_sci_info *info, bool is_suspending)
-{
-       info->is_suspending = is_suspending;
-}
-
-static int ti_sci_suspend(struct device *dev)
-{
-       struct ti_sci_info *info = dev_get_drvdata(dev);
-       /*
-        * We must switch operation to polled mode now as drivers and the genpd
-        * layer may make late TI SCI calls to change clock and device states
-        * from the noirq phase of suspend.
-        */
-       ti_sci_set_is_suspending(info, true);
-
-       return 0;
-}
-
-static int ti_sci_resume(struct device *dev)
-{
-       struct ti_sci_info *info = dev_get_drvdata(dev);
-
-       ti_sci_set_is_suspending(info, false);
-
-       return 0;
-}
-
-static DEFINE_SIMPLE_DEV_PM_OPS(ti_sci_pm_ops, ti_sci_suspend, ti_sci_resume);
-
 /* Description for K2G */
 static const struct ti_sci_desc ti_sci_pmmc_k2g_desc = {
        .default_host_id = 2,
@@ -3516,7 +3485,6 @@ static struct platform_driver ti_sci_driver = {
        .driver = {
                   .name = "ti-sci",
                   .of_match_table = of_match_ptr(ti_sci_of_match),
-                  .pm = &ti_sci_pm_ops,
        },
 };
 module_platform_driver(ti_sci_driver);