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: [v6,09/13] usb: roles: Add usb role switch notifier. From: Yu Chen Message-Id: <20190420064019.57522-10-chenyu56@huawei.com> Date: Sat, 20 Apr 2019 14:40:15 +0800 To: linux-usb@vger.kernel.org, devicetree@vger.kernel.org, linux-kernel@vger.kernel.org Cc: john.stultz@linaro.org, suzhuangluan@hisilicon.com, kongfei@hisilicon.com, liuyu712@hisilicon.com, wanghu17@hisilicon.com, butao@hisilicon.com, chenyao11@huawei.com, fangshengzhou@hisilicon.com, lipengcheng8@huawei.com, songxiaowei@hisilicon.com, xuyiping@hisilicon.com, xuyoujun4@huawei.com, yudongbin@hisilicon.com, zangleigang@hisilicon.com, Yu Chen , Greg Kroah-Hartman , Heikki Krogerus , Hans de Goede , Andy Shevchenko List-ID: VGhpcyBwYXRjaCBhZGRzIG5vdGlmaWVyIGZvciBkcml2ZXJzIHdhbnQgdG8gYmUgaW5mb3JtZWQg b2YgdGhlIHVzYiByb2xlCnN3aXRjaC4KCkNjOiBHcmVnIEtyb2FoLUhhcnRtYW4gPGdyZWdraEBs aW51eGZvdW5kYXRpb24ub3JnPgpDYzogSGVpa2tpIEtyb2dlcnVzIDxoZWlra2kua3JvZ2VydXNA bGludXguaW50ZWwuY29tPgpDYzogSGFucyBkZSBHb2VkZSA8aGRlZ29lZGVAcmVkaGF0LmNvbT4K Q2M6IEFuZHkgU2hldmNoZW5rbyA8YW5keS5zaGV2Y2hlbmtvQGdtYWlsLmNvbT4KQ2M6IEpvaG4g U3R1bHR6IDxqb2huLnN0dWx0ekBsaW5hcm8ub3JnPgpTdWdnZXN0ZWQtYnk6IEhlaWtraSBLcm9n ZXJ1cyA8aGVpa2tpLmtyb2dlcnVzQGxpbnV4LmludGVsLmNvbT4KU2lnbmVkLW9mZi1ieTogWXUg Q2hlbiA8Y2hlbnl1NTZAaHVhd2VpLmNvbT4KLS0tCnY1OgoqIFNwbGl0IHRoZSBwYXRjaCBpbnRv IHR3byBwYXRjaGVzLCB0aGUgZmlyc3Qgb25lIGludHJvZHVjZXMgc3R1YnMgZm9yCiogdGhlCmV4 aXRpbmcgZnVuY3Rpb25zLCBhbmQgdGhpcyBwYXRjaCBhZGRzIG5vdGlmaWVyIGZ1bmN0aW9ucy4K djY6CiogRm9sZCBhIGZpeCBpbiBmb3JtIEpvaG4gU3R1bHR6IDxqb2huLnN0dWx0ekBsaW5hcm8u b3JnPi4KLS0tCi0tLQogZHJpdmVycy91c2Ivcm9sZXMvY2xhc3MuYyB8IDM1ICsrKysrKysrKysr KysrKysrKysrKysrKysrKysrKysrKystCiBpbmNsdWRlL2xpbnV4L3VzYi9yb2xlLmggIHwgMTYg KysrKysrKysrKysrKysrKwogMiBmaWxlcyBjaGFuZ2VkLCA1MCBpbnNlcnRpb25zKCspLCAxIGRl bGV0aW9uKC0pCgpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2Ivcm9sZXMvY2xhc3MuYyBiL2RyaXZl cnMvdXNiL3JvbGVzL2NsYXNzLmMKaW5kZXggZjQ1ZDhkZjVjZmI4Li41YmM2MGY0Nzg3MjUgMTAw NjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL3JvbGVzL2NsYXNzLmMKKysrIGIvZHJpdmVycy91c2Ivcm9s ZXMvY2xhc3MuYwpAQCAtMjAsNiArMjAsNyBAQCBzdHJ1Y3QgdXNiX3JvbGVfc3dpdGNoIHsKIAlz dHJ1Y3QgZGV2aWNlIGRldjsKIAlzdHJ1Y3QgbXV0ZXggbG9jazsgLyogZGV2aWNlIGxvY2sqLwog CWVudW0gdXNiX3JvbGUgcm9sZTsKKwlzdHJ1Y3QgYmxvY2tpbmdfbm90aWZpZXJfaGVhZCBuaDsK IAogCS8qIEZyb20gZGVzY3JpcHRvciAqLwogCXN0cnVjdCBkZXZpY2UgKnVzYjJfcG9ydDsKQEAg LTQ5LDggKzUwLDEwIEBAIGludCB1c2Jfcm9sZV9zd2l0Y2hfc2V0X3JvbGUoc3RydWN0IHVzYl9y b2xlX3N3aXRjaCAqc3csIGVudW0gdXNiX3JvbGUgcm9sZSkKIAltdXRleF9sb2NrKCZzdy0+bG9j ayk7CiAKIAlyZXQgPSBzdy0+c2V0KHN3LT5kZXYucGFyZW50LCByb2xlKTsKLQlpZiAoIXJldCkK KwlpZiAoIXJldCkgewogCQlzdy0+cm9sZSA9IHJvbGU7CisJCWJsb2NraW5nX25vdGlmaWVyX2Nh bGxfY2hhaW4oJnN3LT5uaCwgcm9sZSwgTlVMTCk7CisJfQogCiAJbXV0ZXhfdW5sb2NrKCZzdy0+ bG9jayk7CiAKQEAgLTU4LDYgKzYxLDM1IEBAIGludCB1c2Jfcm9sZV9zd2l0Y2hfc2V0X3JvbGUo c3RydWN0IHVzYl9yb2xlX3N3aXRjaCAqc3csIGVudW0gdXNiX3JvbGUgcm9sZSkKIH0KIEVYUE9S VF9TWU1CT0xfR1BMKHVzYl9yb2xlX3N3aXRjaF9zZXRfcm9sZSk7CiAKK2ludCB1c2Jfcm9sZV9z d2l0Y2hfcmVnaXN0ZXJfbm90aWZpZXIoc3RydWN0IHVzYl9yb2xlX3N3aXRjaCAqc3csCisJCQkJ ICAgICAgc3RydWN0IG5vdGlmaWVyX2Jsb2NrICpuYikKK3sKKwlpbnQgcmV0ID0gYmxvY2tpbmdf bm90aWZpZXJfY2hhaW5fcmVnaXN0ZXIoJnN3LT5uaCwgbmIpOworCWVudW0gdXNiX3JvbGUgcm9s ZTsKKworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwkvKiBJbml0aWFsaXplIHRoZSBub3Rp ZmllciB0aGF0IHdhcyBqdXN0IHJlZ2lzdGVyZWQgKi8KKwltdXRleF9sb2NrKCZzdy0+bG9jayk7 CisJaWYgKHN3LT5nZXQpCisJCXJvbGUgPSBzdy0+Z2V0KHN3LT5kZXYucGFyZW50KTsKKwllbHNl CisJCXJvbGUgPSBzdy0+cm9sZTsKKwlibG9ja2luZ19ub3RpZmllcl9jYWxsX2NoYWluKCZzdy0+ bmgsIHJvbGUsIE5VTEwpOworCW11dGV4X3VubG9jaygmc3ctPmxvY2spOworCisJcmV0dXJuIDA7 Cit9CitFWFBPUlRfU1lNQk9MX0dQTCh1c2Jfcm9sZV9zd2l0Y2hfcmVnaXN0ZXJfbm90aWZpZXIp OworCitpbnQgdXNiX3JvbGVfc3dpdGNoX3VucmVnaXN0ZXJfbm90aWZpZXIoc3RydWN0IHVzYl9y b2xlX3N3aXRjaCAqc3csCisJCQkJCXN0cnVjdCBub3RpZmllcl9ibG9jayAqbmIpCit7CisJcmV0 dXJuIGJsb2NraW5nX25vdGlmaWVyX2NoYWluX3VucmVnaXN0ZXIoJnN3LT5uaCwgbmIpOworfQor RVhQT1JUX1NZTUJPTF9HUEwodXNiX3JvbGVfc3dpdGNoX3VucmVnaXN0ZXJfbm90aWZpZXIpOwor CiAvKioKICAqIHVzYl9yb2xlX3N3aXRjaF9nZXRfcm9sZSAtIEdldCB0aGUgVVNCIHJvbGUgZm9y IGEgc3dpdGNoCiAgKiBAc3c6IFVTQiByb2xlIHN3aXRjaApAQCAtMjcxLDYgKzMwMyw3IEBAIHVz Yl9yb2xlX3N3aXRjaF9yZWdpc3RlcihzdHJ1Y3QgZGV2aWNlICpwYXJlbnQsCiAJCXJldHVybiBF UlJfUFRSKC1FTk9NRU0pOwogCiAJbXV0ZXhfaW5pdCgmc3ctPmxvY2spOworCUJMT0NLSU5HX0lO SVRfTk9USUZJRVJfSEVBRCgmc3ctPm5oKTsKIAogCXN3LT5hbGxvd191c2Vyc3BhY2VfY29udHJv bCA9IGRlc2MtPmFsbG93X3VzZXJzcGFjZV9jb250cm9sOwogCXN3LT51c2IyX3BvcnQgPSBkZXNj LT51c2IyX3BvcnQ7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3VzYi9yb2xlLmggYi9pbmNs dWRlL2xpbnV4L3VzYi9yb2xlLmgKaW5kZXggZGEyYjk2NDFiODc3Li45OWQ4YjhlNGZlNjEgMTAw NjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvdXNiL3JvbGUuaAorKysgYi9pbmNsdWRlL2xpbnV4L3Vz Yi9yb2xlLmgKQEAgLTUzLDYgKzUzLDEwIEBAIHN0cnVjdCB1c2Jfcm9sZV9zd2l0Y2ggKgogdXNi X3JvbGVfc3dpdGNoX3JlZ2lzdGVyKHN0cnVjdCBkZXZpY2UgKnBhcmVudCwKIAkJCSBjb25zdCBz dHJ1Y3QgdXNiX3JvbGVfc3dpdGNoX2Rlc2MgKmRlc2MpOwogdm9pZCB1c2Jfcm9sZV9zd2l0Y2hf dW5yZWdpc3RlcihzdHJ1Y3QgdXNiX3JvbGVfc3dpdGNoICpzdyk7CitpbnQgdXNiX3JvbGVfc3dp dGNoX3JlZ2lzdGVyX25vdGlmaWVyKHN0cnVjdCB1c2Jfcm9sZV9zd2l0Y2ggKnN3LAorCQkJCSAg ICAgIHN0cnVjdCBub3RpZmllcl9ibG9jayAqbmIpOworaW50IHVzYl9yb2xlX3N3aXRjaF91bnJl Z2lzdGVyX25vdGlmaWVyKHN0cnVjdCB1c2Jfcm9sZV9zd2l0Y2ggKnN3LAorCQkJCQlzdHJ1Y3Qg bm90aWZpZXJfYmxvY2sgKm5iKTsKICNlbHNlCiBzdGF0aWMgaW5saW5lIGludCB1c2Jfcm9sZV9z d2l0Y2hfc2V0X3JvbGUoc3RydWN0IHVzYl9yb2xlX3N3aXRjaCAqc3csCiAJCWVudW0gdXNiX3Jv bGUgcm9sZSkKQEAgLTgwLDYgKzg0LDE4IEBAIHVzYl9yb2xlX3N3aXRjaF9yZWdpc3RlcihzdHJ1 Y3QgZGV2aWNlICpwYXJlbnQsCiB9CiAKIHN0YXRpYyBpbmxpbmUgdm9pZCB1c2Jfcm9sZV9zd2l0 Y2hfdW5yZWdpc3RlcihzdHJ1Y3QgdXNiX3JvbGVfc3dpdGNoICpzdykgeyB9CisKK3N0YXRpYyBp bnQgdXNiX3JvbGVfc3dpdGNoX3JlZ2lzdGVyX25vdGlmaWVyKHN0cnVjdCB1c2Jfcm9sZV9zd2l0 Y2ggKnN3LAorCQkJCSAgICAgIHN0cnVjdCBub3RpZmllcl9ibG9jayAqbmIpCit7CisJcmV0dXJu IC1FTk9ERVY7Cit9CisKK3N0YXRpYyBpbnQgdXNiX3JvbGVfc3dpdGNoX3VucmVnaXN0ZXJfbm90 aWZpZXIoc3RydWN0IHVzYl9yb2xlX3N3aXRjaCAqc3csCisJCQkJCXN0cnVjdCBub3RpZmllcl9i bG9jayAqbmIpCit7CisJcmV0dXJuIC1FTk9ERVY7Cit9CiAjZW5kaWYKIAogI2VuZGlmIC8qIF9f TElOVVhfVVNCX1JPTEVfSCAqLwo= From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-8.9 required=3.0 tests=HEADER_FROM_DIFFERENT_DOMAINS, INCLUDES_PATCH,MAILING_LIST_MULTI,SIGNED_OFF_BY,SPF_PASS,URIBL_BLOCKED, USER_AGENT_GIT autolearn=unavailable autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 1D80DC282E2 for ; Sat, 20 Apr 2019 06:41:32 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id DA22121855 for ; Sat, 20 Apr 2019 06:41:31 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1727983AbfDTGlV (ORCPT ); Sat, 20 Apr 2019 02:41:21 -0400 Received: from szxga04-in.huawei.com ([45.249.212.190]:6668 "EHLO huawei.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1727273AbfDTGkm (ORCPT ); Sat, 20 Apr 2019 02:40:42 -0400 Received: from DGGEMS410-HUB.china.huawei.com (unknown [172.30.72.59]) by Forcepoint Email with ESMTP id 52624E6F668A6B2B6076; Sat, 20 Apr 2019 14:40:39 +0800 (CST) Received: from vm100-107-113-134.huawei.com (100.107.113.134) by DGGEMS410-HUB.china.huawei.com (10.3.19.210) with Microsoft SMTP Server id 14.3.408.0; Sat, 20 Apr 2019 14:40:31 +0800 From: Yu Chen To: , , CC: , , , , , , , , , , , , , , Yu Chen , "Greg Kroah-Hartman" , Heikki Krogerus , Hans de Goede , "Andy Shevchenko" Subject: [PATCH v6 09/13] usb: roles: Add usb role switch notifier. Date: Sat, 20 Apr 2019 14:40:15 +0800 Message-ID: <20190420064019.57522-10-chenyu56@huawei.com> X-Mailer: git-send-email 2.15.0-rc2 In-Reply-To: <20190420064019.57522-1-chenyu56@huawei.com> References: <20190420064019.57522-1-chenyu56@huawei.com> MIME-Version: 1.0 Content-Type: text/plain; charset="UTF-8" X-Originating-IP: [100.107.113.134] X-CFilter-Loop: Reflected Sender: linux-usb-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-usb@vger.kernel.org Message-ID: <20190420064015.rJW3L3YInBh2PMi0g8Ue7Uod7WfN6yewcU0_CQqqQZ8@z> This patch adds notifier for drivers want to be informed of the usb role switch. Cc: Greg Kroah-Hartman Cc: Heikki Krogerus Cc: Hans de Goede Cc: Andy Shevchenko Cc: John Stultz Suggested-by: Heikki Krogerus Signed-off-by: Yu Chen --- v5: * Split the patch into two patches, the first one introduces stubs for * the exiting functions, and this patch adds notifier functions. v6: * Fold a fix in form John Stultz . --- --- drivers/usb/roles/class.c | 35 ++++++++++++++++++++++++++++++++++- include/linux/usb/role.h | 16 ++++++++++++++++ 2 files changed, 50 insertions(+), 1 deletion(-) diff --git a/drivers/usb/roles/class.c b/drivers/usb/roles/class.c index f45d8df5cfb8..5bc60f478725 100644 --- a/drivers/usb/roles/class.c +++ b/drivers/usb/roles/class.c @@ -20,6 +20,7 @@ struct usb_role_switch { struct device dev; struct mutex lock; /* device lock*/ enum usb_role role; + struct blocking_notifier_head nh; /* From descriptor */ struct device *usb2_port; @@ -49,8 +50,10 @@ int usb_role_switch_set_role(struct usb_role_switch *sw, enum usb_role role) mutex_lock(&sw->lock); ret = sw->set(sw->dev.parent, role); - if (!ret) + if (!ret) { sw->role = role; + blocking_notifier_call_chain(&sw->nh, role, NULL); + } mutex_unlock(&sw->lock); @@ -58,6 +61,35 @@ int usb_role_switch_set_role(struct usb_role_switch *sw, enum usb_role role) } EXPORT_SYMBOL_GPL(usb_role_switch_set_role); +int usb_role_switch_register_notifier(struct usb_role_switch *sw, + struct notifier_block *nb) +{ + int ret = blocking_notifier_chain_register(&sw->nh, nb); + enum usb_role role; + + if (ret) + return ret; + + /* Initialize the notifier that was just registered */ + mutex_lock(&sw->lock); + if (sw->get) + role = sw->get(sw->dev.parent); + else + role = sw->role; + blocking_notifier_call_chain(&sw->nh, role, NULL); + mutex_unlock(&sw->lock); + + return 0; +} +EXPORT_SYMBOL_GPL(usb_role_switch_register_notifier); + +int usb_role_switch_unregister_notifier(struct usb_role_switch *sw, + struct notifier_block *nb) +{ + return blocking_notifier_chain_unregister(&sw->nh, nb); +} +EXPORT_SYMBOL_GPL(usb_role_switch_unregister_notifier); + /** * usb_role_switch_get_role - Get the USB role for a switch * @sw: USB role switch @@ -271,6 +303,7 @@ usb_role_switch_register(struct device *parent, return ERR_PTR(-ENOMEM); mutex_init(&sw->lock); + BLOCKING_INIT_NOTIFIER_HEAD(&sw->nh); sw->allow_userspace_control = desc->allow_userspace_control; sw->usb2_port = desc->usb2_port; diff --git a/include/linux/usb/role.h b/include/linux/usb/role.h index da2b9641b877..99d8b8e4fe61 100644 --- a/include/linux/usb/role.h +++ b/include/linux/usb/role.h @@ -53,6 +53,10 @@ struct usb_role_switch * usb_role_switch_register(struct device *parent, const struct usb_role_switch_desc *desc); void usb_role_switch_unregister(struct usb_role_switch *sw); +int usb_role_switch_register_notifier(struct usb_role_switch *sw, + struct notifier_block *nb); +int usb_role_switch_unregister_notifier(struct usb_role_switch *sw, + struct notifier_block *nb); #else static inline int usb_role_switch_set_role(struct usb_role_switch *sw, enum usb_role role) @@ -80,6 +84,18 @@ usb_role_switch_register(struct device *parent, } static inline void usb_role_switch_unregister(struct usb_role_switch *sw) { } + +static int usb_role_switch_register_notifier(struct usb_role_switch *sw, + struct notifier_block *nb) +{ + return -ENODEV; +} + +static int usb_role_switch_unregister_notifier(struct usb_role_switch *sw, + struct notifier_block *nb) +{ + return -ENODEV; +} #endif #endif /* __LINUX_USB_ROLE_H */ -- 2.15.0-rc2