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=-9.0 required=3.0 tests=HEADER_FROM_DIFFERENT_DOMAINS, INCLUDES_PATCH,MAILING_LIST_MULTI,SIGNED_OFF_BY,SPF_PASS,URIBL_BLOCKED, USER_AGENT_GIT autolearn=ham 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 86D55C64EB4 for ; Mon, 3 Dec 2018 03:46:17 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id 4A1C720848 for ; Mon, 3 Dec 2018 03:46:17 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 4A1C720848 Authentication-Results: mail.kernel.org; dmarc=none (p=none dis=none) header.from=huawei.com Authentication-Results: mail.kernel.org; spf=none smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1726083AbeLCDqQ (ORCPT ); Sun, 2 Dec 2018 22:46:16 -0500 Received: from szxga05-in.huawei.com ([45.249.212.191]:15188 "EHLO huawei.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1725958AbeLCDps (ORCPT ); Sun, 2 Dec 2018 22:45:48 -0500 Received: from DGGEMS412-HUB.china.huawei.com (unknown [172.30.72.60]) by Forcepoint Email with ESMTP id 64AF18D87EB0E; Mon, 3 Dec 2018 11:45:42 +0800 (CST) Received: from vm100-107-113-134.huawei.com (100.107.113.134) by DGGEMS412-HUB.china.huawei.com (10.3.19.212) with Microsoft SMTP Server id 14.3.408.0; Mon, 3 Dec 2018 11:45:35 +0800 From: Yu Chen To: , , CC: , , Yu Chen , Arnd Bergmann , Greg Kroah-Hartman , John Stultz , "Binghui Wang" , Heikki Krogerus Subject: [PATCH v1 10/12] hikey960: Support usb functionality of Hikey960 Date: Mon, 3 Dec 2018 11:45:13 +0800 Message-ID: <20181203034515.91412-11-chenyu56@huawei.com> X-Mailer: git-send-email 2.15.0-rc2 In-Reply-To: <20181203034515.91412-1-chenyu56@huawei.com> References: <20181203034515.91412-1-chenyu56@huawei.com> MIME-Version: 1.0 Content-Type: text/plain X-Originating-IP: [100.107.113.134] X-CFilter-Loop: Reflected Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org This driver handles usb hub power on and typeC port event of HiKey960 board: 1)DP&DM switching between usb hub and typeC port base on typeC port state 2)Control power of usb hub on Hikey960 3)Control vbus of typeC port Cc: Arnd Bergmann Cc: Greg Kroah-Hartman Cc: John Stultz Cc: Binghui Wang Cc: Heikki Krogerus Signed-off-by: Yu Chen -- v1: 1) Using gpiod API with the gpios. 2) Removing registering usb role switch. 3) Registering usb role switch notifier. -- --- drivers/misc/Kconfig | 7 ++ drivers/misc/Makefile | 1 + drivers/misc/hisi_hikey_usb.c | 198 ++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 206 insertions(+) create mode 100644 drivers/misc/hisi_hikey_usb.c diff --git a/drivers/misc/Kconfig b/drivers/misc/Kconfig index 3726eacdf65d..8e04fc87b685 100644 --- a/drivers/misc/Kconfig +++ b/drivers/misc/Kconfig @@ -513,6 +513,13 @@ config MISC_RTSX tristate default MISC_RTSX_PCI || MISC_RTSX_USB +config HISI_HIKEY_USB + tristate "USB functionality of HiSilicon Hikey Platform" + depends on GPIOLIB + default n + help + If you say yes here you get support for usb functionality of HiSilicon Hikey Platform. + source "drivers/misc/c2port/Kconfig" source "drivers/misc/eeprom/Kconfig" source "drivers/misc/cb710/Kconfig" diff --git a/drivers/misc/Makefile b/drivers/misc/Makefile index af22bbc3d00c..387dd302815c 100644 --- a/drivers/misc/Makefile +++ b/drivers/misc/Makefile @@ -58,3 +58,4 @@ obj-$(CONFIG_ASPEED_LPC_SNOOP) += aspeed-lpc-snoop.o obj-$(CONFIG_PCI_ENDPOINT_TEST) += pci_endpoint_test.o obj-$(CONFIG_OCXL) += ocxl/ obj-$(CONFIG_MISC_RTSX) += cardreader/ +obj-$(CONFIG_HISI_HIKEY_USB) += hisi_hikey_usb.o diff --git a/drivers/misc/hisi_hikey_usb.c b/drivers/misc/hisi_hikey_usb.c new file mode 100644 index 000000000000..f320ed878e44 --- /dev/null +++ b/drivers/misc/hisi_hikey_usb.c @@ -0,0 +1,198 @@ +// SPDX-License-Identifier: GPL-2.0+ +/* + * hisi_hikey_usb.c + * + * Copyright (c) Hisilicon Tech. Co., Ltd. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + */ + +#include +#include +#include +#include +#include +#include +#include +#include + +#define DEVICE_DRIVER_NAME "hisi_hikey_usb" + +#define HUB_VBUS_POWER_ON 1 +#define HUB_VBUS_POWER_OFF 0 +#define USB_SWITCH_TO_HUB 1 +#define USB_SWITCH_TO_TYPEC 0 + +struct hisi_hikey_usb { + struct gpio_desc *otg_switch; + struct gpio_desc *typec_vbus; + struct gpio_desc *hub_vbus; + int typec_vbus_enable_val; + + struct usb_role_switch *role_sw; + struct notifier_block nb; +}; + +static void hub_power_ctrl(struct hisi_hikey_usb *hisi_hikey_usb, int value) +{ + pr_debug("%s: set hub power %d\n", __func__, value); + gpiod_set_value_cansleep(hisi_hikey_usb->hub_vbus, value); +} + +static void usb_switch_ctrl(struct hisi_hikey_usb *hisi_hikey_usb, + int switch_to) +{ + const char *switch_to_str = (switch_to == USB_SWITCH_TO_HUB) ? + "hub" : "typec"; + + pr_debug("%s: switch to %s\n", __func__, switch_to_str); + gpiod_set_value_cansleep(hisi_hikey_usb->otg_switch, switch_to); +} + +static void usb_typec_power_ctrl(struct hisi_hikey_usb *hisi_hikey_usb, + int value) +{ + pr_debug("%s: set typec vbus gpio to %d\n", __func__, value); + gpiod_set_value_cansleep(hisi_hikey_usb->typec_vbus, value); +} + +static int hisi_hikey_role_switch(struct notifier_block *nb, + unsigned long state, void *data) +{ + struct hisi_hikey_usb *hisi_hikey_usb; + + if (!nb) + return -EINVAL; + + hisi_hikey_usb = container_of(nb, struct hisi_hikey_usb, nb); + + pr_info("%s:set typec state to %lu\n", __func__, state); + switch (state) { + case USB_ROLE_NONE: + usb_typec_power_ctrl(hisi_hikey_usb, + !hisi_hikey_usb->typec_vbus_enable_val); + usb_switch_ctrl(hisi_hikey_usb, USB_SWITCH_TO_HUB); + hub_power_ctrl(hisi_hikey_usb, HUB_VBUS_POWER_ON); + break; + case USB_ROLE_HOST: + usb_switch_ctrl(hisi_hikey_usb, USB_SWITCH_TO_TYPEC); + usb_typec_power_ctrl(hisi_hikey_usb, + hisi_hikey_usb->typec_vbus_enable_val); + break; + case USB_ROLE_DEVICE: + hub_power_ctrl(hisi_hikey_usb, HUB_VBUS_POWER_OFF); + usb_typec_power_ctrl(hisi_hikey_usb, + !hisi_hikey_usb->typec_vbus_enable_val); + usb_switch_ctrl(hisi_hikey_usb, USB_SWITCH_TO_TYPEC); + break; + default: + break; + } + + return 0; +} + +static int hisi_hikey_usb_probe(struct platform_device *pdev) +{ + struct device *dev = &pdev->dev; + struct device_node *root = dev->of_node; + struct hisi_hikey_usb *hisi_hikey_usb; + int ret; + + hisi_hikey_usb = devm_kzalloc(dev, sizeof(*hisi_hikey_usb), GFP_KERNEL); + if (!hisi_hikey_usb) + return -ENOMEM; + + hisi_hikey_usb->nb.notifier_call = hisi_hikey_role_switch; + + ret = of_property_read_u32(root, "typc-vbus-enable-val", + &hisi_hikey_usb->typec_vbus_enable_val); + if (ret) { + pr_info("%s: typc_vbus_enable_val can't get\n", __func__); + hisi_hikey_usb->typec_vbus_enable_val = 1; + } + + hisi_hikey_usb->typec_vbus = devm_gpiod_get(dev, "typec-vbus", + hisi_hikey_usb->typec_vbus_enable_val ? + GPIOD_OUT_LOW : GPIOD_OUT_HIGH); + if (IS_ERR_OR_NULL(hisi_hikey_usb->typec_vbus)) { + if (!hisi_hikey_usb->typec_vbus) + ret = -EINVAL; + else + ret = PTR_ERR(hisi_hikey_usb->typec_vbus); + return ret; + } + + hisi_hikey_usb->otg_switch = devm_gpiod_get(dev, "otg-switch", GPIOD_IN); + if (IS_ERR(hisi_hikey_usb->otg_switch)) + return PTR_ERR(hisi_hikey_usb->otg_switch); + + hisi_hikey_usb->hub_vbus = devm_gpiod_get(dev, "hub-vdd33-en", + GPIOD_OUT_LOW); + if (IS_ERR(hisi_hikey_usb->hub_vbus)) + return PTR_ERR(hisi_hikey_usb->hub_vbus); + + hisi_hikey_usb->role_sw = usb_role_switch_get(dev); + if (IS_ERR_OR_NULL(hisi_hikey_usb->role_sw)) { + pr_err("%s: usb_role_switch_get failed\n", __func__); + if (!hisi_hikey_usb->role_sw) + ret = -ENOENT; + else + ret = PTR_ERR(hisi_hikey_usb->role_sw); + return ret; + } + + ret = usb_role_switch_register_notifier(hisi_hikey_usb->role_sw, + &hisi_hikey_usb->nb); + if (ret) { + usb_role_switch_put(hisi_hikey_usb->role_sw); + return ret; + } + + platform_set_drvdata(pdev, hisi_hikey_usb); + + return 0; +} + +static int hisi_hikey_usb_remove(struct platform_device *pdev) +{ + struct hisi_hikey_usb *hisi_hikey_usb = platform_get_drvdata(pdev); + + usb_role_switch_unregister_notifier(hisi_hikey_usb->role_sw, + &hisi_hikey_usb->nb); + + usb_role_switch_put(hisi_hikey_usb->role_sw); + + return 0; +} + +static const struct of_device_id id_table_hisi_hikey_usb[] = { + {.compatible = "hisilicon,gpio_hubv1"}, + {.compatible = "hisilicon,hikey960_usb"}, + {} +}; + +static struct platform_driver hisi_hikey_usb_driver = { + .probe = hisi_hikey_usb_probe, + .remove = hisi_hikey_usb_remove, + .driver = { + .name = DEVICE_DRIVER_NAME, + .of_match_table = of_match_ptr(id_table_hisi_hikey_usb), + + }, +}; + +module_platform_driver(hisi_hikey_usb_driver); + +MODULE_AUTHOR("Yu Chen "); +MODULE_DESCRIPTION("Driver Support for USB functionality of Hikey"); +MODULE_LICENSE("GPL v2"); -- 2.15.0-rc2 From mboxrd@z Thu Jan 1 00:00:00 1970 From: Yu Chen Subject: [PATCH v1 10/12] hikey960: Support usb functionality of Hikey960 Date: Mon, 3 Dec 2018 11:45:13 +0800 Message-ID: <20181203034515.91412-11-chenyu56@huawei.com> References: <20181203034515.91412-1-chenyu56@huawei.com> Mime-Version: 1.0 Content-Type: text/plain Return-path: In-Reply-To: <20181203034515.91412-1-chenyu56@huawei.com> Sender: linux-kernel-owner@vger.kernel.org To: linux-usb@vger.kernel.org, devicetree@vger.kernel.org, linux-kernel@vger.kernel.org Cc: suzhuangluan@hisilicon.com, kongfei@hisilicon.com, Yu Chen , Arnd Bergmann , Greg Kroah-Hartman , John Stultz , Binghui Wang , Heikki Krogerus List-Id: devicetree@vger.kernel.org This driver handles usb hub power on and typeC port event of HiKey960 board: 1)DP&DM switching between usb hub and typeC port base on typeC port state 2)Control power of usb hub on Hikey960 3)Control vbus of typeC port Cc: Arnd Bergmann Cc: Greg Kroah-Hartman Cc: John Stultz Cc: Binghui Wang Cc: Heikki Krogerus Signed-off-by: Yu Chen -- v1: 1) Using gpiod API with the gpios. 2) Removing registering usb role switch. 3) Registering usb role switch notifier. -- --- drivers/misc/Kconfig | 7 ++ drivers/misc/Makefile | 1 + drivers/misc/hisi_hikey_usb.c | 198 ++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 206 insertions(+) create mode 100644 drivers/misc/hisi_hikey_usb.c diff --git a/drivers/misc/Kconfig b/drivers/misc/Kconfig index 3726eacdf65d..8e04fc87b685 100644 --- a/drivers/misc/Kconfig +++ b/drivers/misc/Kconfig @@ -513,6 +513,13 @@ config MISC_RTSX tristate default MISC_RTSX_PCI || MISC_RTSX_USB +config HISI_HIKEY_USB + tristate "USB functionality of HiSilicon Hikey Platform" + depends on GPIOLIB + default n + help + If you say yes here you get support for usb functionality of HiSilicon Hikey Platform. + source "drivers/misc/c2port/Kconfig" source "drivers/misc/eeprom/Kconfig" source "drivers/misc/cb710/Kconfig" diff --git a/drivers/misc/Makefile b/drivers/misc/Makefile index af22bbc3d00c..387dd302815c 100644 --- a/drivers/misc/Makefile +++ b/drivers/misc/Makefile @@ -58,3 +58,4 @@ obj-$(CONFIG_ASPEED_LPC_SNOOP) += aspeed-lpc-snoop.o obj-$(CONFIG_PCI_ENDPOINT_TEST) += pci_endpoint_test.o obj-$(CONFIG_OCXL) += ocxl/ obj-$(CONFIG_MISC_RTSX) += cardreader/ +obj-$(CONFIG_HISI_HIKEY_USB) += hisi_hikey_usb.o diff --git a/drivers/misc/hisi_hikey_usb.c b/drivers/misc/hisi_hikey_usb.c new file mode 100644 index 000000000000..f320ed878e44 --- /dev/null +++ b/drivers/misc/hisi_hikey_usb.c @@ -0,0 +1,198 @@ +// SPDX-License-Identifier: GPL-2.0+ +/* + * hisi_hikey_usb.c + * + * Copyright (c) Hisilicon Tech. Co., Ltd. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + */ + +#include +#include +#include +#include +#include +#include +#include +#include + +#define DEVICE_DRIVER_NAME "hisi_hikey_usb" + +#define HUB_VBUS_POWER_ON 1 +#define HUB_VBUS_POWER_OFF 0 +#define USB_SWITCH_TO_HUB 1 +#define USB_SWITCH_TO_TYPEC 0 + +struct hisi_hikey_usb { + struct gpio_desc *otg_switch; + struct gpio_desc *typec_vbus; + struct gpio_desc *hub_vbus; + int typec_vbus_enable_val; + + struct usb_role_switch *role_sw; + struct notifier_block nb; +}; + +static void hub_power_ctrl(struct hisi_hikey_usb *hisi_hikey_usb, int value) +{ + pr_debug("%s: set hub power %d\n", __func__, value); + gpiod_set_value_cansleep(hisi_hikey_usb->hub_vbus, value); +} + +static void usb_switch_ctrl(struct hisi_hikey_usb *hisi_hikey_usb, + int switch_to) +{ + const char *switch_to_str = (switch_to == USB_SWITCH_TO_HUB) ? + "hub" : "typec"; + + pr_debug("%s: switch to %s\n", __func__, switch_to_str); + gpiod_set_value_cansleep(hisi_hikey_usb->otg_switch, switch_to); +} + +static void usb_typec_power_ctrl(struct hisi_hikey_usb *hisi_hikey_usb, + int value) +{ + pr_debug("%s: set typec vbus gpio to %d\n", __func__, value); + gpiod_set_value_cansleep(hisi_hikey_usb->typec_vbus, value); +} + +static int hisi_hikey_role_switch(struct notifier_block *nb, + unsigned long state, void *data) +{ + struct hisi_hikey_usb *hisi_hikey_usb; + + if (!nb) + return -EINVAL; + + hisi_hikey_usb = container_of(nb, struct hisi_hikey_usb, nb); + + pr_info("%s:set typec state to %lu\n", __func__, state); + switch (state) { + case USB_ROLE_NONE: + usb_typec_power_ctrl(hisi_hikey_usb, + !hisi_hikey_usb->typec_vbus_enable_val); + usb_switch_ctrl(hisi_hikey_usb, USB_SWITCH_TO_HUB); + hub_power_ctrl(hisi_hikey_usb, HUB_VBUS_POWER_ON); + break; + case USB_ROLE_HOST: + usb_switch_ctrl(hisi_hikey_usb, USB_SWITCH_TO_TYPEC); + usb_typec_power_ctrl(hisi_hikey_usb, + hisi_hikey_usb->typec_vbus_enable_val); + break; + case USB_ROLE_DEVICE: + hub_power_ctrl(hisi_hikey_usb, HUB_VBUS_POWER_OFF); + usb_typec_power_ctrl(hisi_hikey_usb, + !hisi_hikey_usb->typec_vbus_enable_val); + usb_switch_ctrl(hisi_hikey_usb, USB_SWITCH_TO_TYPEC); + break; + default: + break; + } + + return 0; +} + +static int hisi_hikey_usb_probe(struct platform_device *pdev) +{ + struct device *dev = &pdev->dev; + struct device_node *root = dev->of_node; + struct hisi_hikey_usb *hisi_hikey_usb; + int ret; + + hisi_hikey_usb = devm_kzalloc(dev, sizeof(*hisi_hikey_usb), GFP_KERNEL); + if (!hisi_hikey_usb) + return -ENOMEM; + + hisi_hikey_usb->nb.notifier_call = hisi_hikey_role_switch; + + ret = of_property_read_u32(root, "typc-vbus-enable-val", + &hisi_hikey_usb->typec_vbus_enable_val); + if (ret) { + pr_info("%s: typc_vbus_enable_val can't get\n", __func__); + hisi_hikey_usb->typec_vbus_enable_val = 1; + } + + hisi_hikey_usb->typec_vbus = devm_gpiod_get(dev, "typec-vbus", + hisi_hikey_usb->typec_vbus_enable_val ? + GPIOD_OUT_LOW : GPIOD_OUT_HIGH); + if (IS_ERR_OR_NULL(hisi_hikey_usb->typec_vbus)) { + if (!hisi_hikey_usb->typec_vbus) + ret = -EINVAL; + else + ret = PTR_ERR(hisi_hikey_usb->typec_vbus); + return ret; + } + + hisi_hikey_usb->otg_switch = devm_gpiod_get(dev, "otg-switch", GPIOD_IN); + if (IS_ERR(hisi_hikey_usb->otg_switch)) + return PTR_ERR(hisi_hikey_usb->otg_switch); + + hisi_hikey_usb->hub_vbus = devm_gpiod_get(dev, "hub-vdd33-en", + GPIOD_OUT_LOW); + if (IS_ERR(hisi_hikey_usb->hub_vbus)) + return PTR_ERR(hisi_hikey_usb->hub_vbus); + + hisi_hikey_usb->role_sw = usb_role_switch_get(dev); + if (IS_ERR_OR_NULL(hisi_hikey_usb->role_sw)) { + pr_err("%s: usb_role_switch_get failed\n", __func__); + if (!hisi_hikey_usb->role_sw) + ret = -ENOENT; + else + ret = PTR_ERR(hisi_hikey_usb->role_sw); + return ret; + } + + ret = usb_role_switch_register_notifier(hisi_hikey_usb->role_sw, + &hisi_hikey_usb->nb); + if (ret) { + usb_role_switch_put(hisi_hikey_usb->role_sw); + return ret; + } + + platform_set_drvdata(pdev, hisi_hikey_usb); + + return 0; +} + +static int hisi_hikey_usb_remove(struct platform_device *pdev) +{ + struct hisi_hikey_usb *hisi_hikey_usb = platform_get_drvdata(pdev); + + usb_role_switch_unregister_notifier(hisi_hikey_usb->role_sw, + &hisi_hikey_usb->nb); + + usb_role_switch_put(hisi_hikey_usb->role_sw); + + return 0; +} + +static const struct of_device_id id_table_hisi_hikey_usb[] = { + {.compatible = "hisilicon,gpio_hubv1"}, + {.compatible = "hisilicon,hikey960_usb"}, + {} +}; + +static struct platform_driver hisi_hikey_usb_driver = { + .probe = hisi_hikey_usb_probe, + .remove = hisi_hikey_usb_remove, + .driver = { + .name = DEVICE_DRIVER_NAME, + .of_match_table = of_match_ptr(id_table_hisi_hikey_usb), + + }, +}; + +module_platform_driver(hisi_hikey_usb_driver); + +MODULE_AUTHOR("Yu Chen "); +MODULE_DESCRIPTION("Driver Support for USB functionality of Hikey"); +MODULE_LICENSE("GPL v2"); -- 2.15.0-rc2 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: [v1,10/12] hikey960: Support usb functionality of Hikey960 From: Yu Chen Message-Id: <20181203034515.91412-11-chenyu56@huawei.com> Date: Mon, 3 Dec 2018 11:45:13 +0800 To: linux-usb@vger.kernel.org, devicetree@vger.kernel.org, linux-kernel@vger.kernel.org Cc: suzhuangluan@hisilicon.com, kongfei@hisilicon.com, Yu Chen , Arnd Bergmann , Greg Kroah-Hartman , John Stultz , Binghui Wang , Heikki Krogerus List-ID: VGhpcyBkcml2ZXIgaGFuZGxlcyB1c2IgaHViIHBvd2VyIG9uIGFuZCB0eXBlQyBwb3J0IGV2ZW50 IG9mIEhpS2V5OTYwIGJvYXJkOgoxKURQJkRNIHN3aXRjaGluZyBiZXR3ZWVuIHVzYiBodWIgYW5k IHR5cGVDIHBvcnQgYmFzZSBvbiB0eXBlQyBwb3J0CnN0YXRlCjIpQ29udHJvbCBwb3dlciBvZiB1 c2IgaHViIG9uIEhpa2V5OTYwCjMpQ29udHJvbCB2YnVzIG9mIHR5cGVDIHBvcnQKCkNjOiBBcm5k IEJlcmdtYW5uIDxhcm5kQGFybmRiLmRlPgpDYzogR3JlZyBLcm9haC1IYXJ0bWFuIDxncmVna2hA bGludXhmb3VuZGF0aW9uLm9yZz4KQ2M6IEpvaG4gU3R1bHR6IDxqb2huLnN0dWx0ekBsaW5hcm8u b3JnPgpDYzogQmluZ2h1aSBXYW5nIDx3YW5nYmluZ2h1aUBoaXNpbGljb24uY29tPgpDYzogSGVp a2tpIEtyb2dlcnVzIDxoZWlra2kua3JvZ2VydXNAbGludXguaW50ZWwuY29tPgpTaWduZWQtb2Zm LWJ5OiBZdSBDaGVuIDxjaGVueXU1NkBodWF3ZWkuY29tPgotLS0KdjE6CjEpIFVzaW5nIGdwaW9k IEFQSSB3aXRoIHRoZSBncGlvcy4KMikgUmVtb3ZpbmcgcmVnaXN0ZXJpbmcgdXNiIHJvbGUgc3dp dGNoLgozKSBSZWdpc3RlcmluZyB1c2Igcm9sZSBzd2l0Y2ggbm90aWZpZXIuCi0tCi0tLQogZHJp dmVycy9taXNjL0tjb25maWcgICAgICAgICAgfCAgIDcgKysKIGRyaXZlcnMvbWlzYy9NYWtlZmls ZSAgICAgICAgIHwgICAxICsKIGRyaXZlcnMvbWlzYy9oaXNpX2hpa2V5X3VzYi5jIHwgMTk4ICsr KysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKwogMyBmaWxlcyBjaGFuZ2Vk LCAyMDYgaW5zZXJ0aW9ucygrKQogY3JlYXRlIG1vZGUgMTAwNjQ0IGRyaXZlcnMvbWlzYy9oaXNp X2hpa2V5X3VzYi5jCgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9taXNjL0tjb25maWcgYi9kcml2ZXJz L21pc2MvS2NvbmZpZwppbmRleCAzNzI2ZWFjZGY2NWQuLjhlMDRmYzg3YjY4NSAxMDA2NDQKLS0t IGEvZHJpdmVycy9taXNjL0tjb25maWcKKysrIGIvZHJpdmVycy9taXNjL0tjb25maWcKQEAgLTUx Myw2ICs1MTMsMTMgQEAgY29uZmlnIE1JU0NfUlRTWAogCXRyaXN0YXRlCiAJZGVmYXVsdCBNSVND X1JUU1hfUENJIHx8IE1JU0NfUlRTWF9VU0IKIAorY29uZmlnIEhJU0lfSElLRVlfVVNCCisJdHJp c3RhdGUgIlVTQiBmdW5jdGlvbmFsaXR5IG9mIEhpU2lsaWNvbiBIaWtleSBQbGF0Zm9ybSIKKwlk ZXBlbmRzIG9uIEdQSU9MSUIKKwlkZWZhdWx0IG4KKwloZWxwCisJICBJZiB5b3Ugc2F5IHllcyBo ZXJlIHlvdSBnZXQgc3VwcG9ydCBmb3IgdXNiIGZ1bmN0aW9uYWxpdHkgb2YgSGlTaWxpY29uIEhp a2V5IFBsYXRmb3JtLgorCiBzb3VyY2UgImRyaXZlcnMvbWlzYy9jMnBvcnQvS2NvbmZpZyIKIHNv dXJjZSAiZHJpdmVycy9taXNjL2VlcHJvbS9LY29uZmlnIgogc291cmNlICJkcml2ZXJzL21pc2Mv Y2I3MTAvS2NvbmZpZyIKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWlzYy9NYWtlZmlsZSBiL2RyaXZl cnMvbWlzYy9NYWtlZmlsZQppbmRleCBhZjIyYmJjM2QwMGMuLjM4N2RkMzAyODE1YyAxMDA2NDQK LS0tIGEvZHJpdmVycy9taXNjL01ha2VmaWxlCisrKyBiL2RyaXZlcnMvbWlzYy9NYWtlZmlsZQpA QCAtNTgsMyArNTgsNCBAQCBvYmotJChDT05GSUdfQVNQRUVEX0xQQ19TTk9PUCkJKz0gYXNwZWVk LWxwYy1zbm9vcC5vCiBvYmotJChDT05GSUdfUENJX0VORFBPSU5UX1RFU1QpCSs9IHBjaV9lbmRw b2ludF90ZXN0Lm8KIG9iai0kKENPTkZJR19PQ1hMKQkJKz0gb2N4bC8KIG9iai0kKENPTkZJR19N SVNDX1JUU1gpCQkrPSBjYXJkcmVhZGVyLworb2JqLSQoQ09ORklHX0hJU0lfSElLRVlfVVNCKQkr PSBoaXNpX2hpa2V5X3VzYi5vCmRpZmYgLS1naXQgYS9kcml2ZXJzL21pc2MvaGlzaV9oaWtleV91 c2IuYyBiL2RyaXZlcnMvbWlzYy9oaXNpX2hpa2V5X3VzYi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0 CmluZGV4IDAwMDAwMDAwMDAwMC4uZjMyMGVkODc4ZTQ0Ci0tLSAvZGV2L251bGwKKysrIGIvZHJp dmVycy9taXNjL2hpc2lfaGlrZXlfdXNiLmMKQEAgLTAsMCArMSwxOTggQEAKKy8vIFNQRFgtTGlj ZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wKworLyoKKyAqIGhpc2lfaGlrZXlfdXNiLmMKKyAqCisg KiBDb3B5cmlnaHQgKGMpIEhpc2lsaWNvbiBUZWNoLiBDby4sIEx0ZC4gQWxsIHJpZ2h0cyByZXNl cnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRp c3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBH TlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNv ZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisg KiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3Jh bSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICog YnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFu dHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVS UE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRl dGFpbHMuCisgKgorICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxs aW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgv cGxhdGZvcm1fZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvb2YuaD4KKyNpbmNsdWRlIDxsaW51 eC9ncGlvL2NvbnN1bWVyLmg+CisjaW5jbHVkZSA8bGludXgvdXNiL3JvbGUuaD4KKyNpbmNsdWRl IDxsaW51eC9ub3RpZmllci5oPgorCisjZGVmaW5lIERFVklDRV9EUklWRVJfTkFNRSAiaGlzaV9o aWtleV91c2IiCisKKyNkZWZpbmUgSFVCX1ZCVVNfUE9XRVJfT04gMQorI2RlZmluZSBIVUJfVkJV U19QT1dFUl9PRkYgMAorI2RlZmluZSBVU0JfU1dJVENIX1RPX0hVQiAxCisjZGVmaW5lIFVTQl9T V0lUQ0hfVE9fVFlQRUMgMAorCitzdHJ1Y3QgaGlzaV9oaWtleV91c2IgeworCXN0cnVjdCBncGlv X2Rlc2MgKm90Z19zd2l0Y2g7CisJc3RydWN0IGdwaW9fZGVzYyAqdHlwZWNfdmJ1czsKKwlzdHJ1 Y3QgZ3Bpb19kZXNjICpodWJfdmJ1czsKKwlpbnQgdHlwZWNfdmJ1c19lbmFibGVfdmFsOworCisJ c3RydWN0IHVzYl9yb2xlX3N3aXRjaCAqcm9sZV9zdzsKKwlzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sg bmI7Cit9OworCitzdGF0aWMgdm9pZCBodWJfcG93ZXJfY3RybChzdHJ1Y3QgaGlzaV9oaWtleV91 c2IgKmhpc2lfaGlrZXlfdXNiLCBpbnQgdmFsdWUpCit7CisJcHJfZGVidWcoIiVzOiBzZXQgaHVi IHBvd2VyICVkXG4iLCBfX2Z1bmNfXywgdmFsdWUpOworCWdwaW9kX3NldF92YWx1ZV9jYW5zbGVl cChoaXNpX2hpa2V5X3VzYi0+aHViX3ZidXMsIHZhbHVlKTsKK30KKworc3RhdGljIHZvaWQgdXNi X3N3aXRjaF9jdHJsKHN0cnVjdCBoaXNpX2hpa2V5X3VzYiAqaGlzaV9oaWtleV91c2IsCisJCWlu dCBzd2l0Y2hfdG8pCit7CisJY29uc3QgY2hhciAqc3dpdGNoX3RvX3N0ciA9IChzd2l0Y2hfdG8g PT0gVVNCX1NXSVRDSF9UT19IVUIpID8KKwkJImh1YiIgOiAidHlwZWMiOworCisJcHJfZGVidWco IiVzOiBzd2l0Y2ggdG8gJXNcbiIsIF9fZnVuY19fLCBzd2l0Y2hfdG9fc3RyKTsKKwlncGlvZF9z ZXRfdmFsdWVfY2Fuc2xlZXAoaGlzaV9oaWtleV91c2ItPm90Z19zd2l0Y2gsIHN3aXRjaF90byk7 Cit9CisKK3N0YXRpYyB2b2lkIHVzYl90eXBlY19wb3dlcl9jdHJsKHN0cnVjdCBoaXNpX2hpa2V5 X3VzYiAqaGlzaV9oaWtleV91c2IsCisJCWludCB2YWx1ZSkKK3sKKwlwcl9kZWJ1ZygiJXM6IHNl dCB0eXBlYyB2YnVzIGdwaW8gdG8gJWRcbiIsIF9fZnVuY19fLCB2YWx1ZSk7CisJZ3Bpb2Rfc2V0 X3ZhbHVlX2NhbnNsZWVwKGhpc2lfaGlrZXlfdXNiLT50eXBlY192YnVzLCB2YWx1ZSk7Cit9CisK K3N0YXRpYyBpbnQgaGlzaV9oaWtleV9yb2xlX3N3aXRjaChzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sg Km5iLAorCQkJdW5zaWduZWQgbG9uZyBzdGF0ZSwgdm9pZCAqZGF0YSkKK3sKKwlzdHJ1Y3QgaGlz aV9oaWtleV91c2IgKmhpc2lfaGlrZXlfdXNiOworCisJaWYgKCFuYikKKwkJcmV0dXJuIC1FSU5W QUw7CisKKwloaXNpX2hpa2V5X3VzYiA9IGNvbnRhaW5lcl9vZihuYiwgc3RydWN0IGhpc2lfaGlr ZXlfdXNiLCBuYik7CisKKwlwcl9pbmZvKCIlczpzZXQgdHlwZWMgc3RhdGUgdG8gJWx1XG4iLCBf X2Z1bmNfXywgc3RhdGUpOworCXN3aXRjaCAoc3RhdGUpIHsKKwljYXNlIFVTQl9ST0xFX05PTkU6 CisJCXVzYl90eXBlY19wb3dlcl9jdHJsKGhpc2lfaGlrZXlfdXNiLAorCQkJCSFoaXNpX2hpa2V5 X3VzYi0+dHlwZWNfdmJ1c19lbmFibGVfdmFsKTsKKwkJdXNiX3N3aXRjaF9jdHJsKGhpc2lfaGlr ZXlfdXNiLCBVU0JfU1dJVENIX1RPX0hVQik7CisJCWh1Yl9wb3dlcl9jdHJsKGhpc2lfaGlrZXlf dXNiLCBIVUJfVkJVU19QT1dFUl9PTik7CisJCWJyZWFrOworCWNhc2UgVVNCX1JPTEVfSE9TVDoK KwkJdXNiX3N3aXRjaF9jdHJsKGhpc2lfaGlrZXlfdXNiLCBVU0JfU1dJVENIX1RPX1RZUEVDKTsK KwkJdXNiX3R5cGVjX3Bvd2VyX2N0cmwoaGlzaV9oaWtleV91c2IsCisJCQkJaGlzaV9oaWtleV91 c2ItPnR5cGVjX3ZidXNfZW5hYmxlX3ZhbCk7CisJCWJyZWFrOworCWNhc2UgVVNCX1JPTEVfREVW SUNFOgorCQlodWJfcG93ZXJfY3RybChoaXNpX2hpa2V5X3VzYiwgSFVCX1ZCVVNfUE9XRVJfT0ZG KTsKKwkJdXNiX3R5cGVjX3Bvd2VyX2N0cmwoaGlzaV9oaWtleV91c2IsCisJCQkJIWhpc2lfaGlr ZXlfdXNiLT50eXBlY192YnVzX2VuYWJsZV92YWwpOworCQl1c2Jfc3dpdGNoX2N0cmwoaGlzaV9o aWtleV91c2IsIFVTQl9TV0lUQ0hfVE9fVFlQRUMpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQli cmVhazsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBoaXNpX2hpa2V5X3VzYl9w cm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXN0cnVjdCBkZXZpY2UgKmRl diA9ICZwZGV2LT5kZXY7CisJc3RydWN0IGRldmljZV9ub2RlICpyb290ID0gZGV2LT5vZl9ub2Rl OworCXN0cnVjdCBoaXNpX2hpa2V5X3VzYiAqaGlzaV9oaWtleV91c2I7CisJaW50IHJldDsKKwor CWhpc2lfaGlrZXlfdXNiID0gZGV2bV9remFsbG9jKGRldiwgc2l6ZW9mKCpoaXNpX2hpa2V5X3Vz YiksIEdGUF9LRVJORUwpOworCWlmICghaGlzaV9oaWtleV91c2IpCisJCXJldHVybiAtRU5PTUVN OworCisJaGlzaV9oaWtleV91c2ItPm5iLm5vdGlmaWVyX2NhbGwgPSBoaXNpX2hpa2V5X3JvbGVf c3dpdGNoOworCisJcmV0ID0gb2ZfcHJvcGVydHlfcmVhZF91MzIocm9vdCwgInR5cGMtdmJ1cy1l bmFibGUtdmFsIiwKKwkJCQkgICAmaGlzaV9oaWtleV91c2ItPnR5cGVjX3ZidXNfZW5hYmxlX3Zh bCk7CisJaWYgKHJldCkgeworCQlwcl9pbmZvKCIlczogdHlwY192YnVzX2VuYWJsZV92YWwgY2Fu J3QgZ2V0XG4iLCBfX2Z1bmNfXyk7CisJCWhpc2lfaGlrZXlfdXNiLT50eXBlY192YnVzX2VuYWJs ZV92YWwgPSAxOworCX0KKworCWhpc2lfaGlrZXlfdXNiLT50eXBlY192YnVzID0gZGV2bV9ncGlv ZF9nZXQoZGV2LCAidHlwZWMtdmJ1cyIsCisJCQloaXNpX2hpa2V5X3VzYi0+dHlwZWNfdmJ1c19l bmFibGVfdmFsID8KKwkJCUdQSU9EX09VVF9MT1cgOiBHUElPRF9PVVRfSElHSCk7CisJaWYgKElT X0VSUl9PUl9OVUxMKGhpc2lfaGlrZXlfdXNiLT50eXBlY192YnVzKSkgeworCQlpZiAoIWhpc2lf aGlrZXlfdXNiLT50eXBlY192YnVzKQorCQkJcmV0ID0gLUVJTlZBTDsKKwkJZWxzZQorCQkJcmV0 ID0gUFRSX0VSUihoaXNpX2hpa2V5X3VzYi0+dHlwZWNfdmJ1cyk7CisJCXJldHVybiByZXQ7CisJ fQorCisJaGlzaV9oaWtleV91c2ItPm90Z19zd2l0Y2ggPSBkZXZtX2dwaW9kX2dldChkZXYsICJv dGctc3dpdGNoIiwgR1BJT0RfSU4pOworCWlmIChJU19FUlIoaGlzaV9oaWtleV91c2ItPm90Z19z d2l0Y2gpKQorCQlyZXR1cm4gUFRSX0VSUihoaXNpX2hpa2V5X3VzYi0+b3RnX3N3aXRjaCk7CisK KwloaXNpX2hpa2V5X3VzYi0+aHViX3ZidXMgPSBkZXZtX2dwaW9kX2dldChkZXYsICJodWItdmRk MzMtZW4iLAorCQkJR1BJT0RfT1VUX0xPVyk7CisJaWYgKElTX0VSUihoaXNpX2hpa2V5X3VzYi0+ aHViX3ZidXMpKQorCQlyZXR1cm4gUFRSX0VSUihoaXNpX2hpa2V5X3VzYi0+aHViX3ZidXMpOwor CisJaGlzaV9oaWtleV91c2ItPnJvbGVfc3cgPSB1c2Jfcm9sZV9zd2l0Y2hfZ2V0KGRldik7CisJ aWYgKElTX0VSUl9PUl9OVUxMKGhpc2lfaGlrZXlfdXNiLT5yb2xlX3N3KSkgeworCQlwcl9lcnIo IiVzOiB1c2Jfcm9sZV9zd2l0Y2hfZ2V0IGZhaWxlZFxuIiwgX19mdW5jX18pOworCQlpZiAoIWhp c2lfaGlrZXlfdXNiLT5yb2xlX3N3KQorCQkJcmV0ID0gLUVOT0VOVDsKKwkJZWxzZQorCQkJcmV0 ID0gUFRSX0VSUihoaXNpX2hpa2V5X3VzYi0+cm9sZV9zdyk7CisJCXJldHVybiByZXQ7CisJfQor CisJcmV0ID0gdXNiX3JvbGVfc3dpdGNoX3JlZ2lzdGVyX25vdGlmaWVyKGhpc2lfaGlrZXlfdXNi LT5yb2xlX3N3LAorCQkJJmhpc2lfaGlrZXlfdXNiLT5uYik7CisJaWYgKHJldCkgeworCQl1c2Jf cm9sZV9zd2l0Y2hfcHV0KGhpc2lfaGlrZXlfdXNiLT5yb2xlX3N3KTsKKwkJcmV0dXJuIHJldDsK Kwl9CisKKwlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShwZGV2LCBoaXNpX2hpa2V5X3VzYik7CisKKwly ZXR1cm4gMDsKK30KKworc3RhdGljIGludCAgaGlzaV9oaWtleV91c2JfcmVtb3ZlKHN0cnVjdCBw bGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc3RydWN0IGhpc2lfaGlrZXlfdXNiICpoaXNpX2hp a2V5X3VzYiA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOworCisJdXNiX3JvbGVfc3dpdGNo X3VucmVnaXN0ZXJfbm90aWZpZXIoaGlzaV9oaWtleV91c2ItPnJvbGVfc3csCisJCQkmaGlzaV9o aWtleV91c2ItPm5iKTsKKworCXVzYl9yb2xlX3N3aXRjaF9wdXQoaGlzaV9oaWtleV91c2ItPnJv bGVfc3cpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNl X2lkIGlkX3RhYmxlX2hpc2lfaGlrZXlfdXNiW10gPSB7CisJey5jb21wYXRpYmxlID0gImhpc2ls aWNvbixncGlvX2h1YnYxIn0sCisJey5jb21wYXRpYmxlID0gImhpc2lsaWNvbixoaWtleTk2MF91 c2IifSwKKwl7fQorfTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgIGhpc2lfaGlr ZXlfdXNiX2RyaXZlciA9IHsKKwkucHJvYmUgPSBoaXNpX2hpa2V5X3VzYl9wcm9iZSwKKwkucmVt b3ZlID0gaGlzaV9oaWtleV91c2JfcmVtb3ZlLAorCS5kcml2ZXIgPSB7CisJCS5uYW1lID0gREVW SUNFX0RSSVZFUl9OQU1FLAorCQkub2ZfbWF0Y2hfdGFibGUgPSBvZl9tYXRjaF9wdHIoaWRfdGFi bGVfaGlzaV9oaWtleV91c2IpLAorCisJfSwKK307CisKK21vZHVsZV9wbGF0Zm9ybV9kcml2ZXIo aGlzaV9oaWtleV91c2JfZHJpdmVyKTsKKworTU9EVUxFX0FVVEhPUigiWXUgQ2hlbiA8Y2hlbnl1 NTZAaHVhd2VpLmNvbT4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiRHJpdmVyIFN1cHBvcnQgZm9y IFVTQiBmdW5jdGlvbmFsaXR5IG9mIEhpa2V5Iik7CitNT0RVTEVfTElDRU5TRSgiR1BMIHYyIik7 Cg==