From 2358024b67fccc07b95c5d8e637927acdb8e30fa Mon Sep 17 00:00:00 2001 From: Johan Hovold Date: Thu, 21 Jul 2016 14:24:11 +0200 Subject: [PATCH] greybus: control: suppress bundle_activate() for bootrom We always knew backward compatibility with the ES3 bootrom, which was finalised about a year ago, would be a pain. Here we go again. The bootrom does not support control requests added after it was burnt into ROM for obvious reasons. This means that we need to suppress sending the new bundle_activate() operation to any interface executing the legacy bootrom. Do so by adding a new NO_PM interface quirk (we can use the control-protocol version for this later once we bump it). Note that the interface-disable path (e.g. for power down) is already handled by the FORCED_DISABLE quirk, and that the suspend/resume paths are currently avoided by making sure that the bootrom bundle never suspends. Signed-off-by: Johan Hovold Reviewed-by: Viresh Kumar Acked-by: Bartosz Golaszewski Tested-by: Bartosz Golaszewski Signed-off-by: Greg Kroah-Hartman --- drivers/staging/greybus/control.c | 7 +++++++ drivers/staging/greybus/control.h | 1 + drivers/staging/greybus/interface.c | 3 ++- drivers/staging/greybus/interface.h | 1 + 4 files changed, 11 insertions(+), 1 deletion(-) diff --git a/drivers/staging/greybus/control.c b/drivers/staging/greybus/control.c index 37a30b3..a08a79d 100644 --- a/drivers/staging/greybus/control.c +++ b/drivers/staging/greybus/control.c @@ -329,6 +329,9 @@ int gb_control_bundle_activate(struct gb_control *control, u8 bundle_id) struct gb_control_bundle_pm_response response; int ret; + if (!control->has_bundle_activate) + return 0; + request.bundle_id = bundle_id; ret = gb_operation_sync(control->connection, GB_CONTROL_TYPE_BUNDLE_ACTIVATE, &request, @@ -528,6 +531,10 @@ int gb_control_enable(struct gb_control *control) if (control->protocol_major > 0 || control->protocol_minor > 1) control->has_bundle_version = true; + /* FIXME: use protocol version instead */ + if (!(control->intf->quirks & GB_INTERFACE_QUIRK_NO_PM)) + control->has_bundle_activate = true; + return 0; err_disable_connection: diff --git a/drivers/staging/greybus/control.h b/drivers/staging/greybus/control.h index f73ec3e..f9a60da 100644 --- a/drivers/staging/greybus/control.h +++ b/drivers/staging/greybus/control.h @@ -19,6 +19,7 @@ struct gb_control { u8 protocol_major; u8 protocol_minor; + bool has_bundle_activate; bool has_bundle_version; char *vendor_string; diff --git a/drivers/staging/greybus/interface.c b/drivers/staging/greybus/interface.c index 6abe131..74fa298 100644 --- a/drivers/staging/greybus/interface.c +++ b/drivers/staging/greybus/interface.c @@ -411,7 +411,8 @@ static int gb_interface_read_and_clear_init_status(struct gb_interface *intf) */ bootrom_quirks = GB_INTERFACE_QUIRK_NO_CPORT_FEATURES | GB_INTERFACE_QUIRK_FORCED_DISABLE | - GB_INTERFACE_QUIRK_LEGACY_MODE_SWITCH; + GB_INTERFACE_QUIRK_LEGACY_MODE_SWITCH | + GB_INTERFACE_QUIRK_NO_PM; switch (init_status) { case GB_INIT_BOOTROM_UNIPRO_BOOT_STARTED: case GB_INIT_BOOTROM_FALLBACK_UNIPRO_BOOT_STARTED: diff --git a/drivers/staging/greybus/interface.h b/drivers/staging/greybus/interface.h index daa9759..a08d104 100644 --- a/drivers/staging/greybus/interface.h +++ b/drivers/staging/greybus/interface.h @@ -23,6 +23,7 @@ enum gb_interface_type { #define GB_INTERFACE_QUIRK_NO_ARA_IDS BIT(2) #define GB_INTERFACE_QUIRK_FORCED_DISABLE BIT(3) #define GB_INTERFACE_QUIRK_LEGACY_MODE_SWITCH BIT(4) +#define GB_INTERFACE_QUIRK_NO_PM BIT(5) struct gb_interface { struct device dev; -- 2.7.4