]> git.karo-electronics.de Git - linux-beck.git/commitdiff
greybus: interface: Add quirk for no PM for S2 Loader
authorViresh Kumar <viresh.kumar@linaro.org>
Tue, 26 Jul 2016 20:41:04 +0000 (13:41 -0700)
committerGreg Kroah-Hartman <gregkh@google.com>
Tue, 26 Jul 2016 22:29:00 +0000 (15:29 -0700)
S2 Loader doesn't support runtime PM operations currently and we will
fail to suspend/resume the bundle for firmware management protocols.

Once that happens, the bundle and its connections will be pretty much
useless as we would have tried to disable/enable all connections during
such an operation and the S2 loader doesn't expect the connections to go
away during normal operation (except in the case of mode-switch).

This patch defines a new quirk GB_INTERFACE_QUIRK_NO_PM and uses a new
interface init status value (GB_INIT_S2_LOADER_INITIALIZED) which will
be advertised by S2 Loader now in the init status.

After detecting the currently running stage as S2 Loader, the kernel
wouldn't attempt suspending or resuming the bundle.

Reviewed-by: David Lin <dtwlin@google.com>
Reviewed-by: Johan Hovold <johan@hovoldconsulting.com>
Signed-off-by: Viresh Kumar <viresh.kumar@linaro.org>
Signed-off-by: Greg Kroah-Hartman <gregkh@google.com>
drivers/staging/greybus/fw-core.c
drivers/staging/greybus/greybus_protocols.h
drivers/staging/greybus/interface.c
drivers/staging/greybus/interface.h

index 56296db0b509fbbd4e084935ee380abeae17afb1..a7e4a8c24d228cdeda3229b3418903261b607caf 100644 (file)
@@ -228,7 +228,9 @@ static int gb_fw_core_probe(struct gb_bundle *bundle,
 
        greybus_set_drvdata(bundle, fw_core);
 
-       gb_pm_runtime_put_autosuspend(bundle);
+       /* FIXME: Remove this after S2 Loader gets runtime PM support */
+       if (!(bundle->intf->quirks & GB_INTERFACE_QUIRK_NO_PM))
+               gb_pm_runtime_put_autosuspend(bundle);
 
        return 0;
 
@@ -251,9 +253,12 @@ static void gb_fw_core_disconnect(struct gb_bundle *bundle)
        struct gb_fw_core *fw_core = greybus_get_drvdata(bundle);
        int ret;
 
-       ret = gb_pm_runtime_get_sync(bundle);
-       if (ret)
-               gb_pm_runtime_get_noresume(bundle);
+       /* FIXME: Remove this after S2 Loader gets runtime PM support */
+       if (!(bundle->intf->quirks & GB_INTERFACE_QUIRK_NO_PM)) {
+               ret = gb_pm_runtime_get_sync(bundle);
+               if (ret)
+                       gb_pm_runtime_get_noresume(bundle);
+       }
 
        gb_fw_mgmt_connection_exit(fw_core->mgmt_connection);
        gb_cap_connection_exit(fw_core->cap_connection);
index c7fcb85892fddcf857ae108152d3ed5479fe743c..2de5aef546375dc14793272d170bcd47297972ee 100644 (file)
@@ -1145,6 +1145,7 @@ struct gb_svc_dme_peer_set_response {
 #define GB_INIT_UNTRUSTED_SPI_BOOT_FINISHED            0x04
 #define GB_INIT_BOOTROM_UNIPRO_BOOT_STARTED            0x06
 #define GB_INIT_BOOTROM_FALLBACK_UNIPRO_BOOT_STARTED   0x09
+#define GB_INIT_S2_LOADER_BOOT_STARTED                 0x0D
 
 struct gb_svc_route_create_request {
        __u8    intf1_id;
index c20077acd0d58874966ff780fbb7c7208b58db06..faa6239197579693c2e0373cc141a8d6e3301efa 100644 (file)
@@ -363,6 +363,7 @@ static int gb_interface_read_and_clear_init_status(struct gb_interface *intf)
 {
        struct gb_host_device *hd = intf->hd;
        unsigned long bootrom_quirks;
+       unsigned long s2l_quirks;
        int ret;
        u32 value;
        u16 attr;
@@ -413,13 +414,22 @@ static int gb_interface_read_and_clear_init_status(struct gb_interface *intf)
                                GB_INTERFACE_QUIRK_FORCED_DISABLE |
                                GB_INTERFACE_QUIRK_LEGACY_MODE_SWITCH |
                                GB_INTERFACE_QUIRK_NO_BUNDLE_ACTIVATE;
+
+       s2l_quirks = GB_INTERFACE_QUIRK_NO_PM;
+
        switch (init_status) {
        case GB_INIT_BOOTROM_UNIPRO_BOOT_STARTED:
        case GB_INIT_BOOTROM_FALLBACK_UNIPRO_BOOT_STARTED:
                intf->quirks |= bootrom_quirks;
                break;
+       case GB_INIT_S2_LOADER_BOOT_STARTED:
+               /* S2 Loader doesn't support runtime PM */
+               intf->quirks &= ~bootrom_quirks;
+               intf->quirks |= s2l_quirks;
+               break;
        default:
                intf->quirks &= ~bootrom_quirks;
+               intf->quirks &= ~s2l_quirks;
        }
 
        /* Clear the init status. */
index 89eecf0a4badf8c9f4722b7251ed2860bc2c2137..174bc749395e02faee2fce0a420df1b32cb1249f 100644 (file)
@@ -24,6 +24,7 @@ enum gb_interface_type {
 #define GB_INTERFACE_QUIRK_FORCED_DISABLE              BIT(3)
 #define GB_INTERFACE_QUIRK_LEGACY_MODE_SWITCH          BIT(4)
 #define GB_INTERFACE_QUIRK_NO_BUNDLE_ACTIVATE          BIT(5)
+#define GB_INTERFACE_QUIRK_NO_PM                       BIT(6)
 
 struct gb_interface {
        struct device dev;