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=-1.1 required=3.0 tests=DKIM_SIGNED,DKIM_VALID, DKIM_VALID_AU,HEADER_FROM_DIFFERENT_DOMAINS,MAILING_LIST_MULTI,SPF_PASS, URIBL_BLOCKED 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 2809EC43142 for ; Thu, 2 Aug 2018 13:28:17 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id 9B7B5214F1 for ; Thu, 2 Aug 2018 13:28:16 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (1024-bit key) header.d=ti.com header.i=@ti.com header.b="Q+IG4iJt" DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 9B7B5214F1 Authentication-Results: mail.kernel.org; dmarc=fail (p=quarantine dis=none) header.from=ti.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 S2387598AbeHBPT1 (ORCPT ); Thu, 2 Aug 2018 11:19:27 -0400 Received: from lelv0143.ext.ti.com ([198.47.23.248]:33330 "EHLO lelv0143.ext.ti.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S2387421AbeHBPT0 (ORCPT ); Thu, 2 Aug 2018 11:19:26 -0400 Received: from dflxv15.itg.ti.com ([128.247.5.124]) by lelv0143.ext.ti.com (8.15.2/8.15.2) with ESMTP id w72DS7Nc059531; Thu, 2 Aug 2018 08:28:07 -0500 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=ti.com; s=ti-com-17Q1; t=1533216487; bh=463x6UlpPpvwkyw2a+6Un0+KiEp+Qk2r4wW8BIjbO18=; h=Subject:To:CC:References:From:Date:In-Reply-To; b=Q+IG4iJtakSVPBKDNspg2r0xYBYR6vcwI8yEfMzk9yVUTq2K9aazN492qUC/uzgqz 9bf5Ui92QgFysI0ataSIqxzfhCXV8QsVgWlO9vAtpEe0nSdGpxWus4c7NIMcDpdGnz 4nkWqeWjSwu4tjHT59PDeyXWHHmdTtrLXkGpfqh4= Received: from DLEE113.ent.ti.com (dlee113.ent.ti.com [157.170.170.24]) by dflxv15.itg.ti.com (8.14.3/8.13.8) with ESMTP id w72DS7h5013207; Thu, 2 Aug 2018 08:28:07 -0500 Received: from DLEE115.ent.ti.com (157.170.170.26) by DLEE113.ent.ti.com (157.170.170.24) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256_P256) id 15.1.1466.3; Thu, 2 Aug 2018 08:28:06 -0500 Received: from dflp33.itg.ti.com (10.64.6.16) by DLEE115.ent.ti.com (157.170.170.26) with Microsoft SMTP Server (version=TLS1_0, cipher=TLS_RSA_WITH_AES_256_CBC_SHA) id 15.1.1466.3 via Frontend Transport; Thu, 2 Aug 2018 08:28:06 -0500 Received: from [192.168.2.6] (ileax41-snat.itg.ti.com [10.172.224.153]) by dflp33.itg.ti.com (8.14.3/8.13.8) with ESMTP id w72DS4t1015960; Thu, 2 Aug 2018 08:28:04 -0500 Subject: Re: [PATCH 04/31] usb: usbssp: Added USBSSP platform driver To: Pawel Laszczak , Felipe Balbi CC: Greg Kroah-Hartman , "linux-usb@vger.kernel.org" , "linux-kernel@vger.kernel.org" , Lukasz Tyrala , Alan Douglas References: <1532023084-28083-1-git-send-email-pawell@cadence.com> <1532023084-28083-5-git-send-email-pawell@cadence.com> <540d372b-700c-c25c-98e0-70e1c24742e8@ti.com> From: Roger Quadros Openpgp: preference=signencrypt Autocrypt: addr=rogerq@ti.com; prefer-encrypt=mutual; keydata= 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 IwrfNkJOLj3CvocMIw== Message-ID: <488f7650-94b0-68fb-78c3-363b97947a8c@ti.com> Date: Thu, 2 Aug 2018 16:28:03 +0300 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:52.0) Gecko/20100101 Thunderbird/52.9.1 MIME-Version: 1.0 In-Reply-To: Content-Type: text/plain; charset="utf-8" Content-Language: en-GB Content-Transfer-Encoding: 8bit X-EXCLAIMER-MD-CONFIG: e1e8a2fd-e40a-4ac6-ac9b-f7e9cc9ee180 Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On 02/08/18 09:25, Pawel Laszczak wrote: >>> This patch adds platform driver that is entry point for loading and >>> unloading usbssp.ko modules. >>> It also adds information about this driver to drivers/usb/Kconfig and >>> drivers/usb/Makefile files and create Kconfig and Makefile files in >>> drivers/usb/usbssp directory. >>> >>> Patch also adds template for some function ivokked from >> >> s/ivokked/invoked >> >>> usbssp_plat.c file. These function will be implemented in next patches. >>> >>> This patch also introduce usbssp_trb_virt_to_dma that converts virtual >>> address of TRB's to DMA address. In this moment this function is used >>> only in gadget-trace.h. >> >> s/"In this moment"/"At the moment" >> >>> >>> From this moment the driver can be compiled. >>> >>> Signed-off-by: Pawel Laszczak >>> --- >>> drivers/usb/Kconfig | 2 + >>> drivers/usb/Makefile | 2 + >>> drivers/usb/usbssp/Kconfig | 21 ++++ >>> drivers/usb/usbssp/Makefile | 11 ++ >>> drivers/usb/usbssp/gadget-ring.c | 48 ++++++++ >>> drivers/usb/usbssp/gadget.c | 64 +++++++++++ >>> drivers/usb/usbssp/gadget.h | 16 ++- >>> drivers/usb/usbssp/usbssp-plat.c | 186 >>> +++++++++++++++++++++++++++++++ >>> 8 files changed, 349 insertions(+), 1 deletion(-) create mode 100644 >>> drivers/usb/usbssp/Kconfig create mode 100644 >>> drivers/usb/usbssp/Makefile create mode 100644 >>> drivers/usb/usbssp/gadget-ring.c create mode 100644 >>> drivers/usb/usbssp/gadget.c create mode 100644 >>> drivers/usb/usbssp/usbssp-plat.c >>> >> >> Build fails at this patch with error [1]. Building should never fail at any patch >> in the series. >> > Yes it's true. There is a lack of #include in drivers/usb/usbssp/gadget.h. > > The compilation works correct starting from "0007-usb-usbssp-Initialization-added-usbssp_mem_init.patch" > Between 0004 and 0007 there is a problem in drivers/usb/usbssp/Makefile (lack of "\"). > > Should I prepare a new series or I should wait for other comments ? I think you should wait. I haven't reviewed the other patches yet. > >> >>> diff --git a/drivers/usb/Kconfig b/drivers/usb/Kconfig index >>> f699abab1787..dc05f384c34c 100644 >>> --- a/drivers/usb/Kconfig >>> +++ b/drivers/usb/Kconfig >>> @@ -110,6 +110,8 @@ source "drivers/usb/mtu3/Kconfig" >>> >>> source "drivers/usb/musb/Kconfig" >>> >>> +source "drivers/usb/usbssp/Kconfig" >>> + >>> source "drivers/usb/dwc3/Kconfig" >>> >>> source "drivers/usb/dwc2/Kconfig" >>> diff --git a/drivers/usb/Makefile b/drivers/usb/Makefile index >>> 060643a1b5c8..b1cd5f83d440 100644 >>> --- a/drivers/usb/Makefile >>> +++ b/drivers/usb/Makefile >>> @@ -8,6 +8,8 @@ >>> obj-$(CONFIG_USB) += core/ >>> obj-$(CONFIG_USB_SUPPORT) += phy/ >>> >>> +obj-$(CONFIG_USB_USBSSP) += usbssp/ >>> + >>> obj-$(CONFIG_USB_DWC3) += dwc3/ >>> obj-$(CONFIG_USB_DWC2) += dwc2/ >>> obj-$(CONFIG_USB_ISP1760) += isp1760/ >>> diff --git a/drivers/usb/usbssp/Kconfig b/drivers/usb/usbssp/Kconfig >>> new file mode 100644 index 000000000000..ee20b01753dc >>> --- /dev/null >>> +++ b/drivers/usb/usbssp/Kconfig >>> @@ -0,0 +1,21 @@ >>> +config USB_USBSSP >> >> Do you want to choose a better Kconfig symbol name? USB is repeated twice >> in USB_USBSSP. >> >> I'd recommend to add something signifying Cadence in the symbol >> >> some examples >> >> USB_CADSSP, USB_CSSP > > Ok, I will change this to USB_CSSP > >>> + tristate "Cadence USBSSP DRD Controller" >>> + depends on (USB || USB_GADGET) && HAS_DMA >>> + select USB_USBSSP_GADGET >> >> Not good to select a symbol that has dependencies. >> >>> + help >>> + Say Y here if your system has a cadence USBSSP dual-role >> controller. >>> + It supports: dual-role switch Host-only, and Peripheral-only. >>> + >>> + If you choose to build this driver is a dynamically linked >>> + module, the module will be called usbssp.ko. >>> + >>> +if USB_USBSSP >>> + >>> +config USB_USBSSP_GADGET >>> + tristate "Gadget only mode" >>> + default USB_USBSSP >>> + depends on USB_GADGET=y || USB_GADGET=USB_USBSSP >>> + help >>> + Select this when you want to use USBSSP in gadget mode only, >> >> s/,/. >> >>> +endif >>> + >>> diff --git a/drivers/usb/usbssp/Makefile b/drivers/usb/usbssp/Makefile >>> new file mode 100644 index 000000000000..d85f15afb51c >>> --- /dev/null >>> +++ b/drivers/usb/usbssp/Makefile >>> @@ -0,0 +1,11 @@ >>> +# SPDX-License-Identifier: GPL-2.0 >>> +# define_trace.h needs to know how to find our header >>> +CFLAGS_gadget-trace.o := -I$(src) >>> + >>> +obj-$(CONFIG_USB_USBSSP_GADGET) += usbssp.o >>> +usbssp-y := usbssp-plat.o gadget-ring.o \ >>> + gadget.o >>> + >>> +ifneq ($(CONFIG_TRACING),) >>> + usbssp-y += gadget-trace.o >>> +endif >>> diff --git a/drivers/usb/usbssp/gadget-ring.c >>> b/drivers/usb/usbssp/gadget-ring.c >>> new file mode 100644 >>> index 000000000000..d1da59306d02 >>> --- /dev/null >>> +++ b/drivers/usb/usbssp/gadget-ring.c >>> @@ -0,0 +1,48 @@ >>> +// SPDX-License-Identifier: GPL-2.0 >>> +/* >>> + * USBSSP device controller driver >>> + * >>> + * Copyright (C) 2018 Cadence. >>> + * >>> + * Author: Pawel Laszczak >>> + * >>> + * A lot of code based on Linux XHCI driver. >>> + * Origin: Copyright (C) 2008 Intel Corp */ >>> + >>> +#include >>> +#include >>> +#include >>> +#include >>> +#include "gadget-trace.h" >>> +#include "gadget.h" >>> + >>> +/* >>> + * Returns zero if the TRB isn't in this segment, otherwise it >>> +returns the DMA >>> + * address of the TRB. >>> + */ >>> +dma_addr_t usbssp_trb_virt_to_dma(struct usbssp_segment *seg, >>> + union usbssp_trb *trb) >>> +{ >>> + unsigned long segment_offset; >>> + >>> + if (!seg || !trb || trb < seg->trbs) >>> + return 0; >>> + /* offset in TRBs */ >>> + segment_offset = trb - seg->trbs; >>> + if (segment_offset >= TRBS_PER_SEGMENT) >>> + return 0; >>> + return seg->dma + (segment_offset * sizeof(*trb)); } >>> + >>> +irqreturn_t usbssp_irq(int irq, void *priv) { >>> + struct usbssp_udc *usbssp_data = (struct usbssp_udc *)priv; >>> + irqreturn_t ret = IRQ_NONE; >>> + unsigned long flags; >>> + >>> + spin_lock_irqsave(&usbssp_data->lock, flags); >>> + >>> + spin_unlock_irqrestore(&usbssp_data->lock, flags); >>> + return ret; >>> +} >>> diff --git a/drivers/usb/usbssp/gadget.c b/drivers/usb/usbssp/gadget.c >>> new file mode 100644 index 000000000000..2f60d7dd1fe4 >>> --- /dev/null >>> +++ b/drivers/usb/usbssp/gadget.c >>> @@ -0,0 +1,64 @@ >>> +// SPDX-License-Identifier: GPL-2.0 >>> +/* >>> + * USBSSP device controller driver >>> + * >>> + * Copyright (C) 2018 Cadence. >>> + * >>> + * Author: Pawel Laszczak >>> + * >>> + * A lot of code based on Linux XHCI driver. >>> + * Origin: Copyright (C) 2008 Intel Corp */ >>> + >>> +#include >>> +#include >>> +#include >>> +#include >>> +#include >>> +#include >>> +#include >>> +#include >>> +#include >>> + >>> +#include "gadget-trace.h" >>> +#include "gadget.h" >>> + >>> +#ifdef CONFIG_PM >>> +/* >>> + * Stop DC (not bus-specific) >>> + * >>> + * This is called when the machine transition into S3/S4 mode. >>> + * >>> + */ >>> +int usbssp_suspend(struct usbssp_udc *usbssp_data, bool do_wakeup) { >>> + /*TODO*/ >>> + return -ENOSYS; >>> +} >>> + >>> +/* >>> + * start DC (not bus-specific) >>> + * >>> + * This is called when the machine transition from S3/S4 mode. >>> + * >>> + */ >>> +int usbssp_resume(struct usbssp_udc *usbssp_data, bool hibernated) { >>> + /*TODO*/ >>> + return -ENOSYS; >>> +} >>> + >>> +#endif /* CONFIG_PM */ >>> + >>> +int usbssp_gadget_init(struct usbssp_udc *usbssp_data) { >>> + int ret; >>> + return ret; >> ret is not initialized before returning. >> Maybe just >> return 0; > I left this compiler warning because the next patches will add implementation of this function and then warning disappear. > I trayed to prepare this series of patches in a way to avoid deletion line in next patches in series. > It is perfectly fine to delete things in a patch. But compiler warnings shouldn't be there. >>> +} >>> + >>> +int usbssp_gadget_exit(struct usbssp_udc *usbssp_data) { >>> + int ret = 0; >>> + >>> + return ret; >> >> return 0; >> >>> +} >>> diff --git a/drivers/usb/usbssp/gadget.h b/drivers/usb/usbssp/gadget.h >>> index b5c17603af78..55e20795d900 100644 >>> --- a/drivers/usb/usbssp/gadget.h >>> +++ b/drivers/usb/usbssp/gadget.h >>> @@ -9,7 +9,6 @@ >>> * A lot of code based on Linux XHCI driver. >>> * Origin: Copyright (C) 2008 Intel Corp. >>> */ >>> - >> >> unnecessary blank line removal >> >>> #ifndef __LINUX_USBSSP_GADGET_H >>> #define __LINUX_USBSSP_GADGET_H >>> >>> @@ -1676,6 +1675,21 @@ static inline void usbssp_write_64(struct >>> usbssp_udc *usbssp_data, { >>> lo_hi_writeq(val, regs); >>> } >>> + >>> +/* USBSSP Device controller glue */ >>> +int usbssp_suspend(struct usbssp_udc *usbssp_data, bool do_wakeup); >>> +int usbssp_resume(struct usbssp_udc *usbssp_data, bool hibernated); >>> + >>> +irqreturn_t usbssp_irq(int irq, void *priv); >>> + >>> +/* USBSSP ring, segment, TRB, and TD functions */ dma_addr_t >>> +usbssp_trb_virt_to_dma(struct usbssp_segment *seg, >>> + union usbssp_trb *trb); >>> + >>> +/* USBSSP gadget interface*/ >>> +int usbssp_gadget_init(struct usbssp_udc *usbssp_data); int >>> +usbssp_gadget_exit(struct usbssp_udc *usbssp_data); >>> + >>> static inline char *usbssp_slot_state_string(u32 state) { >>> switch (state) { >>> diff --git a/drivers/usb/usbssp/usbssp-plat.c >>> b/drivers/usb/usbssp/usbssp-plat.c >> >> Is this file meant only for gadget controller or later even for host controller? >> If only for gadget then this could be just called gadget-plat.c > > I'm not sure at this moment. I have not wondered at now how this driver will > be integrated with XHCI driver and DRD driver. > OK. > >>> new file mode 100644 >>> index 000000000000..c048044148aa >>> --- /dev/null >>> +++ b/drivers/usb/usbssp/usbssp-plat.c >>> @@ -0,0 +1,186 @@ >>> +// SPDX-License-Identifier: GPL-2.0 >>> +/* >>> + * USBSSP device controller driver >>> + * >>> + * Copyright (C) 2018 Cadence. >>> + * >>> + * Author: Pawel Laszczak >>> + * >>> + */ >>> + >>> +#include >>> +#include >>> +#include >>> +#include >>> +#include >>> +#include >>> +#include >>> +#include >>> +#include >>> +#include >>> + >>> +#include "gadget.h" >>> + >>> +#define DRIVER_AUTHOR "Pawel Laszczak" >>> +#define DRIVER_DESC "USBSSP Device Controller (USBSSP) Driver" >>> + >>> +#ifdef CONFIG_OF >>> + >>> +static const struct of_device_id usbssp_dev_of_match[] = { >>> + { >>> + .compatible = "Cadence, usbssp-dev", >> >> Avoid upper-case in compatible strings. >> >>> + }, >>> + {}, >>> +}; >>> +MODULE_DEVICE_TABLE(of, usbssp_dev_of_match); #endif >>> + >>> +int usbssp_is_platform(void) >>> +{ >>> + return 1; >>> +} >>> + >>> +static int usbssp_plat_probe(struct platform_device *pdev) { >>> + struct device *dev = &pdev->dev; >>> + struct resource *res; >>> + struct usbssp_udc *usbssp_data; >>> + int ret = 0; >>> + int irq; >>> + struct device *sysdev; >>> + >>> + irq = platform_get_irq(pdev, 0); >>> + if (irq < 0) { >>> + dev_err(&pdev->dev, "Incorrect IRQ number\n"); >> >> IRQ number might be correct but might be some other issue. >> You could just say "couldn't get IRQ" >> >>> + return -ENODEV; >> >> Also, we don't want to print any error message if we got a -EPROBE_DEFER. >> And we need to return that instead of -ENODEV for deferred probing to >> work. >> >>> + } >> >> So how about >> if (irq < 0) { >> if (irq != -EPROBE_DEFER) >> dev_err(&pdev->dev, "couldn't get IRQ\n") >> >> return irq; >> } >> >>> + >>> + usbssp_data = devm_kzalloc(dev, sizeof(*usbssp_data), >> GFP_KERNEL); >>> + if (!usbssp_data) >>> + return -ENOMEM; >>> + >>> + for (sysdev = &pdev->dev; sysdev; sysdev = sysdev->parent) { >>> + if (is_of_node(sysdev->fwnode) || >>> + is_acpi_device_node(sysdev->fwnode)) >>> + break; >>> +#ifdef CONFIG_PCI >>> + else if (sysdev->bus == &pci_bus_type) >>> + break; >>> +#endif >>> + } >> >> It is hard to understand what is this for loop doing exactly. >> >> xhci-plat.c seems to have this comment. You should add it above as well. >> /* >> * sysdev must point to a device that is known to the system firmware >> * or PCI hardware. We handle these three cases here: >> * 1. xhci_plat comes from firmware >> * 2. xhci_plat is child of a device from firmware (dwc3-plat) >> * 3. xhci_plat is grandchild of a pci device (dwc3-pci) >> */ >> >> >>> + >>> + if (!sysdev) >>> + sysdev = &pdev->dev; >>> + >>> + /* Try to set 64-bit DMA first */ >>> + if (WARN_ON(!dev->dma_mask)) >>> + /* Platform did not initialize dma_mask */ >>> + ret = dma_coerce_mask_and_coherent(dev, >>> + DMA_BIT_MASK(64)); >>> + else >>> + ret = dma_set_mask_and_coherent(dev, >> DMA_BIT_MASK(64)); >>> + >>> + /* If seting 64-bit DMA mask fails, fall back to 32-bit DMA mask */ >>> + if (ret) { >>> + ret = dma_set_mask_and_coherent(dev, >> DMA_BIT_MASK(32)); >>> + if (ret) >>> + return ret; >>> + } >>> + >>> + res = platform_get_resource(pdev, IORESOURCE_MEM, 0); >>> + usbssp_data->regs = devm_ioremap_resource(dev, res); >>> + >>> + if (IS_ERR(usbssp_data->regs)) { >> dev_err() ? >> >>> + ret = PTR_ERR(usbssp_data->regs); >>> + return ret; >>> + } >>> + >>> + usbssp_data->rsrc_start = res->start; >>> + usbssp_data->rsrc_len = resource_size(res); >>> + >>> + ret = devm_request_irq(dev, irq, usbssp_irq, IRQF_SHARED, >>> + dev_name(dev), usbssp_data); >> >> devm_request_threaded_irq() ? > Currently for deferred interrupts I use workqueue thread. Some time ago I tried use this function > but I have some problem with it. I have plan to replace devm_request_irq with devm_request_threaded_irq. > > In USBSSP controller for device side I have big problem with handling commands. Handling command works like > in XHCI controller. After invoking command driver has to wait for completion so it should sleep for some time. > During waiting (e.g wait_for_completion) we need to enable the interrupts because we need to detect the completion event. Additionally some API function from USBSSP gadget driver are invoked by upper layer with disabled interrupts. > In this situation we can't enable interrupt before invoking command and driver has to detect completion in other way. > The concept taken from the host is not a perfect for device driver where most driver should works in interrupt context, > Felipe? any ideas here? >>> + >>> + if (ret < 0) >>> + return ret; >>> + >>> + usbssp_data->irq = irq; >>> + usbssp_data->dev = dev; >>> + platform_set_drvdata(pdev, usbssp_data); >>> + ret = usbssp_gadget_init(usbssp_data); >>> + >>> + return ret; >>> +} >>> + >>> +static int usbssp_plat_remove(struct platform_device *pdev) { >>> + int ret = 0; >>> + struct usbssp_udc *usbssp_data; >>> + >>> + usbssp_data = (struct usbssp_udc *)platform_get_drvdata(pdev); >>> + ret = usbssp_gadget_exit(usbssp_data); >>> + return ret; >>> + >> >> move this blank line above return ret; >>> +} >>> + >>> +static int __maybe_unused usbssp_plat_suspend(struct device *dev) { >>> + struct usbssp_udc *usbssp_data = dev_get_drvdata(dev); >>> + >>> + return usbssp_suspend(usbssp_data, device_may_wakeup(dev)); } >>> + >>> +static int __maybe_unused usbssp_plat_resume(struct device *dev) { >>> + struct usbssp_udc *usbssp_data = dev_get_drvdata(dev); >>> + >>> + return usbssp_resume(usbssp_data, 0); } >>> + >>> +static int __maybe_unused usbssp_plat_runtime_suspend(struct device >>> +*dev) { >>> + struct usbssp_udc *usbssp_data = dev_get_drvdata(dev); >>> + >>> + return usbssp_suspend(usbssp_data, true); } >>> + >>> +static int __maybe_unused usbssp_plat_runtime_resume(struct device >>> +*dev) { >>> + struct usbssp_udc *usbssp_data = dev_get_drvdata(dev); >>> + >>> + return usbssp_resume(usbssp_data, 0); } >>> + >>> +static const struct dev_pm_ops usbssp_plat_pm_ops = { >>> + SET_SYSTEM_SLEEP_PM_OPS(usbssp_plat_suspend, >> usbssp_plat_resume) >>> + >>> + SET_RUNTIME_PM_OPS(usbssp_plat_runtime_suspend, >>> + usbssp_plat_runtime_resume, >>> + NULL) >>> +}; >>> + >>> +static struct platform_driver usbssp_driver = { >>> + .probe = usbssp_plat_probe, >>> + .remove = usbssp_plat_remove, >>> + .driver = { >>> + .name = "usbssp-dev", >>> + .pm = &usbssp_plat_pm_ops, >>> + .of_match_table = of_match_ptr(usbssp_dev_of_match), >>> + }, >>> +}; >>> + >>> +static int __init usbssp_plat_init(void) { >>> + return platform_driver_register(&usbssp_driver); >>> +} >>> +module_init(usbssp_plat_init); >>> + >>> +static void __exit usbssp_plat_exit(void) { >>> + platform_driver_unregister(&usbssp_driver); >>> +} >>> +module_exit(usbssp_plat_exit); >>> + >>> +MODULE_ALIAS("platform:usbss-gadget"); >> usbssp-gadget? >> >> Why did you choose a different name for compatible? "usbssp-dev" >> Would be nice to have it consistent. >> >>> +MODULE_DESCRIPTION("USBSSP' Device Controller (USBSSP) Driver"); >> >> USBSSP, 2 times? >> >>> +MODULE_LICENSE("GPL v2"); >>> > I will correct this. >> >> [1] build error >> >> CC [M] drivers/usb/usbssp/gadget-trace.o In file included from >> drivers/usb/usbssp/gadget-trace.h:27:0, >> from drivers/usb/usbssp/gadget-trace.c:13: >> drivers/usb/usbssp/gadget.h:1683:1: error: unknown type name >> ‘irqreturn_t’ >> irqreturn_t usbssp_irq(int irq, void *priv); ^~~~~~~~~~~ In file included from >> ./include/trace/trace_events.h:394:0, >> from ./include/trace/define_trace.h:96, >> from drivers/usb/usbssp/gadget-trace.h:482, >> from drivers/usb/usbssp/gadget-trace.c:13: >> drivers/usb/usbssp/./gadget-trace.h: In function >> ‘trace_raw_output_usbssp_log_request’: >> drivers/usb/usbssp/./gadget-trace.h:201:477: warning: format ‘%llx’ expects >> argument of type ‘long long unsigned int’, but argument 6 has type >> ‘dma_addr_t {aka unsigned int}’ [-Wformat=] >> DECLARE_EVENT_CLASS(usbssp_log_request, >> >> ^ >> scripts/Makefile.build:317: recipe for target 'drivers/usb/usbssp/gadget- >> trace.o' failed >> make[3]: *** [drivers/usb/usbssp/gadget-trace.o] Error 1 >> scripts/Makefile.build:558: recipe for target 'drivers/usb/usbssp' failed >> make[2]: *** [drivers/usb/usbssp] Error 2 >> scripts/Makefile.build:558: recipe for target 'drivers/usb' failed >> make[1]: *** [drivers/usb] Error 2 >> Makefile:1029: recipe for target 'drivers' failed >> make: *** [drivers] Error 2 >> >> -- > cheers, > Pawel > -- cheers, -roger Texas Instruments Finland Oy, Porkkalankatu 22, 00180 Helsinki. Y-tunnus/Business ID: 0615521-4. Kotipaikka/Domicile: Helsinki 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: [04/31] usb: usbssp: Added USBSSP platform driver From: Roger Quadros Message-Id: <488f7650-94b0-68fb-78c3-363b97947a8c@ti.com> Date: Thu, 2 Aug 2018 16:28:03 +0300 To: Pawel Laszczak , Felipe Balbi Cc: Greg Kroah-Hartman , "linux-usb@vger.kernel.org" , "linux-kernel@vger.kernel.org" , Lukasz Tyrala , Alan Douglas List-ID: T24gMDIvMDgvMTggMDk6MjUsIFBhd2VsIExhc3pjemFrIHdyb3RlOgo+Pj4gVGhpcyBwYXRjaCBh ZGRzIHBsYXRmb3JtIGRyaXZlciB0aGF0IGlzIGVudHJ5IHBvaW50IGZvciBsb2FkaW5nIGFuZAo+ Pj4gdW5sb2FkaW5nIHVzYnNzcC5rbyBtb2R1bGVzLgo+Pj4gSXQgYWxzbyBhZGRzIGluZm9ybWF0 aW9uIGFib3V0IHRoaXMgZHJpdmVyIHRvIGRyaXZlcnMvdXNiL0tjb25maWcgYW5kCj4+PiBkcml2 ZXJzL3VzYi9NYWtlZmlsZSBmaWxlcyBhbmQgY3JlYXRlIEtjb25maWcgYW5kIE1ha2VmaWxlIGZp bGVzIGluCj4+PiBkcml2ZXJzL3VzYi91c2Jzc3AgZGlyZWN0b3J5Lgo+Pj4KPj4+IFBhdGNoIGFs c28gYWRkcyB0ZW1wbGF0ZSBmb3Igc29tZSBmdW5jdGlvbiBpdm9ra2VkIGZyb20KPj4KPj4gcy9p dm9ra2VkL2ludm9rZWQKPj4KPj4+IHVzYnNzcF9wbGF0LmMgZmlsZS4gVGhlc2UgZnVuY3Rpb24g d2lsbCBiZSBpbXBsZW1lbnRlZCBpbiBuZXh0IHBhdGNoZXMuCj4+Pgo+Pj4gVGhpcyBwYXRjaCBh bHNvIGludHJvZHVjZSB1c2Jzc3BfdHJiX3ZpcnRfdG9fZG1hIHRoYXQgY29udmVydHMgdmlydHVh bAo+Pj4gYWRkcmVzcyBvZiBUUkIncyB0byBETUEgYWRkcmVzcy4gSW4gdGhpcyBtb21lbnQgdGhp cyBmdW5jdGlvbiBpcyB1c2VkCj4+PiBvbmx5IGluIGdhZGdldC10cmFjZS5oLgo+Pgo+PiBzLyJJ biB0aGlzIG1vbWVudCIvIkF0IHRoZSBtb21lbnQiCj4+Cj4+Pgo+Pj4gRnJvbSB0aGlzIG1vbWVu dCB0aGUgZHJpdmVyIGNhbiBiZSBjb21waWxlZC4KPj4+Cj4+PiBTaWduZWQtb2ZmLWJ5OiBQYXdl bCBMYXN6Y3phayA8cGF3ZWxsQGNhZGVuY2UuY29tPgo+Pj4gLS0tCj4+PiAgZHJpdmVycy91c2Iv S2NvbmZpZyAgICAgICAgICAgICAgfCAgIDIgKwo+Pj4gIGRyaXZlcnMvdXNiL01ha2VmaWxlICAg ICAgICAgICAgIHwgICAyICsKPj4+ICBkcml2ZXJzL3VzYi91c2Jzc3AvS2NvbmZpZyAgICAgICB8 ICAyMSArKysrCj4+PiAgZHJpdmVycy91c2IvdXNic3NwL01ha2VmaWxlICAgICAgfCAgMTEgKysK Pj4+ICBkcml2ZXJzL3VzYi91c2Jzc3AvZ2FkZ2V0LXJpbmcuYyB8ICA0OCArKysrKysrKwo+Pj4g IGRyaXZlcnMvdXNiL3VzYnNzcC9nYWRnZXQuYyAgICAgIHwgIDY0ICsrKysrKysrKysrCj4+PiAg ZHJpdmVycy91c2IvdXNic3NwL2dhZGdldC5oICAgICAgfCAgMTYgKystCj4+PiAgZHJpdmVycy91 c2IvdXNic3NwL3VzYnNzcC1wbGF0LmMgfCAxODYKPj4+ICsrKysrKysrKysrKysrKysrKysrKysr KysrKysrKysKPj4+ICA4IGZpbGVzIGNoYW5nZWQsIDM0OSBpbnNlcnRpb25zKCspLCAxIGRlbGV0 aW9uKC0pICBjcmVhdGUgbW9kZSAxMDA2NDQKPj4+IGRyaXZlcnMvdXNiL3VzYnNzcC9LY29uZmln ICBjcmVhdGUgbW9kZSAxMDA2NDQKPj4+IGRyaXZlcnMvdXNiL3VzYnNzcC9NYWtlZmlsZSAgY3Jl YXRlIG1vZGUgMTAwNjQ0Cj4+PiBkcml2ZXJzL3VzYi91c2Jzc3AvZ2FkZ2V0LXJpbmcuYyAgY3Jl YXRlIG1vZGUgMTAwNjQ0Cj4+PiBkcml2ZXJzL3VzYi91c2Jzc3AvZ2FkZ2V0LmMgIGNyZWF0ZSBt b2RlIDEwMDY0NAo+Pj4gZHJpdmVycy91c2IvdXNic3NwL3VzYnNzcC1wbGF0LmMKPj4+Cj4+Cj4+ IEJ1aWxkIGZhaWxzIGF0IHRoaXMgcGF0Y2ggd2l0aCBlcnJvciBbMV0uIEJ1aWxkaW5nIHNob3Vs ZCBuZXZlciBmYWlsIGF0IGFueSBwYXRjaAo+PiBpbiB0aGUgc2VyaWVzLgo+Pgo+IFllcyBpdCdz IHRydWUuIFRoZXJlIGlzIGEgbGFjayBvZiAjaW5jbHVkZSA8bGludXgvaXJxLmg+IGluIGRyaXZl cnMvdXNiL3VzYnNzcC9nYWRnZXQuaC4KPiAKPiBUaGUgY29tcGlsYXRpb24gd29ya3MgY29ycmVj dCBzdGFydGluZyBmcm9tICIwMDA3LXVzYi11c2Jzc3AtSW5pdGlhbGl6YXRpb24tYWRkZWQtdXNi c3NwX21lbV9pbml0LnBhdGNoIgo+IEJldHdlZW4gMDAwNCBhbmQgMDAwNyB0aGVyZSBpcyBhIHBy b2JsZW0gaW4gZHJpdmVycy91c2IvdXNic3NwL01ha2VmaWxlICAobGFjayBvZiAiXCIpLgo+IAo+ IFNob3VsZCBJIHByZXBhcmUgYSBuZXcgc2VyaWVzIG9yIEkgc2hvdWxkIHdhaXQgZm9yIG90aGVy IGNvbW1lbnRzID8gCgpJIHRoaW5rIHlvdSBzaG91bGQgd2FpdC4gSSBoYXZlbid0IHJldmlld2Vk IHRoZSBvdGhlciBwYXRjaGVzIHlldC4KCj4gCj4+Cj4+PiBkaWZmIC0tZ2l0IGEvZHJpdmVycy91 c2IvS2NvbmZpZyBiL2RyaXZlcnMvdXNiL0tjb25maWcgaW5kZXgKPj4+IGY2OTlhYmFiMTc4Ny4u ZGMwNWYzODRjMzRjIDEwMDY0NAo+Pj4gLS0tIGEvZHJpdmVycy91c2IvS2NvbmZpZwo+Pj4gKysr IGIvZHJpdmVycy91c2IvS2NvbmZpZwo+Pj4gQEAgLTExMCw2ICsxMTAsOCBAQCBzb3VyY2UgImRy aXZlcnMvdXNiL210dTMvS2NvbmZpZyIKPj4+Cj4+PiAgc291cmNlICJkcml2ZXJzL3VzYi9tdXNi L0tjb25maWciCj4+Pgo+Pj4gK3NvdXJjZSAiZHJpdmVycy91c2IvdXNic3NwL0tjb25maWciCj4+ PiArCj4+PiAgc291cmNlICJkcml2ZXJzL3VzYi9kd2MzL0tjb25maWciCj4+Pgo+Pj4gIHNvdXJj ZSAiZHJpdmVycy91c2IvZHdjMi9LY29uZmlnIgo+Pj4gZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNi L01ha2VmaWxlIGIvZHJpdmVycy91c2IvTWFrZWZpbGUgaW5kZXgKPj4+IDA2MDY0M2ExYjVjOC4u YjFjZDVmODNkNDQwIDEwMDY0NAo+Pj4gLS0tIGEvZHJpdmVycy91c2IvTWFrZWZpbGUKPj4+ICsr KyBiL2RyaXZlcnMvdXNiL01ha2VmaWxlCj4+PiBAQCAtOCw2ICs4LDggQEAKPj4+ICBvYmotJChD T05GSUdfVVNCKQkJKz0gY29yZS8KPj4+ICBvYmotJChDT05GSUdfVVNCX1NVUFBPUlQpCSs9IHBo eS8KPj4+Cj4+PiArb2JqLSQoQ09ORklHX1VTQl9VU0JTU1ApCSs9IHVzYnNzcC8KPj4+ICsKPj4+ ICBvYmotJChDT05GSUdfVVNCX0RXQzMpCQkrPSBkd2MzLwo+Pj4gIG9iai0kKENPTkZJR19VU0Jf RFdDMikJCSs9IGR3YzIvCj4+PiAgb2JqLSQoQ09ORklHX1VTQl9JU1AxNzYwKQkrPSBpc3AxNzYw Lwo+Pj4gZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL3VzYnNzcC9LY29uZmlnIGIvZHJpdmVycy91 c2IvdXNic3NwL0tjb25maWcKPj4+IG5ldyBmaWxlIG1vZGUgMTAwNjQ0IGluZGV4IDAwMDAwMDAw MDAwMC4uZWUyMGIwMTc1M2RjCj4+PiAtLS0gL2Rldi9udWxsCj4+PiArKysgYi9kcml2ZXJzL3Vz Yi91c2Jzc3AvS2NvbmZpZwo+Pj4gQEAgLTAsMCArMSwyMSBAQAo+Pj4gK2NvbmZpZyBVU0JfVVNC U1NQCj4+Cj4+IERvIHlvdSB3YW50IHRvIGNob29zZSBhIGJldHRlciBLY29uZmlnIHN5bWJvbCBu YW1lPyBVU0IgaXMgcmVwZWF0ZWQgdHdpY2UKPj4gaW4gVVNCX1VTQlNTUC4KPj4KPj4gSSdkIHJl Y29tbWVuZCB0byBhZGQgc29tZXRoaW5nIHNpZ25pZnlpbmcgQ2FkZW5jZSBpbiB0aGUgc3ltYm9s Cj4+Cj4+IHNvbWUgZXhhbXBsZXMKPj4KPj4gVVNCX0NBRFNTUCwgVVNCX0NTU1AKPiAKPiBPaywg SSB3aWxsIGNoYW5nZSB0aGlzIHRvIFVTQl9DU1NQCj4gCj4+PiArCXRyaXN0YXRlICJDYWRlbmNl IFVTQlNTUCBEUkQgQ29udHJvbGxlciIKPj4+ICsJZGVwZW5kcyBvbiAoVVNCIHx8IFVTQl9HQURH RVQpICYmIEhBU19ETUEKPj4+ICsJc2VsZWN0IFVTQl9VU0JTU1BfR0FER0VUCj4+Cj4+IE5vdCBn b29kIHRvIHNlbGVjdCBhIHN5bWJvbCB0aGF0IGhhcyBkZXBlbmRlbmNpZXMuCj4+Cj4+PiArCWhl bHAKPj4+ICsJICBTYXkgWSBoZXJlIGlmIHlvdXIgc3lzdGVtIGhhcyBhIGNhZGVuY2UgVVNCU1NQ IGR1YWwtcm9sZQo+PiBjb250cm9sbGVyLgo+Pj4gKwkgIEl0IHN1cHBvcnRzOiBkdWFsLXJvbGUg c3dpdGNoIEhvc3Qtb25seSwgYW5kIFBlcmlwaGVyYWwtb25seS4KPj4+ICsKPj4+ICsJICBJZiB5 b3UgY2hvb3NlIHRvIGJ1aWxkIHRoaXMgZHJpdmVyIGlzIGEgZHluYW1pY2FsbHkgbGlua2VkCj4+ PiArCSAgbW9kdWxlLCB0aGUgbW9kdWxlIHdpbGwgYmUgY2FsbGVkIHVzYnNzcC5rby4KPj4+ICsK Pj4+ICtpZiBVU0JfVVNCU1NQCj4+PiArCj4+PiArY29uZmlnIFVTQl9VU0JTU1BfR0FER0VUCj4+ PiArCXRyaXN0YXRlICJHYWRnZXQgb25seSBtb2RlIgo+Pj4gKwlkZWZhdWx0IFVTQl9VU0JTU1AK Pj4+ICsJZGVwZW5kcyBvbiBVU0JfR0FER0VUPXkgfHwgVVNCX0dBREdFVD1VU0JfVVNCU1NQCj4+ PiArCWhlbHAKPj4+ICsJICBTZWxlY3QgdGhpcyB3aGVuIHlvdSB3YW50IHRvIHVzZSBVU0JTU1Ag aW4gZ2FkZ2V0IG1vZGUgb25seSwKPj4KPj4gcy8sLy4KPj4KPj4+ICtlbmRpZgo+Pj4gKwo+Pj4g ZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL3VzYnNzcC9NYWtlZmlsZSBiL2RyaXZlcnMvdXNiL3Vz YnNzcC9NYWtlZmlsZQo+Pj4gbmV3IGZpbGUgbW9kZSAxMDA2NDQgaW5kZXggMDAwMDAwMDAwMDAw Li5kODVmMTVhZmI1MWMKPj4+IC0tLSAvZGV2L251bGwKPj4+ICsrKyBiL2RyaXZlcnMvdXNiL3Vz YnNzcC9NYWtlZmlsZQo+Pj4gQEAgLTAsMCArMSwxMSBAQAo+Pj4gKyMgU1BEWC1MaWNlbnNlLUlk ZW50aWZpZXI6IEdQTC0yLjAKPj4+ICsjIGRlZmluZV90cmFjZS5oIG5lZWRzIHRvIGtub3cgaG93 IHRvIGZpbmQgb3VyIGhlYWRlcgo+Pj4gK0NGTEFHU19nYWRnZXQtdHJhY2UubyA6PSAtSSQoc3Jj KQo+Pj4gKwo+Pj4gK29iai0kKENPTkZJR19VU0JfVVNCU1NQX0dBREdFVCkgKz0gdXNic3NwLm8K Pj4+ICt1c2Jzc3AteSAJCQk6PSB1c2Jzc3AtcGxhdC5vIGdhZGdldC1yaW5nLm8gXAo+Pj4gKwkJ CQkgICBnYWRnZXQubwo+Pj4gKwo+Pj4gK2lmbmVxICgkKENPTkZJR19UUkFDSU5HKSwpCj4+PiAr CXVzYnNzcC15CQkrPSBnYWRnZXQtdHJhY2Uubwo+Pj4gK2VuZGlmCj4+PiBkaWZmIC0tZ2l0IGEv ZHJpdmVycy91c2IvdXNic3NwL2dhZGdldC1yaW5nLmMKPj4+IGIvZHJpdmVycy91c2IvdXNic3Nw L2dhZGdldC1yaW5nLmMKPj4+IG5ldyBmaWxlIG1vZGUgMTAwNjQ0Cj4+PiBpbmRleCAwMDAwMDAw MDAwMDAuLmQxZGE1OTMwNmQwMgo+Pj4gLS0tIC9kZXYvbnVsbAo+Pj4gKysrIGIvZHJpdmVycy91 c2IvdXNic3NwL2dhZGdldC1yaW5nLmMKPj4+IEBAIC0wLDAgKzEsNDggQEAKPj4+ICsvLyBTUERY LUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMAo+Pj4gKy8qCj4+PiArICogVVNCU1NQIGRldmlj ZSBjb250cm9sbGVyIGRyaXZlcgo+Pj4gKyAqCj4+PiArICogQ29weXJpZ2h0IChDKSAyMDE4IENh ZGVuY2UuCj4+PiArICoKPj4+ICsgKiBBdXRob3I6IFBhd2VsIExhc3pjemFrCj4+PiArICoKPj4+ ICsgKiBBIGxvdCBvZiBjb2RlIGJhc2VkIG9uIExpbnV4IFhIQ0kgZHJpdmVyLgo+Pj4gKyAqIE9y aWdpbjogQ29weXJpZ2h0IChDKSAyMDA4IEludGVsIENvcnAgICovCj4+PiArCj4+PiArI2luY2x1 ZGUgPGxpbnV4L3NjYXR0ZXJsaXN0Lmg+Cj4+PiArI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KPj4+ ICsjaW5jbHVkZSA8bGludXgvZG1hLW1hcHBpbmcuaD4KPj4+ICsjaW5jbHVkZSA8bGludXgvaXJx Lmg+Cj4+PiArI2luY2x1ZGUgImdhZGdldC10cmFjZS5oIgo+Pj4gKyNpbmNsdWRlICJnYWRnZXQu aCIKPj4+ICsKPj4+ICsvKgo+Pj4gKyAqIFJldHVybnMgemVybyBpZiB0aGUgVFJCIGlzbid0IGlu IHRoaXMgc2VnbWVudCwgb3RoZXJ3aXNlIGl0Cj4+PiArcmV0dXJucyB0aGUgRE1BCj4+PiArICog YWRkcmVzcyBvZiB0aGUgVFJCLgo+Pj4gKyAqLwo+Pj4gK2RtYV9hZGRyX3QgdXNic3NwX3RyYl92 aXJ0X3RvX2RtYShzdHJ1Y3QgdXNic3NwX3NlZ21lbnQgKnNlZywKPj4+ICsJCQkJICB1bmlvbiB1 c2Jzc3BfdHJiICp0cmIpCj4+PiArewo+Pj4gKwl1bnNpZ25lZCBsb25nIHNlZ21lbnRfb2Zmc2V0 Owo+Pj4gKwo+Pj4gKwlpZiAoIXNlZyB8fCAhdHJiIHx8IHRyYiA8IHNlZy0+dHJicykKPj4+ICsJ CXJldHVybiAwOwo+Pj4gKwkvKiBvZmZzZXQgaW4gVFJCcyAqLwo+Pj4gKwlzZWdtZW50X29mZnNl dCA9IHRyYiAtIHNlZy0+dHJiczsKPj4+ICsJaWYgKHNlZ21lbnRfb2Zmc2V0ID49IFRSQlNfUEVS X1NFR01FTlQpCj4+PiArCQlyZXR1cm4gMDsKPj4+ICsJcmV0dXJuIHNlZy0+ZG1hICsgKHNlZ21l bnRfb2Zmc2V0ICogc2l6ZW9mKCp0cmIpKTsgfQo+Pj4gKwo+Pj4gK2lycXJldHVybl90IHVzYnNz cF9pcnEoaW50IGlycSwgdm9pZCAqcHJpdikgewo+Pj4gKwlzdHJ1Y3QgdXNic3NwX3VkYyAqdXNi c3NwX2RhdGEgPSAoc3RydWN0IHVzYnNzcF91ZGMgKilwcml2Owo+Pj4gKwlpcnFyZXR1cm5fdCBy ZXQgPSBJUlFfTk9ORTsKPj4+ICsJdW5zaWduZWQgbG9uZyBmbGFnczsKPj4+ICsKPj4+ICsJc3Bp bl9sb2NrX2lycXNhdmUoJnVzYnNzcF9kYXRhLT5sb2NrLCBmbGFncyk7Cj4+PiArCj4+PiArCXNw aW5fdW5sb2NrX2lycXJlc3RvcmUoJnVzYnNzcF9kYXRhLT5sb2NrLCBmbGFncyk7Cj4+PiArCXJl dHVybiByZXQ7Cj4+PiArfQo+Pj4gZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL3VzYnNzcC9nYWRn ZXQuYyBiL2RyaXZlcnMvdXNiL3VzYnNzcC9nYWRnZXQuYwo+Pj4gbmV3IGZpbGUgbW9kZSAxMDA2 NDQgaW5kZXggMDAwMDAwMDAwMDAwLi4yZjYwZDdkZDFmZTQKPj4+IC0tLSAvZGV2L251bGwKPj4+ ICsrKyBiL2RyaXZlcnMvdXNiL3VzYnNzcC9nYWRnZXQuYwo+Pj4gQEAgLTAsMCArMSw2NCBAQAo+ Pj4gKy8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wCj4+PiArLyoKPj4+ICsgKiBV U0JTU1AgZGV2aWNlIGNvbnRyb2xsZXIgZHJpdmVyCj4+PiArICoKPj4+ICsgKiBDb3B5cmlnaHQg KEMpIDIwMTggQ2FkZW5jZS4KPj4+ICsgKgo+Pj4gKyAqIEF1dGhvcjogUGF3ZWwgTGFzemN6YWsK Pj4+ICsgKgo+Pj4gKyAqIEEgbG90IG9mIGNvZGUgYmFzZWQgb24gTGludXggWEhDSSBkcml2ZXIu Cj4+PiArICogT3JpZ2luOiBDb3B5cmlnaHQgKEMpIDIwMDggSW50ZWwgQ29ycCAgKi8KPj4+ICsK Pj4+ICsjaW5jbHVkZSA8bGludXgvcGNpLmg+Cj4+PiArI2luY2x1ZGUgPGxpbnV4L2lycS5oPgo+ Pj4gKyNpbmNsdWRlIDxsaW51eC9sb2cyLmg+Cj4+PiArI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5o Pgo+Pj4gKyNpbmNsdWRlIDxsaW51eC9tb2R1bGVwYXJhbS5oPgo+Pj4gKyNpbmNsdWRlIDxsaW51 eC9zbGFiLmg+Cj4+PiArI2luY2x1ZGUgPGxpbnV4L2RtaS5oPgo+Pj4gKyNpbmNsdWRlIDxsaW51 eC9kbWEtbWFwcGluZy5oPgo+Pj4gKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgo+Pj4gKwo+Pj4g KyNpbmNsdWRlICJnYWRnZXQtdHJhY2UuaCIKPj4+ICsjaW5jbHVkZSAiZ2FkZ2V0LmgiCj4+PiAr Cj4+PiArI2lmZGVmIENPTkZJR19QTQo+Pj4gKy8qCj4+PiArICogU3RvcCBEQyAobm90IGJ1cy1z cGVjaWZpYykKPj4+ICsgKgo+Pj4gKyAqIFRoaXMgaXMgY2FsbGVkIHdoZW4gdGhlIG1hY2hpbmUg dHJhbnNpdGlvbiBpbnRvIFMzL1M0IG1vZGUuCj4+PiArICoKPj4+ICsgKi8KPj4+ICtpbnQgdXNi c3NwX3N1c3BlbmQoc3RydWN0IHVzYnNzcF91ZGMgKnVzYnNzcF9kYXRhLCBib29sIGRvX3dha2V1 cCkgewo+Pj4gKwkvKlRPRE8qLwo+Pj4gKwlyZXR1cm4gLUVOT1NZUzsKPj4+ICt9Cj4+PiArCj4+ PiArLyoKPj4+ICsgKiBzdGFydCBEQyAobm90IGJ1cy1zcGVjaWZpYykKPj4+ICsgKgo+Pj4gKyAq IFRoaXMgaXMgY2FsbGVkIHdoZW4gdGhlIG1hY2hpbmUgdHJhbnNpdGlvbiBmcm9tIFMzL1M0IG1v ZGUuCj4+PiArICoKPj4+ICsgKi8KPj4+ICtpbnQgdXNic3NwX3Jlc3VtZShzdHJ1Y3QgdXNic3Nw X3VkYyAqdXNic3NwX2RhdGEsIGJvb2wgaGliZXJuYXRlZCkgewo+Pj4gKwkvKlRPRE8qLwo+Pj4g KwlyZXR1cm4gLUVOT1NZUzsKPj4+ICt9Cj4+PiArCj4+PiArI2VuZGlmCS8qIENPTkZJR19QTSAq Lwo+Pj4gKwo+Pj4gK2ludCB1c2Jzc3BfZ2FkZ2V0X2luaXQoc3RydWN0IHVzYnNzcF91ZGMgKnVz YnNzcF9kYXRhKSB7Cj4+PiArCWludCByZXQ7Cj4+PiArCXJldHVybiByZXQ7Cj4+IHJldCBpcyBu b3QgaW5pdGlhbGl6ZWQgYmVmb3JlIHJldHVybmluZy4KPj4gTWF5YmUganVzdAo+PiByZXR1cm4g MDsKPiBJIGxlZnQgdGhpcyBjb21waWxlciB3YXJuaW5nIGJlY2F1c2UgdGhlIG5leHQgcGF0Y2hl cyB3aWxsIGFkZCBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIGZ1bmN0aW9uIGFuZCB0aGVuIHdhcm5p bmcgZGlzYXBwZWFyLiAKPiBJIHRyYXllZCB0byBwcmVwYXJlIHRoaXMgc2VyaWVzIG9mIHBhdGNo ZXMgaW4gYSB3YXkgdG8gYXZvaWQgZGVsZXRpb24gbGluZSBpbiBuZXh0IHBhdGNoZXMgaW4gc2Vy aWVzLiAKPiAKCkl0IGlzIHBlcmZlY3RseSBmaW5lIHRvIGRlbGV0ZSB0aGluZ3MgaW4gYSBwYXRj aC4gQnV0IGNvbXBpbGVyIHdhcm5pbmdzIHNob3VsZG4ndCBiZSB0aGVyZS4KCj4+PiArfQo+Pj4g Kwo+Pj4gK2ludCB1c2Jzc3BfZ2FkZ2V0X2V4aXQoc3RydWN0IHVzYnNzcF91ZGMgKnVzYnNzcF9k YXRhKSB7Cj4+PiArCWludCByZXQgPSAwOwo+Pj4gKwo+Pj4gKwlyZXR1cm4gcmV0Owo+Pgo+PiBy ZXR1cm4gMDsKPj4KPj4+ICt9Cj4+PiBkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvdXNic3NwL2dh ZGdldC5oIGIvZHJpdmVycy91c2IvdXNic3NwL2dhZGdldC5oCj4+PiBpbmRleCBiNWMxNzYwM2Fm NzguLjU1ZTIwNzk1ZDkwMCAxMDA2NDQKPj4+IC0tLSBhL2RyaXZlcnMvdXNiL3VzYnNzcC9nYWRn ZXQuaAo+Pj4gKysrIGIvZHJpdmVycy91c2IvdXNic3NwL2dhZGdldC5oCj4+PiBAQCAtOSw3ICs5 LDYgQEAKPj4+ICAgKiBBIGxvdCBvZiBjb2RlIGJhc2VkIG9uIExpbnV4IFhIQ0kgZHJpdmVyLgo+ Pj4gICAqIE9yaWdpbjogQ29weXJpZ2h0IChDKSAyMDA4IEludGVsIENvcnAuCj4+PiAgICovCj4+ PiAtCj4+Cj4+IHVubmVjZXNzYXJ5IGJsYW5rIGxpbmUgcmVtb3ZhbAo+Pgo+Pj4gICNpZm5kZWYg X19MSU5VWF9VU0JTU1BfR0FER0VUX0gKPj4+ICAjZGVmaW5lIF9fTElOVVhfVVNCU1NQX0dBREdF VF9ICj4+Pgo+Pj4gQEAgLTE2NzYsNiArMTY3NSwyMSBAQCBzdGF0aWMgaW5saW5lIHZvaWQgdXNi c3NwX3dyaXRlXzY0KHN0cnVjdAo+Pj4gdXNic3NwX3VkYyAqdXNic3NwX2RhdGEsICB7Cj4+PiAg CWxvX2hpX3dyaXRlcSh2YWwsIHJlZ3MpOwo+Pj4gIH0KPj4+ICsKPj4+ICsvKiBVU0JTU1AgRGV2 aWNlIGNvbnRyb2xsZXIgZ2x1ZSAqLwo+Pj4gK2ludCB1c2Jzc3Bfc3VzcGVuZChzdHJ1Y3QgdXNi c3NwX3VkYyAqdXNic3NwX2RhdGEsIGJvb2wgZG9fd2FrZXVwKTsKPj4+ICtpbnQgdXNic3NwX3Jl c3VtZShzdHJ1Y3QgdXNic3NwX3VkYyAqdXNic3NwX2RhdGEsIGJvb2wgaGliZXJuYXRlZCk7Cj4+ PiArCj4+PiAraXJxcmV0dXJuX3QgdXNic3NwX2lycShpbnQgaXJxLCB2b2lkICpwcml2KTsKPj4+ ICsKPj4+ICsvKiBVU0JTU1AgcmluZywgc2VnbWVudCwgVFJCLCBhbmQgVEQgZnVuY3Rpb25zICov IGRtYV9hZGRyX3QKPj4+ICt1c2Jzc3BfdHJiX3ZpcnRfdG9fZG1hKHN0cnVjdCB1c2Jzc3Bfc2Vn bWVudCAqc2VnLAo+Pj4gKwkJCQl1bmlvbiB1c2Jzc3BfdHJiICp0cmIpOwo+Pj4gKwo+Pj4gKy8q IFVTQlNTUCBnYWRnZXQgaW50ZXJmYWNlKi8KPj4+ICtpbnQgdXNic3NwX2dhZGdldF9pbml0KHN0 cnVjdCB1c2Jzc3BfdWRjICp1c2Jzc3BfZGF0YSk7IGludAo+Pj4gK3VzYnNzcF9nYWRnZXRfZXhp dChzdHJ1Y3QgdXNic3NwX3VkYyAqdXNic3NwX2RhdGEpOwo+Pj4gKwo+Pj4gIHN0YXRpYyBpbmxp bmUgY2hhciAqdXNic3NwX3Nsb3Rfc3RhdGVfc3RyaW5nKHUzMiBzdGF0ZSkgIHsKPj4+ICAJc3dp dGNoIChzdGF0ZSkgewo+Pj4gZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL3VzYnNzcC91c2Jzc3At cGxhdC5jCj4+PiBiL2RyaXZlcnMvdXNiL3VzYnNzcC91c2Jzc3AtcGxhdC5jCj4+Cj4+IElzIHRo aXMgZmlsZSBtZWFudCBvbmx5IGZvciBnYWRnZXQgY29udHJvbGxlciBvciBsYXRlciBldmVuIGZv ciBob3N0IGNvbnRyb2xsZXI/Cj4+IElmIG9ubHkgZm9yIGdhZGdldCB0aGVuIHRoaXMgY291bGQg YmUganVzdCBjYWxsZWQgZ2FkZ2V0LXBsYXQuYwo+IAo+IEknbSBub3Qgc3VyZSBhdCB0aGlzIG1v bWVudC4gSSBoYXZlIG5vdCB3b25kZXJlZCAgYXQgbm93IGhvdyB0aGlzIGRyaXZlciB3aWxsIAo+ IGJlIGludGVncmF0ZWQgd2l0aCBYSENJIGRyaXZlciBhbmQgRFJEIGRyaXZlci4KPiAgCgpPSy4K PiAKPj4+IG5ldyBmaWxlIG1vZGUgMTAwNjQ0Cj4+PiBpbmRleCAwMDAwMDAwMDAwMDAuLmMwNDgw NDQxNDhhYQo+Pj4gLS0tIC9kZXYvbnVsbAo+Pj4gKysrIGIvZHJpdmVycy91c2IvdXNic3NwL3Vz YnNzcC1wbGF0LmMKPj4+IEBAIC0wLDAgKzEsMTg2IEBACj4+PiArLy8gU1BEWC1MaWNlbnNlLUlk ZW50aWZpZXI6IEdQTC0yLjAKPj4+ICsvKgo+Pj4gKyAqIFVTQlNTUCBkZXZpY2UgY29udHJvbGxl ciBkcml2ZXIKPj4+ICsgKgo+Pj4gKyAqIENvcHlyaWdodCAoQykgMjAxOCBDYWRlbmNlLgo+Pj4g KyAqCj4+PiArICogQXV0aG9yOiBQYXdlbCBMYXN6Y3phawo+Pj4gKyAqCj4+PiArICovCj4+PiAr Cj4+PiArI2luY2x1ZGUgPGxpbnV4L2Nsay5oPgo+Pj4gKyNpbmNsdWRlIDxsaW51eC9kbWEtbWFw cGluZy5oPgo+Pj4gKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KPj4+ICsjaW5jbHVkZSA8bGlu dXgvcGNpLmg+Cj4+PiArI2luY2x1ZGUgPGxpbnV4L29mLmg+Cj4+PiArI2luY2x1ZGUgPGxpbnV4 L29mX2RldmljZS5oPgo+Pj4gKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KPj4+ ICsjaW5jbHVkZSA8bGludXgvdXNiL3BoeS5oPgo+Pj4gKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+ Cj4+PiArI2luY2x1ZGUgPGxpbnV4L2FjcGkuaD4KPj4+ICsKPj4+ICsjaW5jbHVkZSAiZ2FkZ2V0 LmgiCj4+PiArCj4+PiArI2RlZmluZSBEUklWRVJfQVVUSE9SICJQYXdlbCBMYXN6Y3phayIKPj4+ ICsjZGVmaW5lIERSSVZFUl9ERVNDICJVU0JTU1AgRGV2aWNlIENvbnRyb2xsZXIgKFVTQlNTUCkg RHJpdmVyIgo+Pj4gKwo+Pj4gKyNpZmRlZiBDT05GSUdfT0YKPj4+ICsKPj4+ICtzdGF0aWMgY29u c3Qgc3RydWN0IG9mX2RldmljZV9pZCB1c2Jzc3BfZGV2X29mX21hdGNoW10gPSB7Cj4+PiArCXsK Pj4+ICsJCS5jb21wYXRpYmxlID0gIkNhZGVuY2UsIHVzYnNzcC1kZXYiLAo+Pgo+PiBBdm9pZCB1 cHBlci1jYXNlIGluIGNvbXBhdGlibGUgc3RyaW5ncy4KPj4KPj4+ICsJfSwKPj4+ICsJe30sCj4+ PiArfTsKPj4+ICtNT0RVTEVfREVWSUNFX1RBQkxFKG9mLCB1c2Jzc3BfZGV2X29mX21hdGNoKTsg I2VuZGlmCj4+PiArCj4+PiAraW50IHVzYnNzcF9pc19wbGF0Zm9ybSh2b2lkKQo+Pj4gK3sKPj4+ ICsJcmV0dXJuIDE7Cj4+PiArfQo+Pj4gKwo+Pj4gK3N0YXRpYyBpbnQgdXNic3NwX3BsYXRfcHJv YmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikgewo+Pj4gKwlzdHJ1Y3QgZGV2aWNlICpk ZXYgPSAmcGRldi0+ZGV2Owo+Pj4gKwlzdHJ1Y3QgcmVzb3VyY2UgKnJlczsKPj4+ICsJc3RydWN0 IHVzYnNzcF91ZGMgKnVzYnNzcF9kYXRhOwo+Pj4gKwlpbnQgcmV0ID0gMDsKPj4+ICsJaW50IGly cTsKPj4+ICsJc3RydWN0IGRldmljZSAqc3lzZGV2Owo+Pj4gKwo+Pj4gKwlpcnEgPSBwbGF0Zm9y bV9nZXRfaXJxKHBkZXYsIDApOwo+Pj4gKwlpZiAoaXJxIDwgMCkgewo+Pj4gKwkJZGV2X2Vycigm cGRldi0+ZGV2LCAiSW5jb3JyZWN0IElSUSBudW1iZXJcbiIpOwo+Pgo+PiBJUlEgbnVtYmVyIG1p Z2h0IGJlIGNvcnJlY3QgYnV0IG1pZ2h0IGJlIHNvbWUgb3RoZXIgaXNzdWUuCj4+IFlvdSBjb3Vs ZCBqdXN0IHNheSAiY291bGRuJ3QgZ2V0IElSUSIKPj4KPj4+ICsJCXJldHVybiAtRU5PREVWOwo+ Pgo+PiBBbHNvLCB3ZSBkb24ndCB3YW50IHRvIHByaW50IGFueSBlcnJvciBtZXNzYWdlIGlmIHdl IGdvdCBhIC1FUFJPQkVfREVGRVIuCj4+IEFuZCB3ZSBuZWVkIHRvIHJldHVybiB0aGF0IGluc3Rl YWQgb2YgLUVOT0RFViBmb3IgZGVmZXJyZWQgcHJvYmluZyB0bwo+PiB3b3JrLgo+Pgo+Pj4gKwl9 Cj4+Cj4+IFNvIGhvdyBhYm91dAo+PiAJaWYgKGlycSA8IDApIHsKPj4gCQlpZiAoaXJxICE9IC1F UFJPQkVfREVGRVIpCj4+IAkJCWRldl9lcnIoJnBkZXYtPmRldiwgImNvdWxkbid0IGdldCBJUlFc biIpCj4+Cj4+IAkJcmV0dXJuIGlycTsKPj4gCX0KPj4KPj4+ICsKPj4+ICsJdXNic3NwX2RhdGEg PSBkZXZtX2t6YWxsb2MoZGV2LCBzaXplb2YoKnVzYnNzcF9kYXRhKSwKPj4gR0ZQX0tFUk5FTCk7 Cj4+PiArCWlmICghdXNic3NwX2RhdGEpCj4+PiArCQlyZXR1cm4gLUVOT01FTTsKPj4+ICsKPj4+ ICsJZm9yIChzeXNkZXYgPSAmcGRldi0+ZGV2OyBzeXNkZXY7IHN5c2RldiA9IHN5c2Rldi0+cGFy ZW50KSB7Cj4+PiArCQlpZiAoaXNfb2Zfbm9kZShzeXNkZXYtPmZ3bm9kZSkgfHwKPj4+ICsJCSAg ICBpc19hY3BpX2RldmljZV9ub2RlKHN5c2Rldi0+Zndub2RlKSkKPj4+ICsJCQlicmVhazsKPj4+ ICsjaWZkZWYgQ09ORklHX1BDSQo+Pj4gKwkJZWxzZSBpZiAoc3lzZGV2LT5idXMgPT0gJnBjaV9i dXNfdHlwZSkKPj4+ICsJCQlicmVhazsKPj4+ICsjZW5kaWYKPj4+ICsJfQo+Pgo+PiBJdCBpcyBo YXJkIHRvIHVuZGVyc3RhbmQgd2hhdCBpcyB0aGlzIGZvciBsb29wIGRvaW5nIGV4YWN0bHkuCj4+ Cj4+IHhoY2ktcGxhdC5jIHNlZW1zIHRvIGhhdmUgdGhpcyBjb21tZW50LiBZb3Ugc2hvdWxkIGFk ZCBpdCBhYm92ZSBhcyB3ZWxsLgo+PiAgICAgICAgIC8qCj4+ICAgICAgICAgICogc3lzZGV2IG11 c3QgcG9pbnQgdG8gYSBkZXZpY2UgdGhhdCBpcyBrbm93biB0byB0aGUgc3lzdGVtIGZpcm13YXJl Cj4+ICAgICAgICAgICogb3IgUENJIGhhcmR3YXJlLiBXZSBoYW5kbGUgdGhlc2UgdGhyZWUgY2Fz ZXMgaGVyZToKPj4gICAgICAgICAgKiAxLiB4aGNpX3BsYXQgY29tZXMgZnJvbSBmaXJtd2FyZQo+ PiAgICAgICAgICAqIDIuIHhoY2lfcGxhdCBpcyBjaGlsZCBvZiBhIGRldmljZSBmcm9tIGZpcm13 YXJlIChkd2MzLXBsYXQpCj4+ICAgICAgICAgICogMy4geGhjaV9wbGF0IGlzIGdyYW5kY2hpbGQg b2YgYSBwY2kgZGV2aWNlIChkd2MzLXBjaSkKPj4gICAgICAgICAgKi8KPj4KPj4KPj4+ICsKPj4+ ICsJaWYgKCFzeXNkZXYpCj4+PiArCQlzeXNkZXYgPSAmcGRldi0+ZGV2Owo+Pj4gKwo+Pj4gKwkv KiBUcnkgdG8gc2V0IDY0LWJpdCBETUEgZmlyc3QgKi8KPj4+ICsJaWYgKFdBUk5fT04oIWRldi0+ ZG1hX21hc2spKQo+Pj4gKwkJLyogUGxhdGZvcm0gZGlkIG5vdCBpbml0aWFsaXplIGRtYV9tYXNr ICovCj4+PiArCQlyZXQgPSBkbWFfY29lcmNlX21hc2tfYW5kX2NvaGVyZW50KGRldiwKPj4+ICsJ CQkJRE1BX0JJVF9NQVNLKDY0KSk7Cj4+PiArCWVsc2UKPj4+ICsJCXJldCA9IGRtYV9zZXRfbWFz a19hbmRfY29oZXJlbnQoZGV2LAo+PiBETUFfQklUX01BU0soNjQpKTsKPj4+ICsKPj4+ICsJLyog SWYgc2V0aW5nIDY0LWJpdCBETUEgbWFzayBmYWlscywgZmFsbCBiYWNrIHRvIDMyLWJpdCBETUEg bWFzayAqLwo+Pj4gKwlpZiAocmV0KSB7Cj4+PiArCQlyZXQgPSBkbWFfc2V0X21hc2tfYW5kX2Nv aGVyZW50KGRldiwKPj4gRE1BX0JJVF9NQVNLKDMyKSk7Cj4+PiArCQlpZiAocmV0KQo+Pj4gKwkJ CXJldHVybiByZXQ7Cj4+PiArCX0KPj4+ICsKPj4+ICsJcmVzID0gcGxhdGZvcm1fZ2V0X3Jlc291 cmNlKHBkZXYsIElPUkVTT1VSQ0VfTUVNLCAwKTsKPj4+ICsJdXNic3NwX2RhdGEtPnJlZ3MgPSBk ZXZtX2lvcmVtYXBfcmVzb3VyY2UoZGV2LCByZXMpOwo+Pj4gKwo+Pj4gKwlpZiAoSVNfRVJSKHVz YnNzcF9kYXRhLT5yZWdzKSkgewo+PiBkZXZfZXJyKCkgPwo+Pgo+Pj4gKwkJcmV0ID0gUFRSX0VS Uih1c2Jzc3BfZGF0YS0+cmVncyk7Cj4+PiArCQlyZXR1cm4gcmV0Owo+Pj4gKwl9Cj4+PiArCj4+ PiArCXVzYnNzcF9kYXRhLT5yc3JjX3N0YXJ0ID0gcmVzLT5zdGFydDsKPj4+ICsJdXNic3NwX2Rh dGEtPnJzcmNfbGVuID0gcmVzb3VyY2Vfc2l6ZShyZXMpOwo+Pj4gKwo+Pj4gKwlyZXQgPSBkZXZt X3JlcXVlc3RfaXJxKGRldiwgaXJxLCB1c2Jzc3BfaXJxLCBJUlFGX1NIQVJFRCwKPj4+ICsJCQlk ZXZfbmFtZShkZXYpLCB1c2Jzc3BfZGF0YSk7Cj4+Cj4+IGRldm1fcmVxdWVzdF90aHJlYWRlZF9p cnEoKSA/Cj4gQ3VycmVudGx5IGZvciBkZWZlcnJlZCBpbnRlcnJ1cHRzIEkgdXNlIHdvcmtxdWV1 ZSB0aHJlYWQuIFNvbWUgdGltZSBhZ28gSSB0cmllZCB1c2UgdGhpcyBmdW5jdGlvbgo+IGJ1dCBJ IGhhdmUgc29tZSBwcm9ibGVtIHdpdGggaXQuIEkgaGF2ZSBwbGFuIHRvIHJlcGxhY2UgZGV2bV9y ZXF1ZXN0X2lycSB3aXRoIGRldm1fcmVxdWVzdF90aHJlYWRlZF9pcnEuIAo+IAo+IEluIFVTQlNT UCBjb250cm9sbGVyIGZvciBkZXZpY2Ugc2lkZSBJIGhhdmUgYmlnIHByb2JsZW0gd2l0aCBoYW5k bGluZyBjb21tYW5kcy4gIEhhbmRsaW5nIGNvbW1hbmQgd29ya3MgbGlrZSAKPiBpbiBYSENJIGNv bnRyb2xsZXIuIEFmdGVyIGludm9raW5nIGNvbW1hbmQgZHJpdmVyIGhhcyB0byB3YWl0IGZvciBj b21wbGV0aW9uIHNvIGl0IHNob3VsZCBzbGVlcCBmb3Igc29tZSB0aW1lLiAKPiBEdXJpbmcgd2Fp dGluZyAoZS5nIHdhaXRfZm9yX2NvbXBsZXRpb24pIHdlIG5lZWQgdG8gZW5hYmxlIHRoZSBpbnRl cnJ1cHRzIGJlY2F1c2Ugd2UgbmVlZCB0byBkZXRlY3QgdGhlIGNvbXBsZXRpb24gZXZlbnQuIEFk ZGl0aW9uYWxseSBzb21lIEFQSSAgZnVuY3Rpb24gZnJvbSBVU0JTU1AgZ2FkZ2V0IGRyaXZlciBh cmUgaW52b2tlZCBieSB1cHBlciBsYXllciB3aXRoIGRpc2FibGVkIGludGVycnVwdHMuIAo+IElu IHRoaXMgc2l0dWF0aW9uIHdlIGNhbid0IGVuYWJsZSBpbnRlcnJ1cHQgYmVmb3JlIGludm9raW5n IGNvbW1hbmQgYW5kIGRyaXZlciBoYXMgdG8gZGV0ZWN0IGNvbXBsZXRpb24gaW4gb3RoZXIgd2F5 Lgo+IFRoZSBjb25jZXB0IHRha2VuIGZyb20gdGhlIGhvc3QgaXMgbm90IGEgcGVyZmVjdCBmb3Ig ZGV2aWNlIGRyaXZlciB3aGVyZSBtb3N0IGRyaXZlciBzaG91bGQgd29ya3MgaW4gaW50ZXJydXB0 IGNvbnRleHQsIAo+IAoKRmVsaXBlPyBhbnkgaWRlYXMgaGVyZT8KCj4+PiArCj4+PiArCWlmIChy ZXQgPCAwKQo+Pj4gKwkJcmV0dXJuIHJldDsKPj4+ICsKPj4+ICsJdXNic3NwX2RhdGEtPmlycSA9 IGlycTsKPj4+ICsJdXNic3NwX2RhdGEtPmRldiA9IGRldjsKPj4+ICsJcGxhdGZvcm1fc2V0X2Ry dmRhdGEocGRldiwgdXNic3NwX2RhdGEpOwo+Pj4gKwlyZXQgPSB1c2Jzc3BfZ2FkZ2V0X2luaXQo dXNic3NwX2RhdGEpOwo+Pj4gKwo+Pj4gKwlyZXR1cm4gcmV0Owo+Pj4gK30KPj4+ICsKPj4+ICtz dGF0aWMgaW50IHVzYnNzcF9wbGF0X3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2 KSB7Cj4+PiArCWludCByZXQgPSAwOwo+Pj4gKwlzdHJ1Y3QgdXNic3NwX3VkYyAqdXNic3NwX2Rh dGE7Cj4+PiArCj4+PiArCXVzYnNzcF9kYXRhID0gKHN0cnVjdCB1c2Jzc3BfdWRjICopcGxhdGZv cm1fZ2V0X2RydmRhdGEocGRldik7Cj4+PiArCXJldCA9IHVzYnNzcF9nYWRnZXRfZXhpdCh1c2Jz c3BfZGF0YSk7Cj4+PiArCXJldHVybiByZXQ7Cj4+PiArCj4+Cj4+IG1vdmUgdGhpcyBibGFuayBs aW5lIGFib3ZlIHJldHVybiByZXQ7Cj4+PiArfQo+Pj4gKwo+Pj4gK3N0YXRpYyBpbnQgX19tYXli ZV91bnVzZWQgdXNic3NwX3BsYXRfc3VzcGVuZChzdHJ1Y3QgZGV2aWNlICpkZXYpIHsKPj4+ICsJ c3RydWN0IHVzYnNzcF91ZGMgKnVzYnNzcF9kYXRhID0gZGV2X2dldF9kcnZkYXRhKGRldik7Cj4+ PiArCj4+PiArCXJldHVybiB1c2Jzc3Bfc3VzcGVuZCh1c2Jzc3BfZGF0YSwgZGV2aWNlX21heV93 YWtldXAoZGV2KSk7IH0KPj4+ICsKPj4+ICtzdGF0aWMgaW50IF9fbWF5YmVfdW51c2VkIHVzYnNz cF9wbGF0X3Jlc3VtZShzdHJ1Y3QgZGV2aWNlICpkZXYpIHsKPj4+ICsJc3RydWN0IHVzYnNzcF91 ZGMgKnVzYnNzcF9kYXRhID0gZGV2X2dldF9kcnZkYXRhKGRldik7Cj4+PiArCj4+PiArCXJldHVy biB1c2Jzc3BfcmVzdW1lKHVzYnNzcF9kYXRhLCAwKTsgfQo+Pj4gKwo+Pj4gK3N0YXRpYyBpbnQg X19tYXliZV91bnVzZWQgdXNic3NwX3BsYXRfcnVudGltZV9zdXNwZW5kKHN0cnVjdCBkZXZpY2UK Pj4+ICsqZGV2KSB7Cj4+PiArCXN0cnVjdCB1c2Jzc3BfdWRjICp1c2Jzc3BfZGF0YSA9IGRldl9n ZXRfZHJ2ZGF0YShkZXYpOwo+Pj4gKwo+Pj4gKwlyZXR1cm4gdXNic3NwX3N1c3BlbmQodXNic3Nw X2RhdGEsIHRydWUpOyB9Cj4+PiArCj4+PiArc3RhdGljIGludCBfX21heWJlX3VudXNlZCB1c2Jz c3BfcGxhdF9ydW50aW1lX3Jlc3VtZShzdHJ1Y3QgZGV2aWNlCj4+PiArKmRldikgewo+Pj4gKwlz dHJ1Y3QgdXNic3NwX3VkYyAqdXNic3NwX2RhdGEgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKPj4+ ICsKPj4+ICsJcmV0dXJuIHVzYnNzcF9yZXN1bWUodXNic3NwX2RhdGEsIDApOyB9Cj4+PiArCj4+ PiArc3RhdGljIGNvbnN0IHN0cnVjdCBkZXZfcG1fb3BzIHVzYnNzcF9wbGF0X3BtX29wcyA9IHsK Pj4+ICsJU0VUX1NZU1RFTV9TTEVFUF9QTV9PUFModXNic3NwX3BsYXRfc3VzcGVuZCwKPj4gdXNi c3NwX3BsYXRfcmVzdW1lKQo+Pj4gKwo+Pj4gKwlTRVRfUlVOVElNRV9QTV9PUFModXNic3NwX3Bs YXRfcnVudGltZV9zdXNwZW5kLAo+Pj4gKwkJCXVzYnNzcF9wbGF0X3J1bnRpbWVfcmVzdW1lLAo+ Pj4gKwkJCU5VTEwpCj4+PiArfTsKPj4+ICsKPj4+ICtzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2Ry aXZlciB1c2Jzc3BfZHJpdmVyID0gewo+Pj4gKwkucHJvYmUJPSB1c2Jzc3BfcGxhdF9wcm9iZSwK Pj4+ICsJLnJlbW92ZQk9IHVzYnNzcF9wbGF0X3JlbW92ZSwKPj4+ICsJLmRyaXZlcgk9IHsKPj4+ ICsJCS5uYW1lID0gInVzYnNzcC1kZXYiLAo+Pj4gKwkJLnBtID0gJnVzYnNzcF9wbGF0X3BtX29w cywKPj4+ICsJCS5vZl9tYXRjaF90YWJsZSA9IG9mX21hdGNoX3B0cih1c2Jzc3BfZGV2X29mX21h dGNoKSwKPj4+ICsJfSwKPj4+ICt9Owo+Pj4gKwo+Pj4gK3N0YXRpYyBpbnQgX19pbml0IHVzYnNz cF9wbGF0X2luaXQodm9pZCkgewo+Pj4gKwlyZXR1cm4gcGxhdGZvcm1fZHJpdmVyX3JlZ2lzdGVy KCZ1c2Jzc3BfZHJpdmVyKTsKPj4+ICt9Cj4+PiArbW9kdWxlX2luaXQodXNic3NwX3BsYXRfaW5p dCk7Cj4+PiArCj4+PiArc3RhdGljIHZvaWQgX19leGl0IHVzYnNzcF9wbGF0X2V4aXQodm9pZCkg ewo+Pj4gKwlwbGF0Zm9ybV9kcml2ZXJfdW5yZWdpc3RlcigmdXNic3NwX2RyaXZlcik7Cj4+PiAr fQo+Pj4gK21vZHVsZV9leGl0KHVzYnNzcF9wbGF0X2V4aXQpOwo+Pj4gKwo+Pj4gK01PRFVMRV9B TElBUygicGxhdGZvcm06dXNic3MtZ2FkZ2V0Iik7Cj4+IHVzYnNzcC1nYWRnZXQ/Cj4+Cj4+IFdo eSBkaWQgeW91IGNob29zZSBhIGRpZmZlcmVudCBuYW1lIGZvciBjb21wYXRpYmxlPyAidXNic3Nw LWRldiIKPj4gV291bGQgYmUgbmljZSB0byBoYXZlIGl0IGNvbnNpc3RlbnQuCj4+Cj4+PiArTU9E VUxFX0RFU0NSSVBUSU9OKCJVU0JTU1AnIERldmljZSBDb250cm9sbGVyIChVU0JTU1ApIERyaXZl ciIpOwo+Pgo+PiBVU0JTU1AsIDIgdGltZXM/Cj4+Cj4+PiArTU9EVUxFX0xJQ0VOU0UoIkdQTCB2 MiIpOwo+Pj4KPiBJIHdpbGwgY29ycmVjdCB0aGlzLiAKPj4KPj4gWzFdIGJ1aWxkIGVycm9yCj4+ Cj4+ICAgQ0MgW01dICBkcml2ZXJzL3VzYi91c2Jzc3AvZ2FkZ2V0LXRyYWNlLm8gSW4gZmlsZSBp bmNsdWRlZCBmcm9tCj4+IGRyaXZlcnMvdXNiL3VzYnNzcC9nYWRnZXQtdHJhY2UuaDoyNzowLAo+ PiAgICAgICAgICAgICAgICAgIGZyb20gZHJpdmVycy91c2IvdXNic3NwL2dhZGdldC10cmFjZS5j OjEzOgo+PiBkcml2ZXJzL3VzYi91c2Jzc3AvZ2FkZ2V0Lmg6MTY4MzoxOiBlcnJvcjogdW5rbm93 biB0eXBlIG5hbWUKPj4g4oCYaXJxcmV0dXJuX3TigJkKPj4gIGlycXJldHVybl90IHVzYnNzcF9p cnEoaW50IGlycSwgdm9pZCAqcHJpdik7ICBefn5+fn5+fn5+fiBJbiBmaWxlIGluY2x1ZGVkIGZy b20KPj4gLi9pbmNsdWRlL3RyYWNlL3RyYWNlX2V2ZW50cy5oOjM5NDowLAo+PiAgICAgICAgICAg ICAgICAgIGZyb20gLi9pbmNsdWRlL3RyYWNlL2RlZmluZV90cmFjZS5oOjk2LAo+PiAgICAgICAg ICAgICAgICAgIGZyb20gZHJpdmVycy91c2IvdXNic3NwL2dhZGdldC10cmFjZS5oOjQ4MiwKPj4g ICAgICAgICAgICAgICAgICBmcm9tIGRyaXZlcnMvdXNiL3VzYnNzcC9nYWRnZXQtdHJhY2UuYzox MzoKPj4gZHJpdmVycy91c2IvdXNic3NwLy4vZ2FkZ2V0LXRyYWNlLmg6IEluIGZ1bmN0aW9uCj4+ IOKAmHRyYWNlX3Jhd19vdXRwdXRfdXNic3NwX2xvZ19yZXF1ZXN04oCZOgo+PiBkcml2ZXJzL3Vz Yi91c2Jzc3AvLi9nYWRnZXQtdHJhY2UuaDoyMDE6NDc3OiB3YXJuaW5nOiBmb3JtYXQg4oCYJWxs eOKAmSBleHBlY3RzCj4+IGFyZ3VtZW50IG9mIHR5cGUg4oCYbG9uZyBsb25nIHVuc2lnbmVkIGlu dOKAmSwgYnV0IGFyZ3VtZW50IDYgaGFzIHR5cGUKPj4g4oCYZG1hX2FkZHJfdCB7YWthIHVuc2ln bmVkIGludH3igJkgWy1XZm9ybWF0PV0KPj4gREVDTEFSRV9FVkVOVF9DTEFTUyh1c2Jzc3BfbG9n X3JlcXVlc3QsCj4+Cj4+IF4KPj4gc2NyaXB0cy9NYWtlZmlsZS5idWlsZDozMTc6IHJlY2lwZSBm b3IgdGFyZ2V0ICdkcml2ZXJzL3VzYi91c2Jzc3AvZ2FkZ2V0LQo+PiB0cmFjZS5vJyBmYWlsZWQK Pj4gbWFrZVszXTogKioqIFtkcml2ZXJzL3VzYi91c2Jzc3AvZ2FkZ2V0LXRyYWNlLm9dIEVycm9y IDEKPj4gc2NyaXB0cy9NYWtlZmlsZS5idWlsZDo1NTg6IHJlY2lwZSBmb3IgdGFyZ2V0ICdkcml2 ZXJzL3VzYi91c2Jzc3AnIGZhaWxlZAo+PiBtYWtlWzJdOiAqKiogW2RyaXZlcnMvdXNiL3VzYnNz cF0gRXJyb3IgMgo+PiBzY3JpcHRzL01ha2VmaWxlLmJ1aWxkOjU1ODogcmVjaXBlIGZvciB0YXJn ZXQgJ2RyaXZlcnMvdXNiJyBmYWlsZWQKPj4gbWFrZVsxXTogKioqIFtkcml2ZXJzL3VzYl0gRXJy b3IgMgo+PiBNYWtlZmlsZToxMDI5OiByZWNpcGUgZm9yIHRhcmdldCAnZHJpdmVycycgZmFpbGVk Cj4+IG1ha2U6ICoqKiBbZHJpdmVyc10gRXJyb3IgMgo+Pgo+PiAtLQo+IGNoZWVycywKPiBQYXdl bAo+Cg==