From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Google-Smtp-Source: AG47ELvl7er1bWgohg8MftqK6NnBlSwmXzsArQh1d95aPeJRTqnLKzxfE3cddUFKjX2j9DdtYUiT ARC-Seal: i=1; a=rsa-sha256; t=1520865296; cv=none; d=google.com; s=arc-20160816; b=dHnJ3qisGDlx02vJSmmbG5GSPVChQ7rDtGIZG7tkltdhnDTGy1v2nPGvyAHCQ7OKyC IoX0QhEJOrHh3coOZqx8WPJorrOSkYDyBK6K0i8kiU6GTsAdTdO7T8WbeKb/INdq0r1y +kqw0l2rdL+UtvxJMjkMaQnD0iHnUPSHF7KttA2gROjPdwCYgXLJkCje42nq3BYsskfu pOijuPuFVcz1YcwJ/ZuV59Jz32VPwCHQnZ6cOVtFcMBwy0Zdk0tNNq6l6USoVPM3IMTW 8jiyMR6mNQ9tJokoe31qeYb/Ba8SXsbABOwWEyZsq0y+rXo+eIfmf2bUcC60fEO2LDFv 0tRg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=references:in-reply-to:message-id:date:subject:cc:to:from :arc-authentication-results; bh=Si2xf8EBc+A8b7ZxuaxdxhN/1z49l2WRkEpdScrE3o4=; b=thpL2fqnZ332qQIqiW7ny+vV+8cqHKA90XlDmYoTTny2+cL7g8Yxab/fVFZHhujtEL nNMfgdIN0bEUmGe8wrMy2drIVCwL4P3GFOFvtFkT3XW5hNjZDNt/WJXP9Wy+1OjvEY9o 3ha5IOMku2/uVaOjVHPODjY9+a3END/dQBcSsAhRG+/GhntShj3kqyCtzat6xM2PpeXk xxmtyqE0H9gASZnD7CDW6AvI1n2+opKeYA7oeEI2gmf1rLgkxnO9LZwBTcMjb9Rp5Oi2 dF5kUqE6ZfT/AGpXOk5y334Jg5TT94tDJtq2+9gfn65Zu8vSRENntAaEoz9IReKk1388 1ldw== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: best guess record for domain of heikki.krogerus@linux.intel.com designates 192.55.52.88 as permitted sender) smtp.mailfrom=heikki.krogerus@linux.intel.com Authentication-Results: mx.google.com; spf=pass (google.com: best guess record for domain of heikki.krogerus@linux.intel.com designates 192.55.52.88 as permitted sender) smtp.mailfrom=heikki.krogerus@linux.intel.com X-Amp-Result: SKIPPED(no attachment in message) X-Amp-File-Uploaded: False X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.47,461,1515484800"; d="scan'208";a="37470881" From: Heikki Krogerus To: Greg Kroah-Hartman , Hans de Goede Cc: Darren Hart , Andy Shevchenko , MyungJoo Ham , Chanwoo Choi , Mathias Nyman , Guenter Roeck , Jun Li , platform-driver-x86@vger.kernel.org, linux-kernel@vger.kernel.org, linux-usb@vger.kernel.org Subject: [PATCH v7 06/12] usb: typec: tcpm: Use new Type-C switch/mux and usb-role-switch functions Date: Mon, 12 Mar 2018 17:34:25 +0300 Message-Id: <20180312143431.82396-7-heikki.krogerus@linux.intel.com> X-Mailer: git-send-email 2.16.1 In-Reply-To: <20180312143431.82396-1-heikki.krogerus@linux.intel.com> References: <20180312143431.82396-1-heikki.krogerus@linux.intel.com> X-getmail-retrieved-from-mailbox: INBOX X-GMAIL-THRID: =?utf-8?q?1594742849233315217?= X-GMAIL-MSGID: =?utf-8?q?1594742849233315217?= X-Mailing-List: linux-kernel@vger.kernel.org List-ID: From: Hans de Goede Remove the unused (not implemented anywhere) tcpc_mux_dev abstraction and replace it with calling the new typec_set_orientation, usb_role_switch_set and typec_set_mode functions. Signed-off-by: Hans de Goede Revieved-by: Heikki Krogerus Reviewed-by: Guenter Roeck Reviewed-by: Andy Shevchenko Signed-off-by: Heikki Krogerus --- Changes in v4: -Add Andy's Reviewed-by Changes in v3: -Add Guenter's Reviewed-by Changes in v2: -Added Heikki's Reviewed-by --- drivers/usb/typec/Kconfig | 1 + drivers/usb/typec/fusb302/fusb302.c | 1 - drivers/usb/typec/tcpm.c | 46 ++++++++++++++++++++++++++++--------- include/linux/usb/tcpm.h | 10 -------- 4 files changed, 36 insertions(+), 22 deletions(-) diff --git a/drivers/usb/typec/Kconfig b/drivers/usb/typec/Kconfig index bcb2744c5977..a2a0684e7c82 100644 --- a/drivers/usb/typec/Kconfig +++ b/drivers/usb/typec/Kconfig @@ -48,6 +48,7 @@ if TYPEC config TYPEC_TCPM tristate "USB Type-C Port Controller Manager" depends on USB + select USB_ROLE_SWITCH help The Type-C Port Controller Manager provides a USB PD and USB Type-C state machine for use with Type-C Port Controllers. diff --git a/drivers/usb/typec/fusb302/fusb302.c b/drivers/usb/typec/fusb302/fusb302.c index f2d98c3c1f30..f0a2f8954bbd 100644 --- a/drivers/usb/typec/fusb302/fusb302.c +++ b/drivers/usb/typec/fusb302/fusb302.c @@ -1239,7 +1239,6 @@ static void init_tcpc_dev(struct tcpc_dev *fusb302_tcpc_dev) fusb302_tcpc_dev->set_roles = tcpm_set_roles; fusb302_tcpc_dev->start_drp_toggling = tcpm_start_drp_toggling; fusb302_tcpc_dev->pd_transmit = tcpm_pd_transmit; - fusb302_tcpc_dev->mux = NULL; } static const char * const cc_polarity_name[] = { diff --git a/drivers/usb/typec/tcpm.c b/drivers/usb/typec/tcpm.c index 5e527e2e1506..3f0851bfe18f 100644 --- a/drivers/usb/typec/tcpm.c +++ b/drivers/usb/typec/tcpm.c @@ -20,6 +20,7 @@ #include #include #include +#include #include #include #include @@ -176,6 +177,7 @@ struct tcpm_port { struct typec_port *typec_port; struct tcpc_dev *tcpc; + struct usb_role_switch *role_sw; enum typec_role vconn_role; enum typec_role pwr_role; @@ -607,18 +609,25 @@ void tcpm_pd_transmit_complete(struct tcpm_port *port, EXPORT_SYMBOL_GPL(tcpm_pd_transmit_complete); static int tcpm_mux_set(struct tcpm_port *port, enum tcpc_mux_mode mode, - enum usb_role usb_role) + enum usb_role usb_role, + enum typec_orientation orientation) { - int ret = 0; + int ret; - tcpm_log(port, "Requesting mux mode %d, usb-role %d, polarity %d", - mode, usb_role, port->polarity); + tcpm_log(port, "Requesting mux mode %d, usb-role %d, orientation %d", + mode, usb_role, orientation); - if (port->tcpc->mux) - ret = port->tcpc->mux->set(port->tcpc->mux, mode, usb_role, - port->polarity); + ret = typec_set_orientation(port->typec_port, orientation); + if (ret) + return ret; - return ret; + if (port->role_sw) { + ret = usb_role_switch_set_role(port->role_sw, usb_role); + if (ret) + return ret; + } + + return typec_set_mode(port->typec_port, mode); } static int tcpm_set_polarity(struct tcpm_port *port, @@ -731,15 +740,21 @@ static int tcpm_set_attached_state(struct tcpm_port *port, bool attached) static int tcpm_set_roles(struct tcpm_port *port, bool attached, enum typec_role role, enum typec_data_role data) { + enum typec_orientation orientation; enum usb_role usb_role; int ret; + if (port->polarity == TYPEC_POLARITY_CC1) + orientation = TYPEC_ORIENTATION_NORMAL; + else + orientation = TYPEC_ORIENTATION_REVERSE; + if (data == TYPEC_HOST) usb_role = USB_ROLE_HOST; else usb_role = USB_ROLE_DEVICE; - ret = tcpm_mux_set(port, TYPEC_MUX_USB, usb_role); + ret = tcpm_mux_set(port, TYPEC_MUX_USB, usb_role, orientation); if (ret < 0) return ret; @@ -2086,7 +2101,8 @@ static int tcpm_src_attach(struct tcpm_port *port) out_disable_pd: port->tcpc->set_pd_rx(port->tcpc, false); out_disable_mux: - tcpm_mux_set(port, TYPEC_MUX_NONE, USB_ROLE_NONE); + tcpm_mux_set(port, TYPEC_MUX_NONE, USB_ROLE_NONE, + TYPEC_ORIENTATION_NONE); return ret; } @@ -2130,7 +2146,8 @@ static void tcpm_reset_port(struct tcpm_port *port) tcpm_init_vconn(port); tcpm_set_current_limit(port, 0, 0); tcpm_set_polarity(port, TYPEC_POLARITY_CC1); - tcpm_mux_set(port, TYPEC_MUX_NONE, USB_ROLE_NONE); + tcpm_mux_set(port, TYPEC_MUX_NONE, USB_ROLE_NONE, + TYPEC_ORIENTATION_NONE); tcpm_set_attached_state(port, false); port->try_src_count = 0; port->try_snk_count = 0; @@ -3732,6 +3749,12 @@ struct tcpm_port *tcpm_register_port(struct device *dev, struct tcpc_dev *tcpc) port->partner_desc.identity = &port->partner_ident; port->port_type = tcpc->config->type; + port->role_sw = usb_role_switch_get(port->dev); + if (IS_ERR(port->role_sw)) { + err = PTR_ERR(port->role_sw); + goto out_destroy_wq; + } + port->typec_port = typec_register_port(port->dev, &port->typec_caps); if (IS_ERR(port->typec_port)) { err = PTR_ERR(port->typec_port); @@ -3767,6 +3790,7 @@ struct tcpm_port *tcpm_register_port(struct device *dev, struct tcpc_dev *tcpc) return port; out_destroy_wq: + usb_role_switch_put(port->role_sw); destroy_workqueue(port->wq); return ERR_PTR(err); } diff --git a/include/linux/usb/tcpm.h b/include/linux/usb/tcpm.h index 3e8bdaa5085a..f0d839daeaea 100644 --- a/include/linux/usb/tcpm.h +++ b/include/linux/usb/tcpm.h @@ -16,7 +16,6 @@ #define __LINUX_USB_TCPM_H #include -#include #include #include "pd.h" @@ -113,14 +112,6 @@ enum tcpc_mux_mode { TCPC_MUX_DP_ENABLED, }; -struct tcpc_mux_dev { - int (*set)(struct tcpc_mux_dev *dev, enum tcpc_mux_mode mux_mode, - enum usb_role usb_role, - enum typec_cc_polarity polarity); - bool dfp_only; - void *priv_data; -}; - /** * struct tcpc_dev - Port configuration and callback functions * @config: Pointer to port configuration @@ -172,7 +163,6 @@ struct tcpc_dev { int (*try_role)(struct tcpc_dev *dev, int role); int (*pd_transmit)(struct tcpc_dev *dev, enum tcpm_transmit_type type, const struct pd_message *msg); - struct tcpc_mux_dev *mux; }; struct tcpm_port; -- 2.16.1 From mboxrd@z Thu Jan 1 00:00:00 1970 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: base64 Subject: [v7,06/12] usb: typec: tcpm: Use new Type-C switch/mux and usb-role-switch functions From: Heikki Krogerus Message-Id: <20180312143431.82396-7-heikki.krogerus@linux.intel.com> Date: Mon, 12 Mar 2018 17:34:25 +0300 To: Greg Kroah-Hartman , Hans de Goede Cc: Darren Hart , Andy Shevchenko , MyungJoo Ham , Chanwoo Choi , Mathias Nyman , Guenter Roeck , Jun Li , platform-driver-x86@vger.kernel.org, linux-kernel@vger.kernel.org, linux-usb@vger.kernel.org List-ID: RnJvbTogSGFucyBkZSBHb2VkZSA8aGRlZ29lZGVAcmVkaGF0LmNvbT4KClJlbW92ZSB0aGUgdW51 c2VkIChub3QgaW1wbGVtZW50ZWQgYW55d2hlcmUpIHRjcGNfbXV4X2RldiBhYnN0cmFjdGlvbgph bmQgcmVwbGFjZSBpdCB3aXRoIGNhbGxpbmcgdGhlIG5ldyB0eXBlY19zZXRfb3JpZW50YXRpb24s CnVzYl9yb2xlX3N3aXRjaF9zZXQgYW5kIHR5cGVjX3NldF9tb2RlIGZ1bmN0aW9ucy4KClNpZ25l ZC1vZmYtYnk6IEhhbnMgZGUgR29lZGUgPGhkZWdvZWRlQHJlZGhhdC5jb20+ClJldmlldmVkLWJ5 OiBIZWlra2kgS3JvZ2VydXMgPGhlaWtraS5rcm9nZXJ1c0BsaW51eC5pbnRlbC5jb20+ClJldmll d2VkLWJ5OiBHdWVudGVyIFJvZWNrIDxsaW51eEByb2Vjay11cy5uZXQ+ClJldmlld2VkLWJ5OiBB bmR5IFNoZXZjaGVua28gPGFuZHkuc2hldmNoZW5rb0BnbWFpbC5jb20+ClNpZ25lZC1vZmYtYnk6 IEhlaWtraSBLcm9nZXJ1cyA8aGVpa2tpLmtyb2dlcnVzQGxpbnV4LmludGVsLmNvbT4KLS0tCkNo YW5nZXMgaW4gdjQ6Ci1BZGQgQW5keSdzIFJldmlld2VkLWJ5CgpDaGFuZ2VzIGluIHYzOgotQWRk IEd1ZW50ZXIncyBSZXZpZXdlZC1ieQoKQ2hhbmdlcyBpbiB2MjoKLUFkZGVkIEhlaWtraSdzIFJl dmlld2VkLWJ5Ci0tLQogZHJpdmVycy91c2IvdHlwZWMvS2NvbmZpZyAgICAgICAgICAgfCAgMSAr CiBkcml2ZXJzL3VzYi90eXBlYy9mdXNiMzAyL2Z1c2IzMDIuYyB8ICAxIC0KIGRyaXZlcnMvdXNi L3R5cGVjL3RjcG0uYyAgICAgICAgICAgIHwgNDYgKysrKysrKysrKysrKysrKysrKysrKysrKysr Ky0tLS0tLS0tLQogaW5jbHVkZS9saW51eC91c2IvdGNwbS5oICAgICAgICAgICAgfCAxMCAtLS0t LS0tLQogNCBmaWxlcyBjaGFuZ2VkLCAzNiBpbnNlcnRpb25zKCspLCAyMiBkZWxldGlvbnMoLSkK CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi90eXBlYy9LY29uZmlnIGIvZHJpdmVycy91c2IvdHlw ZWMvS2NvbmZpZwppbmRleCBiY2IyNzQ0YzU5NzcuLmEyYTA2ODRlN2M4MiAxMDA2NDQKLS0tIGEv ZHJpdmVycy91c2IvdHlwZWMvS2NvbmZpZworKysgYi9kcml2ZXJzL3VzYi90eXBlYy9LY29uZmln CkBAIC00OCw2ICs0OCw3IEBAIGlmIFRZUEVDCiBjb25maWcgVFlQRUNfVENQTQogCXRyaXN0YXRl ICJVU0IgVHlwZS1DIFBvcnQgQ29udHJvbGxlciBNYW5hZ2VyIgogCWRlcGVuZHMgb24gVVNCCisJ c2VsZWN0IFVTQl9ST0xFX1NXSVRDSAogCWhlbHAKIAkgIFRoZSBUeXBlLUMgUG9ydCBDb250cm9s bGVyIE1hbmFnZXIgcHJvdmlkZXMgYSBVU0IgUEQgYW5kIFVTQiBUeXBlLUMKIAkgIHN0YXRlIG1h Y2hpbmUgZm9yIHVzZSB3aXRoIFR5cGUtQyBQb3J0IENvbnRyb2xsZXJzLgpkaWZmIC0tZ2l0IGEv ZHJpdmVycy91c2IvdHlwZWMvZnVzYjMwMi9mdXNiMzAyLmMgYi9kcml2ZXJzL3VzYi90eXBlYy9m dXNiMzAyL2Z1c2IzMDIuYwppbmRleCBmMmQ5OGMzYzFmMzAuLmYwYTJmODk1NGJiZCAxMDA2NDQK LS0tIGEvZHJpdmVycy91c2IvdHlwZWMvZnVzYjMwMi9mdXNiMzAyLmMKKysrIGIvZHJpdmVycy91 c2IvdHlwZWMvZnVzYjMwMi9mdXNiMzAyLmMKQEAgLTEyMzksNyArMTIzOSw2IEBAIHN0YXRpYyB2 b2lkIGluaXRfdGNwY19kZXYoc3RydWN0IHRjcGNfZGV2ICpmdXNiMzAyX3RjcGNfZGV2KQogCWZ1 c2IzMDJfdGNwY19kZXYtPnNldF9yb2xlcyA9IHRjcG1fc2V0X3JvbGVzOwogCWZ1c2IzMDJfdGNw Y19kZXYtPnN0YXJ0X2RycF90b2dnbGluZyA9IHRjcG1fc3RhcnRfZHJwX3RvZ2dsaW5nOwogCWZ1 c2IzMDJfdGNwY19kZXYtPnBkX3RyYW5zbWl0ID0gdGNwbV9wZF90cmFuc21pdDsKLQlmdXNiMzAy X3RjcGNfZGV2LT5tdXggPSBOVUxMOwogfQogCiBzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGNj X3BvbGFyaXR5X25hbWVbXSA9IHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL3R5cGVjL3RjcG0u YyBiL2RyaXZlcnMvdXNiL3R5cGVjL3RjcG0uYwppbmRleCA1ZTUyN2UyZTE1MDYuLjNmMDg1MWJm ZTE4ZiAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvdHlwZWMvdGNwbS5jCisrKyBiL2RyaXZlcnMv dXNiL3R5cGVjL3RjcG0uYwpAQCAtMjAsNiArMjAsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3VzYi9w ZC5oPgogI2luY2x1ZGUgPGxpbnV4L3VzYi9wZF9iZG8uaD4KICNpbmNsdWRlIDxsaW51eC91c2Iv cGRfdmRvLmg+CisjaW5jbHVkZSA8bGludXgvdXNiL3JvbGUuaD4KICNpbmNsdWRlIDxsaW51eC91 c2IvdGNwbS5oPgogI2luY2x1ZGUgPGxpbnV4L3VzYi90eXBlYy5oPgogI2luY2x1ZGUgPGxpbnV4 L3dvcmtxdWV1ZS5oPgpAQCAtMTc2LDYgKzE3Nyw3IEBAIHN0cnVjdCB0Y3BtX3BvcnQgewogCXN0 cnVjdCB0eXBlY19wb3J0ICp0eXBlY19wb3J0OwogCiAJc3RydWN0IHRjcGNfZGV2CSp0Y3BjOwor CXN0cnVjdCB1c2Jfcm9sZV9zd2l0Y2ggKnJvbGVfc3c7CiAKIAllbnVtIHR5cGVjX3JvbGUgdmNv bm5fcm9sZTsKIAllbnVtIHR5cGVjX3JvbGUgcHdyX3JvbGU7CkBAIC02MDcsMTggKzYwOSwyNSBA QCB2b2lkIHRjcG1fcGRfdHJhbnNtaXRfY29tcGxldGUoc3RydWN0IHRjcG1fcG9ydCAqcG9ydCwK IEVYUE9SVF9TWU1CT0xfR1BMKHRjcG1fcGRfdHJhbnNtaXRfY29tcGxldGUpOwogCiBzdGF0aWMg aW50IHRjcG1fbXV4X3NldChzdHJ1Y3QgdGNwbV9wb3J0ICpwb3J0LCBlbnVtIHRjcGNfbXV4X21v ZGUgbW9kZSwKLQkJCWVudW0gdXNiX3JvbGUgdXNiX3JvbGUpCisJCQllbnVtIHVzYl9yb2xlIHVz Yl9yb2xlLAorCQkJZW51bSB0eXBlY19vcmllbnRhdGlvbiBvcmllbnRhdGlvbikKIHsKLQlpbnQg cmV0ID0gMDsKKwlpbnQgcmV0OwogCi0JdGNwbV9sb2cocG9ydCwgIlJlcXVlc3RpbmcgbXV4IG1v ZGUgJWQsIHVzYi1yb2xlICVkLCBwb2xhcml0eSAlZCIsCi0JCSBtb2RlLCB1c2Jfcm9sZSwgcG9y dC0+cG9sYXJpdHkpOworCXRjcG1fbG9nKHBvcnQsICJSZXF1ZXN0aW5nIG11eCBtb2RlICVkLCB1 c2Itcm9sZSAlZCwgb3JpZW50YXRpb24gJWQiLAorCQkgbW9kZSwgdXNiX3JvbGUsIG9yaWVudGF0 aW9uKTsKIAotCWlmIChwb3J0LT50Y3BjLT5tdXgpCi0JCXJldCA9IHBvcnQtPnRjcGMtPm11eC0+ c2V0KHBvcnQtPnRjcGMtPm11eCwgbW9kZSwgdXNiX3JvbGUsCi0JCQkJCSAgIHBvcnQtPnBvbGFy aXR5KTsKKwlyZXQgPSB0eXBlY19zZXRfb3JpZW50YXRpb24ocG9ydC0+dHlwZWNfcG9ydCwgb3Jp ZW50YXRpb24pOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CiAKLQlyZXR1cm4gcmV0OworCWlm IChwb3J0LT5yb2xlX3N3KSB7CisJCXJldCA9IHVzYl9yb2xlX3N3aXRjaF9zZXRfcm9sZShwb3J0 LT5yb2xlX3N3LCB1c2Jfcm9sZSk7CisJCWlmIChyZXQpCisJCQlyZXR1cm4gcmV0OworCX0KKwor CXJldHVybiB0eXBlY19zZXRfbW9kZShwb3J0LT50eXBlY19wb3J0LCBtb2RlKTsKIH0KIAogc3Rh dGljIGludCB0Y3BtX3NldF9wb2xhcml0eShzdHJ1Y3QgdGNwbV9wb3J0ICpwb3J0LApAQCAtNzMx LDE1ICs3NDAsMjEgQEAgc3RhdGljIGludCB0Y3BtX3NldF9hdHRhY2hlZF9zdGF0ZShzdHJ1Y3Qg dGNwbV9wb3J0ICpwb3J0LCBib29sIGF0dGFjaGVkKQogc3RhdGljIGludCB0Y3BtX3NldF9yb2xl cyhzdHJ1Y3QgdGNwbV9wb3J0ICpwb3J0LCBib29sIGF0dGFjaGVkLAogCQkJICBlbnVtIHR5cGVj X3JvbGUgcm9sZSwgZW51bSB0eXBlY19kYXRhX3JvbGUgZGF0YSkKIHsKKwllbnVtIHR5cGVjX29y aWVudGF0aW9uIG9yaWVudGF0aW9uOwogCWVudW0gdXNiX3JvbGUgdXNiX3JvbGU7CiAJaW50IHJl dDsKIAorCWlmIChwb3J0LT5wb2xhcml0eSA9PSBUWVBFQ19QT0xBUklUWV9DQzEpCisJCW9yaWVu dGF0aW9uID0gVFlQRUNfT1JJRU5UQVRJT05fTk9STUFMOworCWVsc2UKKwkJb3JpZW50YXRpb24g PSBUWVBFQ19PUklFTlRBVElPTl9SRVZFUlNFOworCiAJaWYgKGRhdGEgPT0gVFlQRUNfSE9TVCkK IAkJdXNiX3JvbGUgPSBVU0JfUk9MRV9IT1NUOwogCWVsc2UKIAkJdXNiX3JvbGUgPSBVU0JfUk9M RV9ERVZJQ0U7CiAKLQlyZXQgPSB0Y3BtX211eF9zZXQocG9ydCwgVFlQRUNfTVVYX1VTQiwgdXNi X3JvbGUpOworCXJldCA9IHRjcG1fbXV4X3NldChwb3J0LCBUWVBFQ19NVVhfVVNCLCB1c2Jfcm9s ZSwgb3JpZW50YXRpb24pOwogCWlmIChyZXQgPCAwKQogCQlyZXR1cm4gcmV0OwogCkBAIC0yMDg2 LDcgKzIxMDEsOCBAQCBzdGF0aWMgaW50IHRjcG1fc3JjX2F0dGFjaChzdHJ1Y3QgdGNwbV9wb3J0 ICpwb3J0KQogb3V0X2Rpc2FibGVfcGQ6CiAJcG9ydC0+dGNwYy0+c2V0X3BkX3J4KHBvcnQtPnRj cGMsIGZhbHNlKTsKIG91dF9kaXNhYmxlX211eDoKLQl0Y3BtX211eF9zZXQocG9ydCwgVFlQRUNf TVVYX05PTkUsIFVTQl9ST0xFX05PTkUpOworCXRjcG1fbXV4X3NldChwb3J0LCBUWVBFQ19NVVhf Tk9ORSwgVVNCX1JPTEVfTk9ORSwKKwkJICAgICBUWVBFQ19PUklFTlRBVElPTl9OT05FKTsKIAly ZXR1cm4gcmV0OwogfQogCkBAIC0yMTMwLDcgKzIxNDYsOCBAQCBzdGF0aWMgdm9pZCB0Y3BtX3Jl c2V0X3BvcnQoc3RydWN0IHRjcG1fcG9ydCAqcG9ydCkKIAl0Y3BtX2luaXRfdmNvbm4ocG9ydCk7 CiAJdGNwbV9zZXRfY3VycmVudF9saW1pdChwb3J0LCAwLCAwKTsKIAl0Y3BtX3NldF9wb2xhcml0 eShwb3J0LCBUWVBFQ19QT0xBUklUWV9DQzEpOwotCXRjcG1fbXV4X3NldChwb3J0LCBUWVBFQ19N VVhfTk9ORSwgVVNCX1JPTEVfTk9ORSk7CisJdGNwbV9tdXhfc2V0KHBvcnQsIFRZUEVDX01VWF9O T05FLCBVU0JfUk9MRV9OT05FLAorCQkgICAgIFRZUEVDX09SSUVOVEFUSU9OX05PTkUpOwogCXRj cG1fc2V0X2F0dGFjaGVkX3N0YXRlKHBvcnQsIGZhbHNlKTsKIAlwb3J0LT50cnlfc3JjX2NvdW50 ID0gMDsKIAlwb3J0LT50cnlfc25rX2NvdW50ID0gMDsKQEAgLTM3MzIsNiArMzc0OSwxMiBAQCBz dHJ1Y3QgdGNwbV9wb3J0ICp0Y3BtX3JlZ2lzdGVyX3BvcnQoc3RydWN0IGRldmljZSAqZGV2LCBz dHJ1Y3QgdGNwY19kZXYgKnRjcGMpCiAJcG9ydC0+cGFydG5lcl9kZXNjLmlkZW50aXR5ID0gJnBv cnQtPnBhcnRuZXJfaWRlbnQ7CiAJcG9ydC0+cG9ydF90eXBlID0gdGNwYy0+Y29uZmlnLT50eXBl OwogCisJcG9ydC0+cm9sZV9zdyA9IHVzYl9yb2xlX3N3aXRjaF9nZXQocG9ydC0+ZGV2KTsKKwlp ZiAoSVNfRVJSKHBvcnQtPnJvbGVfc3cpKSB7CisJCWVyciA9IFBUUl9FUlIocG9ydC0+cm9sZV9z dyk7CisJCWdvdG8gb3V0X2Rlc3Ryb3lfd3E7CisJfQorCiAJcG9ydC0+dHlwZWNfcG9ydCA9IHR5 cGVjX3JlZ2lzdGVyX3BvcnQocG9ydC0+ZGV2LCAmcG9ydC0+dHlwZWNfY2Fwcyk7CiAJaWYgKElT X0VSUihwb3J0LT50eXBlY19wb3J0KSkgewogCQllcnIgPSBQVFJfRVJSKHBvcnQtPnR5cGVjX3Bv cnQpOwpAQCAtMzc2Nyw2ICszNzkwLDcgQEAgc3RydWN0IHRjcG1fcG9ydCAqdGNwbV9yZWdpc3Rl cl9wb3J0KHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IHRjcGNfZGV2ICp0Y3BjKQogCXJldHVy biBwb3J0OwogCiBvdXRfZGVzdHJveV93cToKKwl1c2Jfcm9sZV9zd2l0Y2hfcHV0KHBvcnQtPnJv bGVfc3cpOwogCWRlc3Ryb3lfd29ya3F1ZXVlKHBvcnQtPndxKTsKIAlyZXR1cm4gRVJSX1BUUihl cnIpOwogfQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC91c2IvdGNwbS5oIGIvaW5jbHVkZS9s aW51eC91c2IvdGNwbS5oCmluZGV4IDNlOGJkYWE1MDg1YS4uZjBkODM5ZGFlYWVhIDEwMDY0NAot LS0gYS9pbmNsdWRlL2xpbnV4L3VzYi90Y3BtLmgKKysrIGIvaW5jbHVkZS9saW51eC91c2IvdGNw bS5oCkBAIC0xNiw3ICsxNiw2IEBACiAjZGVmaW5lIF9fTElOVVhfVVNCX1RDUE1fSAogCiAjaW5j bHVkZSA8bGludXgvYml0b3BzLmg+Ci0jaW5jbHVkZSA8bGludXgvdXNiL3JvbGUuaD4KICNpbmNs dWRlIDxsaW51eC91c2IvdHlwZWMuaD4KICNpbmNsdWRlICJwZC5oIgogCkBAIC0xMTMsMTQgKzEx Miw2IEBAIGVudW0gdGNwY19tdXhfbW9kZSB7CiAJCQkgIFRDUENfTVVYX0RQX0VOQUJMRUQsCiB9 OwogCi1zdHJ1Y3QgdGNwY19tdXhfZGV2IHsKLQlpbnQgKCpzZXQpKHN0cnVjdCB0Y3BjX211eF9k ZXYgKmRldiwgZW51bSB0Y3BjX211eF9tb2RlIG11eF9tb2RlLAotCQkgICBlbnVtIHVzYl9yb2xl IHVzYl9yb2xlLAotCQkgICBlbnVtIHR5cGVjX2NjX3BvbGFyaXR5IHBvbGFyaXR5KTsKLQlib29s IGRmcF9vbmx5OwotCXZvaWQgKnByaXZfZGF0YTsKLX07Ci0KIC8qKgogICogc3RydWN0IHRjcGNf ZGV2IC0gUG9ydCBjb25maWd1cmF0aW9uIGFuZCBjYWxsYmFjayBmdW5jdGlvbnMKICAqIEBjb25m aWc6CVBvaW50ZXIgdG8gcG9ydCBjb25maWd1cmF0aW9uCkBAIC0xNzIsNyArMTYzLDYgQEAgc3Ry dWN0IHRjcGNfZGV2IHsKIAlpbnQgKCp0cnlfcm9sZSkoc3RydWN0IHRjcGNfZGV2ICpkZXYsIGlu dCByb2xlKTsKIAlpbnQgKCpwZF90cmFuc21pdCkoc3RydWN0IHRjcGNfZGV2ICpkZXYsIGVudW0g dGNwbV90cmFuc21pdF90eXBlIHR5cGUsCiAJCQkgICBjb25zdCBzdHJ1Y3QgcGRfbWVzc2FnZSAq bXNnKTsKLQlzdHJ1Y3QgdGNwY19tdXhfZGV2ICptdXg7CiB9OwogCiBzdHJ1Y3QgdGNwbV9wb3J0 Owo=