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=-7.0 required=3.0 tests=DKIMWL_WL_MED,DKIM_SIGNED, DKIM_VALID,HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_PATCH,MAILING_LIST_MULTI, SIGNED_OFF_BY,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 709BAC04EB9 for ; Wed, 5 Dec 2018 15:02:25 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id 13DB92084C for ; Wed, 5 Dec 2018 15:02:24 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (2048-bit key) header.d=baylibre-com.20150623.gappssmtp.com header.i=@baylibre-com.20150623.gappssmtp.com header.b="p9XetDgC" DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 13DB92084C Authentication-Results: mail.kernel.org; dmarc=none (p=none dis=none) header.from=baylibre.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 S1727925AbeLEPCX (ORCPT ); Wed, 5 Dec 2018 10:02:23 -0500 Received: from mail-wm1-f65.google.com ([209.85.128.65]:37038 "EHLO mail-wm1-f65.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1727888AbeLEPCX (ORCPT ); Wed, 5 Dec 2018 10:02:23 -0500 Received: by mail-wm1-f65.google.com with SMTP id g67so13180123wmd.2 for ; Wed, 05 Dec 2018 07:02:20 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=baylibre-com.20150623.gappssmtp.com; s=20150623; h=subject:to:cc:references:from:openpgp:autocrypt:organization :message-id:date:user-agent:mime-version:in-reply-to :content-language:content-transfer-encoding; bh=bGynSR3sym+42cUjytHoZSlzy93vn4mANzjgbQsDTOo=; b=p9XetDgCdaVhMdo1jK2CzAvH5FJM21AThj5j87ziZEWQUuB07NRiJOwHiwP3lcSljv INZwVs13IVoJu3XlApN35cTcC5bI5Wxihxx8DsIJyOFHb/bQcdGka09kYCVwtWAcKb44 vOfPI05WxPOVimyR4rBN/iw4JtsLp4Ok0mZ0KfRCDrBbylDMlYQXQfOFTcS66yOnVx9/ Rav8+4gHa596sb9vyZQhyiiRZRgFzrAwV9QZQvKwbiCVAxBzYtCTzxWYBbUI7i/1q2oE 2F9otTbr5ou9lHVdiAJZq/A3e2fHSF6Av/UHsYp3edNKIKtgYgKSphNRxEgf6K5zR3xM 2IrA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:subject:to:cc:references:from:openpgp:autocrypt :organization:message-id:date:user-agent:mime-version:in-reply-to :content-language:content-transfer-encoding; bh=bGynSR3sym+42cUjytHoZSlzy93vn4mANzjgbQsDTOo=; b=CYsCoweSeiKF98Eu2BCmifvCju35rkVAMkoAt1owoMfY4LVFIqpy9Ry1SeAJ4znyRc GOBUQB2XO52JEZ1RDmyv+MbWi/bQEnGNxIr8jaoE3cYyMX7mE/gQ3m/B/7zqFuOQo4WT QzJWX1lnBpHAUAVcsa2FiAFKIwFjsIbPaHHaBWOlxRdW8ePmRM1yNpch2mdQxynFIQ4T vS7DKf/nkAjXr7umud4cAQCEY/yeZxK/bRo5nko9Sfz9qgnjvkHr2aKuD+IQe1rVeTbH 180Cc9xLroZEPspurul4j1Mp3wY2Rp8MPIewXqLDG7Aex0uDrhWeb8aoNQcutPGylZtx gwzA== X-Gm-Message-State: AA+aEWYxo6d4fRbHf/zcdzi3sdimfN+zJpK1yOuEkUP+gh6trWNugA/i ihIJ3JirXrd4XuDyKt0Q/x8DT5rI663buQ== X-Google-Smtp-Source: AFSGD/Xs1EGYO/g+89ctnehdvG4hBXCRYt7qj9svVDPGauGDnQLkj34luOr+ZqzGo5SvLeeuSJNZ4A== X-Received: by 2002:a1c:b4e:: with SMTP id 75mr2628907wml.143.1544022139214; Wed, 05 Dec 2018 07:02:19 -0800 (PST) Received: from ?IPv6:2a01:cb1d:4ce:ea00:819f:4d34:9af9:e67? ([2a01:cb1d:4ce:ea00:819f:4d34:9af9:e67]) by smtp.gmail.com with ESMTPSA id j8sm18291226wmd.0.2018.12.05.07.02.18 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Wed, 05 Dec 2018 07:02:18 -0800 (PST) Subject: Re: [PATCH v5 2/2] rtc: support for the Amlogic Meson RTC To: Ben Dooks , Martin Blumenstingl , linux-amlogic@lists.infradead.org, linux-rtc@vger.kernel.org, alexandre.belloni@bootlin.com, a.zummo@towertech.it Cc: linux-kernel@vger.kernel.org, linux-arm-kernel@lists.infradead.org, ccaione@baylibre.com References: <20181202220847.24364-1-martin.blumenstingl@googlemail.com> <20181202220847.24364-3-martin.blumenstingl@googlemail.com> <85aa8e12-0bca-6432-e1a8-0faceff1dd5e@codethink.co.uk> From: Neil Armstrong Openpgp: preference=signencrypt Autocrypt: addr=narmstrong@baylibre.com; prefer-encrypt=mutual; keydata= xsBNBE1ZBs8BCAD78xVLsXPwV/2qQx2FaO/7mhWL0Qodw8UcQJnkrWmgTFRobtTWxuRx8WWP GTjuhvbleoQ5Cxjr+v+1ARGCH46MxFP5DwauzPekwJUD5QKZlaw/bURTLmS2id5wWi3lqVH4 BVF2WzvGyyeV1o4RTCYDnZ9VLLylJ9bneEaIs/7cjCEbipGGFlfIML3sfqnIvMAxIMZrvcl9 qPV2k+KQ7q+aXavU5W+yLNn7QtXUB530Zlk/d2ETgzQ5FLYYnUDAaRl+8JUTjc0CNOTpCeik 80TZcE6f8M76Xa6yU8VcNko94Ck7iB4vj70q76P/J7kt98hklrr85/3NU3oti3nrIHmHABEB AAHNKE5laWwgQXJtc3Ryb25nIDxuYXJtc3Ryb25nQGJheWxpYnJlLmNvbT7CwHsEEwEKACUC GyMGCwkIBwMCBhUIAgkKCwQWAgMBAh4BAheABQJXDO2CAhkBAAoJEBaat7Gkz/iubGIH/iyk RqvgB62oKOFlgOTYCMkYpm2aAOZZLf6VKHKc7DoVwuUkjHfIRXdslbrxi4pk5VKU6ZP9AKsN NtMZntB8WrBTtkAZfZbTF7850uwd3eU5cN/7N1Q6g0JQihE7w4GlIkEpQ8vwSg5W7hkx3yQ6 2YzrUZh/b7QThXbNZ7xOeSEms014QXazx8+txR7jrGF3dYxBsCkotO/8DNtZ1R+aUvRfpKg5 ZgABTC0LmAQnuUUf2PHcKFAHZo5KrdO+tyfL+LgTUXIXkK+tenkLsAJ0cagz1EZ5gntuheLD YJuzS4zN+1Asmb9kVKxhjSQOcIh6g2tw7vaYJgL/OzJtZi6JlIXOwE0ETVkGzwEIALyKDN/O GURaHBVzwjgYq+ZtifvekdrSNl8TIDH8g1xicBYpQTbPn6bbSZbdvfeQPNCcD4/EhXZuhQXM coJsQQQnO4vwVULmPGgtGf8PVc7dxKOeta+qUh6+SRh3vIcAUFHDT3f/Zdspz+e2E0hPV2hi SvICLk11qO6cyJE13zeNFoeY3ggrKY+IzbFomIZY4yG6xI99NIPEVE9lNBXBKIlewIyVlkOa YvJWSV+p5gdJXOvScNN1epm5YHmf9aE2ZjnqZGoMMtsyw18YoX9BqMFInxqYQQ3j/HpVgTSv mo5ea5qQDDUaCsaTf8UeDcwYOtgI8iL4oHcsGtUXoUk33HEAEQEAAcLAXwQYAQIACQUCTVkG zwIbDAAKCRAWmrexpM/4rrXiB/sGbkQ6itMrAIfnM7IbRuiSZS1unlySUVYu3SD6YBYnNi3G 5EpbwfBNuT3H8//rVvtOFK4OD8cRYkxXRQmTvqa33eDIHu/zr1HMKErm+2SD6PO9umRef8V8 2o2oaCLvf4WeIssFjwB0b6a12opuRP7yo3E3gTCSKmbUuLv1CtxKQF+fUV1cVaTPMyT25Od+ RC1K+iOR0F54oUJvJeq7fUzbn/KdlhA8XPGzwGRy4zcsPWvwnXgfe5tk680fEKZVwOZKIEuJ C3v+/yZpQzDvGYJvbyix0lHnrCzq43WefRHI5XTTQbM0WUIBIcGmq38+OgUsMYu4NzLu7uZF Acmp6h8g Organization: Baylibre Message-ID: Date: Wed, 5 Dec 2018 16:02:17 +0100 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:60.0) Gecko/20100101 Thunderbird/60.2.1 MIME-Version: 1.0 In-Reply-To: <85aa8e12-0bca-6432-e1a8-0faceff1dd5e@codethink.co.uk> Content-Type: text/plain; charset=utf-8 Content-Language: en-US Content-Transfer-Encoding: 8bit Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Hi Ben, On 05/12/2018 14:36, Ben Dooks wrote: > On 02/12/2018 22:08, Martin Blumenstingl wrote: >> Add support for the RTC block on the 32-bit Amlogic Meson6, Meson8, >> Meson8b and Meson8m2 SoCs. >> >> The RTC is split in to two parts, which are both managed by this driver: >> - the AHB front end >> - and a simple serial connection to the actual registers >> >> The RTC_COUNTER register which holds the time is 32-bits wide. >> >> There are four 32-bit wide (in total: 16 bytes) "regmem" registers which >> are exposed using nvmem. On Amlogic's 3.10 kernel this is used to store >> data which needs to survive a suspend / resume cycle. >> >> Signed-off-by: Ben Dooks >> [resurrected Ben's patches after 2 years] >> Signed-off-by: Martin Blumenstingl > > Just checking if the change of author is deliberate? > not sure how to do >1 author on patches like this. Martin has been very explicit about that in the cover letter : https://patchwork.kernel.org/cover/10708427/ Neil > >> --- >>   drivers/rtc/Kconfig     |  11 ++ >>   drivers/rtc/Makefile    |   1 + >>   drivers/rtc/rtc-meson.c | 409 ++++++++++++++++++++++++++++++++++++++++ >>   3 files changed, 421 insertions(+) >>   create mode 100644 drivers/rtc/rtc-meson.c >> >> diff --git a/drivers/rtc/Kconfig b/drivers/rtc/Kconfig >> index a819ef07b7ec..d5d0e3affdc6 100644 >> --- a/drivers/rtc/Kconfig >> +++ b/drivers/rtc/Kconfig >> @@ -1285,6 +1285,17 @@ config RTC_DRV_IMXDI >>          This driver can also be built as a module, if so, the module >>          will be called "rtc-imxdi". >>   +config RTC_DRV_MESON >> +    tristate "Amlogic Meson RTC" >> +    depends on (ARM && ARCH_MESON) || COMPILE_TEST >> +    select REGMAP_MMIO >> +    help >> +       Support for the RTC block on the Amlogic Meson6, Meson8, Meson8b >> +       and Meson8m2 SoCs. >> + >> +       This driver can also be built as a module, if so, the module >> +       will be called "rtc-meson". >> + >>   config RTC_DRV_OMAP >>       tristate "TI OMAP Real Time Clock" >>       depends on ARCH_OMAP || ARCH_DAVINCI || COMPILE_TEST >> diff --git a/drivers/rtc/Makefile b/drivers/rtc/Makefile >> index 290c1730fb0a..3b088e75149d 100644 >> --- a/drivers/rtc/Makefile >> +++ b/drivers/rtc/Makefile >> @@ -99,6 +99,7 @@ obj-$(CONFIG_RTC_DRV_MAX8997)    += rtc-max8997.o >>   obj-$(CONFIG_RTC_DRV_MAX8998)    += rtc-max8998.o >>   obj-$(CONFIG_RTC_DRV_MC13XXX)    += rtc-mc13xxx.o >>   obj-$(CONFIG_RTC_DRV_MCP795)    += rtc-mcp795.o >> +obj-$(CONFIG_RTC_DRV_MESON)    += rtc-meson.o >>   obj-$(CONFIG_RTC_DRV_MOXART)    += rtc-moxart.o >>   obj-$(CONFIG_RTC_DRV_MPC5121)    += rtc-mpc5121.o >>   obj-$(CONFIG_RTC_DRV_MSM6242)    += rtc-msm6242.o >> diff --git a/drivers/rtc/rtc-meson.c b/drivers/rtc/rtc-meson.c >> new file mode 100644 >> index 000000000000..09d6849b804a >> --- /dev/null >> +++ b/drivers/rtc/rtc-meson.c >> @@ -0,0 +1,409 @@ >> +// SPDX-License-Identifier: GPL-2.0 >> +/* >> + * RTC driver for the interal RTC block in the Amlogic Meson6, Meson8, >> + * Meson8b and Meson8m2 SoCs. >> + * >> + * The RTC is split in to two parts, the AHB front end and a simple serial >> + * connection to the actual registers. This driver manages both parts. >> + * >> + * Copyright (c) 2018 Martin Blumenstingl >> + * Copyright (c) 2015 Ben Dooks for Codethink Ltd >> + * Based on origin by Carlo Caione >> + */ >> + >> +#include >> +#include >> +#include >> +#include >> +#include >> +#include >> +#include >> +#include >> +#include >> +#include >> +#include >> +#include >> + >> +/* registers accessed from cpu bus */ >> +#define RTC_ADDR0                0x00 >> +    #define RTC_ADDR0_LINE_SCLK        BIT(0) >> +    #define RTC_ADDR0_LINE_SEN        BIT(1) >> +    #define RTC_ADDR0_LINE_SDI        BIT(2) >> +    #define RTC_ADDR0_START_SER        BIT(17) >> +    #define RTC_ADDR0_WAIT_SER        BIT(22) >> +    #define RTC_ADDR0_DATA            GENMASK(31, 24) >> + >> +#define RTC_ADDR1                0x04 >> +    #define RTC_ADDR1_SDO            BIT(0) >> +    #define RTC_ADDR1_S_READY        BIT(1) >> + >> +#define RTC_ADDR2                0x08 >> +#define RTC_ADDR3                0x0c >> + >> +#define RTC_REG4                0x10 >> +    #define RTC_REG4_STATIC_VALUE        GENMASK(7, 0) >> + >> +/* rtc registers accessed via rtc-serial interface */ >> +#define RTC_COUNTER        (0) >> +#define RTC_SEC_ADJ        (2) >> +#define RTC_REGMEM_0        (4) >> +#define RTC_REGMEM_1        (5) >> +#define RTC_REGMEM_2        (6) >> +#define RTC_REGMEM_3        (7) >> + >> +#define RTC_ADDR_BITS        (3)    /* number of address bits to send */ >> +#define RTC_DATA_BITS        (32)    /* number of data bits to tx/rx */ >> + >> +#define MESON_STATIC_BIAS_CUR    (0x5 << 1) >> +#define MESON_STATIC_VOLTAGE    (0x3 << 11) >> +#define MESON_STATIC_DEFAULT    (MESON_STATIC_BIAS_CUR | MESON_STATIC_VOLTAGE) >> + >> +struct meson_rtc { >> +    struct rtc_device    *rtc;        /* rtc device we created */ >> +    struct device        *dev;        /* device we bound from */ >> +    struct reset_control    *reset;        /* reset source */ >> +    struct regulator    *vdd;        /* voltage input */ >> +    struct regmap        *peripheral;    /* peripheral registers */ >> +    struct regmap        *serial;    /* serial registers */ >> +}; >> + >> +static const struct regmap_config meson_rtc_peripheral_regmap_config = { >> +    .name        = "peripheral-registers", >> +    .reg_bits    = 8, >> +    .val_bits    = 32, >> +    .reg_stride    = 4, >> +    .max_register    = RTC_REG4, >> +    .fast_io    = true, >> +}; >> + >> +/* RTC front-end serialiser controls */ >> + >> +static void meson_rtc_sclk_pulse(struct meson_rtc *rtc) >> +{ >> +    udelay(5); >> +    regmap_update_bits(rtc->peripheral, RTC_ADDR0, RTC_ADDR0_LINE_SCLK, 0); >> +    udelay(5); >> +    regmap_update_bits(rtc->peripheral, RTC_ADDR0, RTC_ADDR0_LINE_SCLK, >> +               RTC_ADDR0_LINE_SCLK); >> +} >> + >> +static void meson_rtc_send_bit(struct meson_rtc *rtc, unsigned int bit) >> +{ >> +    regmap_update_bits(rtc->peripheral, RTC_ADDR0, RTC_ADDR0_LINE_SDI, >> +               bit ? RTC_ADDR0_LINE_SDI : 0); >> +    meson_rtc_sclk_pulse(rtc); >> +} >> + >> +static void meson_rtc_send_bits(struct meson_rtc *rtc, u32 data, >> +                unsigned int nr) >> +{ >> +    u32 bit = 1 << (nr - 1); >> + >> +    while (bit) { >> +        meson_rtc_send_bit(rtc, data & bit); >> +        bit >>= 1; >> +    } >> +} >> + >> +static void meson_rtc_set_dir(struct meson_rtc *rtc, u32 mode) >> +{ >> +    regmap_update_bits(rtc->peripheral, RTC_ADDR0, RTC_ADDR0_LINE_SEN, 0); >> +    regmap_update_bits(rtc->peripheral, RTC_ADDR0, RTC_ADDR0_LINE_SDI, 0); >> +    meson_rtc_send_bit(rtc, mode); >> +    regmap_update_bits(rtc->peripheral, RTC_ADDR0, RTC_ADDR0_LINE_SDI, 0); >> +} >> + >> +static u32 meson_rtc_get_data(struct meson_rtc *rtc) >> +{ >> +    u32 tmp, val = 0; >> +    int bit; >> + >> +    for (bit = 0; bit < RTC_DATA_BITS; bit++) { >> +        meson_rtc_sclk_pulse(rtc); >> +        val <<= 1; >> + >> +        regmap_read(rtc->peripheral, RTC_ADDR1, &tmp); >> +        val |= tmp & RTC_ADDR1_SDO; >> +    } >> + >> +    return val; >> +} >> + >> +static int meson_rtc_get_bus(struct meson_rtc *rtc) >> +{ >> +    int ret, retries = 3; >> +    u32 val; >> + >> +    /* prepare bus for transfers, set all lines low */ >> +    val = RTC_ADDR0_LINE_SDI | RTC_ADDR0_LINE_SEN | RTC_ADDR0_LINE_SCLK; >> +    regmap_update_bits(rtc->peripheral, RTC_ADDR0, val, 0); >> + >> +    for (retries = 0; retries < 3; retries++) { >> +        /* wait for the bus to be ready */ >> +        if (!regmap_read_poll_timeout(rtc->peripheral, RTC_ADDR1, val, >> +                          val & RTC_ADDR1_S_READY, 10, >> +                          10000)) >> +            return 0; >> + >> +        dev_warn(rtc->dev, "failed to get bus, resetting RTC\n"); >> + >> +        ret = reset_control_reset(rtc->reset); >> +        if (ret) >> +            return ret; >> +    } >> + >> +    dev_err(rtc->dev, "bus is not ready\n"); >> +    return -ETIMEDOUT; >> +} >> + >> +static int meson_rtc_serial_bus_reg_read(void *context, unsigned int reg, >> +                     unsigned int *data) >> +{ >> +    struct meson_rtc *rtc = context; >> +    int ret; >> + >> +    ret = meson_rtc_get_bus(rtc); >> +    if (ret) >> +        return ret; >> + >> +    regmap_update_bits(rtc->peripheral, RTC_ADDR0, RTC_ADDR0_LINE_SEN, >> +               RTC_ADDR0_LINE_SEN); >> +    meson_rtc_send_bits(rtc, reg, RTC_ADDR_BITS); >> +    meson_rtc_set_dir(rtc, 0); >> +    *data = meson_rtc_get_data(rtc); >> + >> +    return 0; >> +} >> + >> +static int meson_rtc_serial_bus_reg_write(void *context, unsigned int reg, >> +                      unsigned int data) >> +{ >> +    struct meson_rtc *rtc = context; >> +    int ret; >> + >> +    ret = meson_rtc_get_bus(rtc); >> +    if (ret) >> +        return ret; >> + >> +    regmap_update_bits(rtc->peripheral, RTC_ADDR0, RTC_ADDR0_LINE_SEN, >> +               RTC_ADDR0_LINE_SEN); >> +    meson_rtc_send_bits(rtc, data, RTC_DATA_BITS); >> +    meson_rtc_send_bits(rtc, reg, RTC_ADDR_BITS); >> +    meson_rtc_set_dir(rtc, 1); >> + >> +    return 0; >> +} >> + >> +static const struct regmap_bus meson_rtc_serial_bus = { >> +    .reg_read    = meson_rtc_serial_bus_reg_read, >> +    .reg_write    = meson_rtc_serial_bus_reg_write, >> +}; >> + >> +static const struct regmap_config meson_rtc_serial_regmap_config = { >> +    .name        = "serial-registers", >> +    .reg_bits    = 4, >> +    .reg_stride    = 1, >> +    .val_bits    = 32, >> +    .max_register    = RTC_REGMEM_3, >> +    .fast_io    = false, >> +}; >> + >> +static int meson_rtc_write_static(struct meson_rtc *rtc, u32 data) >> +{ >> +    u32 tmp; >> + >> +    regmap_write(rtc->peripheral, RTC_REG4, >> +             FIELD_PREP(RTC_REG4_STATIC_VALUE, (data >> 8))); >> + >> +    /* write the static value and start the auto serializer */ >> +    tmp = FIELD_PREP(RTC_ADDR0_DATA, (data & 0xff)) | RTC_ADDR0_START_SER; >> +    regmap_update_bits(rtc->peripheral, RTC_ADDR0, >> +               RTC_ADDR0_DATA | RTC_ADDR0_START_SER, tmp); >> + >> +    /* wait for the auto serializer to complete */ >> +    return regmap_read_poll_timeout(rtc->peripheral, RTC_REG4, tmp, >> +                    !(tmp & RTC_ADDR0_WAIT_SER), 10, >> +                    10000); >> +} >> + >> +/* RTC interface layer functions */ >> + >> +static int meson_rtc_gettime(struct device *dev, struct rtc_time *tm) >> +{ >> +    struct meson_rtc *rtc = dev_get_drvdata(dev); >> +    u32 time; >> +    int ret; >> + >> +    ret = regmap_read(rtc->serial, RTC_COUNTER, &time); >> +    if (!ret) >> +        rtc_time64_to_tm(time, tm); >> + >> +    return ret; >> +} >> + >> +static int meson_rtc_settime(struct device *dev, struct rtc_time *tm) >> +{ >> +    struct meson_rtc *rtc = dev_get_drvdata(dev); >> + >> +    return regmap_write(rtc->serial, RTC_COUNTER, rtc_tm_to_time64(tm)); >> +} >> + >> +static const struct rtc_class_ops meson_rtc_ops = { >> +    .read_time    = meson_rtc_gettime, >> +    .set_time    = meson_rtc_settime, >> +}; >> + >> +/* NVMEM interface layer functions */ >> + >> +static int meson_rtc_regmem_read(void *context, unsigned int offset, >> +                 void *buf, size_t bytes) >> +{ >> +    struct meson_rtc *rtc = context; >> +    unsigned int read_offset, read_size; >> + >> +    read_offset = RTC_REGMEM_0 + (offset / 4); >> +    read_size = bytes / 4; >> + >> +    return regmap_bulk_read(rtc->serial, read_offset, buf, read_size); >> +} >> + >> +static int meson_rtc_regmem_write(void *context, unsigned int offset, >> +                  void *buf, size_t bytes) >> +{ >> +    struct meson_rtc *rtc = context; >> +    unsigned int write_offset, write_size; >> + >> +    write_offset = RTC_REGMEM_0 + (offset / 4); >> +    write_size = bytes / 4; >> + >> +    return regmap_bulk_write(rtc->serial, write_offset, buf, write_size); >> +} >> + >> +static int meson_rtc_probe(struct platform_device *pdev) >> +{ >> +    struct nvmem_config meson_rtc_nvmem_config = { >> +        .name = "meson-rtc-regmem", >> +        .word_size = 4, >> +        .stride = 4, >> +        .size = SZ_16, >> +        .reg_read = meson_rtc_regmem_read, >> +        .reg_write = meson_rtc_regmem_write, >> +    }; >> +    struct device *dev = &pdev->dev; >> +    struct meson_rtc *rtc; >> +    struct resource *res; >> +    void __iomem *base; >> +    int ret; >> +    u32 tm; >> + >> +    rtc = devm_kzalloc(dev, sizeof(struct meson_rtc), GFP_KERNEL); >> +    if (!rtc) >> +        return -ENOMEM; >> + >> +    rtc->rtc = devm_rtc_allocate_device(dev); >> +    if (IS_ERR(rtc->rtc)) >> +        return PTR_ERR(rtc->rtc); >> + >> +    platform_set_drvdata(pdev, rtc); >> + >> +    rtc->dev = dev; >> + >> +    rtc->rtc->ops = &meson_rtc_ops; >> +    rtc->rtc->range_max = U32_MAX; >> + >> +    res = platform_get_resource(pdev, IORESOURCE_MEM, 0); >> +    base = devm_ioremap_resource(dev, res); >> +    if (IS_ERR(base)) >> +        return PTR_ERR(base); >> + >> +    rtc->peripheral = devm_regmap_init_mmio(dev, base, >> +                    &meson_rtc_peripheral_regmap_config); >> +    if (IS_ERR(rtc->peripheral)) { >> +        dev_err(dev, "failed to create peripheral regmap\n"); >> +        return PTR_ERR(rtc->peripheral); >> +    } >> + >> +    rtc->reset = devm_reset_control_get(dev, NULL); >> +    if (IS_ERR(rtc->reset)) { >> +        dev_err(dev, "missing reset line\n"); >> +        return PTR_ERR(rtc->reset); >> +    } >> + >> +    rtc->vdd = devm_regulator_get(dev, "vdd"); >> +    if (IS_ERR(rtc->vdd)) { >> +        dev_err(dev, "failed to get the vdd-supply\n"); >> +        return PTR_ERR(rtc->vdd); >> +    } >> + >> +    ret = regulator_enable(rtc->vdd); >> +    if (ret) { >> +        dev_err(dev, "failed to enable vdd-supply\n"); >> +        return ret; >> +    } >> + >> +    ret = meson_rtc_write_static(rtc, MESON_STATIC_DEFAULT); >> +    if (ret) { >> +        dev_err(dev, "failed to set static values\n"); >> +        goto out_disable_vdd; >> +    } >> + >> +    rtc->serial = devm_regmap_init(dev, &meson_rtc_serial_bus, rtc, >> +                       &meson_rtc_serial_regmap_config); >> +    if (IS_ERR(rtc->serial)) { >> +        dev_err(dev, "failed to create serial regmap\n"); >> +        ret = PTR_ERR(rtc->serial); >> +        goto out_disable_vdd; >> +    } >> + >> +    /* >> +     * check if we can read RTC counter, if not then the RTC is probably >> +     * not functional. If it isn't probably best to not bind. >> +     */ >> +    ret = regmap_read(rtc->serial, RTC_COUNTER, &tm); >> +    if (ret) { >> +        dev_err(dev, "cannot read RTC counter, RTC not functional\n"); >> +        goto out_disable_vdd; >> +    } >> + >> +    meson_rtc_nvmem_config.priv = rtc; >> +    ret = rtc_nvmem_register(rtc->rtc, &meson_rtc_nvmem_config); >> +    if (ret) >> +        goto out_disable_vdd; >> + >> +    ret = rtc_register_device(rtc->rtc); >> +    if (ret) >> +        goto out_unregister_nvmem; >> + >> +    return 0; >> + >> +out_unregister_nvmem: >> +    rtc_nvmem_unregister(rtc->rtc); >> + >> +out_disable_vdd: >> +    regulator_disable(rtc->vdd); >> +    return ret; >> +} >> + >> +static const struct of_device_id meson_rtc_dt_match[] = { >> +    { .compatible = "amlogic,meson6-rtc", }, >> +    { .compatible = "amlogic,meson8-rtc", }, >> +    { .compatible = "amlogic,meson8b-rtc", }, >> +    { .compatible = "amlogic,meson8m2-rtc", }, >> +    { }, >> +}; >> +MODULE_DEVICE_TABLE(of, meson_rtc_dt_match); >> + >> +static struct platform_driver meson_rtc_driver = { >> +    .probe        = meson_rtc_probe, >> +    .driver        = { >> +        .name    = "meson-rtc", >> +        .of_match_table    = of_match_ptr(meson_rtc_dt_match), >> +    }, >> +}; >> +module_platform_driver(meson_rtc_driver); >> + >> +MODULE_DESCRIPTION("Amlogic Meson RTC Driver"); >> +MODULE_AUTHOR("Ben Dooks "); >> +MODULE_AUTHOR("Martin Blumenstingl "); >> +MODULE_LICENSE("GPL v2"); >> +MODULE_ALIAS("platform:meson-rtc"); >> > > 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.7 required=3.0 tests=DKIMWL_WL_HIGH,DKIM_SIGNED, DKIM_VALID,HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_PATCH,MAILING_LIST_MULTI, SIGNED_OFF_BY,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 7B450C04EB9 for ; Wed, 5 Dec 2018 15:02:45 +0000 (UTC) Received: from bombadil.infradead.org (bombadil.infradead.org [198.137.202.133]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id 449FB206B7 for ; Wed, 5 Dec 2018 15:02:45 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (2048-bit key) header.d=lists.infradead.org header.i=@lists.infradead.org header.b="rJwJOI2L"; dkim=fail reason="signature verification failed" (2048-bit key) header.d=baylibre-com.20150623.gappssmtp.com header.i=@baylibre-com.20150623.gappssmtp.com header.b="p9XetDgC" DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 449FB206B7 Authentication-Results: mail.kernel.org; dmarc=none (p=none dis=none) header.from=baylibre.com Authentication-Results: mail.kernel.org; spf=none smtp.mailfrom=linux-arm-kernel-bounces+infradead-linux-arm-kernel=archiver.kernel.org@lists.infradead.org DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=bombadil.20170209; h=Sender: Content-Transfer-Encoding:Content-Type:Cc:List-Subscribe:List-Help:List-Post: List-Archive:List-Unsubscribe:List-Id:In-Reply-To:MIME-Version:Date: Message-ID:From:References:To:Subject:Reply-To:Content-ID:Content-Description :Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID: List-Owner; bh=rXNBGgx8G+WzIGyaNTxECAEr8uqrK5BnhIJOElmXs4A=; b=rJwJOI2Ljnx417 +YMBxVxrTHEYBBDnC5KrT7cDG3PU5sa169u/wJNpR5rjQQUYEJ9rnFvC8G/eSfGDtYU2A/crexQvY zGhK5X5lpUKWIRVBD79zN5YMn+oveT/V9HOsGP2m6odkEutoTI6/uVB65zzfzGVpgq/MPVouxdqRQ moBDxq1WfcLVvv6Qky/f6dgltoSDhqijybka1FEsGdTuctNWuPgC7hNbEww5lLylrX5ucM3R612MH qV7WDyQTbLIFac7TjIIsQT8pJd9NcvF43AZYXy41gNudbapj+dbRhp2o+b9ADg4Xp8CVM0YlzlIxJ Kubijr980iFRz2EA0WYg==; Received: from localhost ([127.0.0.1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.90_1 #2 (Red Hat Linux)) id 1gUYhF-0006vO-4e; Wed, 05 Dec 2018 15:02:41 +0000 Received: from mail-wm1-x341.google.com ([2a00:1450:4864:20::341]) by bombadil.infradead.org with esmtps (Exim 4.90_1 #2 (Red Hat Linux)) id 1gUYh5-0006i6-Mb for linux-arm-kernel@lists.infradead.org; Wed, 05 Dec 2018 15:02:38 +0000 Received: by mail-wm1-x341.google.com with SMTP id q26so13165408wmf.5 for ; Wed, 05 Dec 2018 07:02:20 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=baylibre-com.20150623.gappssmtp.com; s=20150623; h=subject:to:cc:references:from:openpgp:autocrypt:organization :message-id:date:user-agent:mime-version:in-reply-to :content-language:content-transfer-encoding; bh=bGynSR3sym+42cUjytHoZSlzy93vn4mANzjgbQsDTOo=; b=p9XetDgCdaVhMdo1jK2CzAvH5FJM21AThj5j87ziZEWQUuB07NRiJOwHiwP3lcSljv INZwVs13IVoJu3XlApN35cTcC5bI5Wxihxx8DsIJyOFHb/bQcdGka09kYCVwtWAcKb44 vOfPI05WxPOVimyR4rBN/iw4JtsLp4Ok0mZ0KfRCDrBbylDMlYQXQfOFTcS66yOnVx9/ Rav8+4gHa596sb9vyZQhyiiRZRgFzrAwV9QZQvKwbiCVAxBzYtCTzxWYBbUI7i/1q2oE 2F9otTbr5ou9lHVdiAJZq/A3e2fHSF6Av/UHsYp3edNKIKtgYgKSphNRxEgf6K5zR3xM 2IrA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:subject:to:cc:references:from:openpgp:autocrypt :organization:message-id:date:user-agent:mime-version:in-reply-to :content-language:content-transfer-encoding; bh=bGynSR3sym+42cUjytHoZSlzy93vn4mANzjgbQsDTOo=; b=mK6CLk5Ub363fixrQUVug8eKJdWdnd/2DDmPNZCR/rcMiJn85wYFsSt4H6sz++v9c1 vCrWuD42KbDwpdVahV14Hj91gxiSMGoxgQGZhoIXI/yro4FZZhxDkWD2rcqtJ75+2zUQ lmCVCgkgKpde9xHJwk2PAx31lGAfMUemd5U3w/FD6z3+u0zv6/t6fOatYqm8q9YNnjSG m0j42oGZnNLdz3AcYpCXAsD4NHCov6U5/+W0HVPur+DjZt/VNhequK8HCidfLUk1Genq uohFHqi9ZeDQlMqE6KPzDRW3e+cpkACQRApLsL1Q+MksANXD5wVD8jcblffVQBr+k2fI WGNA== X-Gm-Message-State: AA+aEWaAPzfegm0ZhtBsgyaE3TtDGaK+UU2na+l9WFb79ddWJEH1r9vk albmfG0HDbnsVoFnbZbt3hVkog== X-Google-Smtp-Source: AFSGD/Xs1EGYO/g+89ctnehdvG4hBXCRYt7qj9svVDPGauGDnQLkj34luOr+ZqzGo5SvLeeuSJNZ4A== X-Received: by 2002:a1c:b4e:: with SMTP id 75mr2628907wml.143.1544022139214; Wed, 05 Dec 2018 07:02:19 -0800 (PST) Received: from ?IPv6:2a01:cb1d:4ce:ea00:819f:4d34:9af9:e67? ([2a01:cb1d:4ce:ea00:819f:4d34:9af9:e67]) by smtp.gmail.com with ESMTPSA id j8sm18291226wmd.0.2018.12.05.07.02.18 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Wed, 05 Dec 2018 07:02:18 -0800 (PST) Subject: Re: [PATCH v5 2/2] rtc: support for the Amlogic Meson RTC To: Ben Dooks , Martin Blumenstingl , linux-amlogic@lists.infradead.org, linux-rtc@vger.kernel.org, alexandre.belloni@bootlin.com, a.zummo@towertech.it References: <20181202220847.24364-1-martin.blumenstingl@googlemail.com> <20181202220847.24364-3-martin.blumenstingl@googlemail.com> <85aa8e12-0bca-6432-e1a8-0faceff1dd5e@codethink.co.uk> From: Neil Armstrong Openpgp: preference=signencrypt Autocrypt: addr=narmstrong@baylibre.com; prefer-encrypt=mutual; keydata= xsBNBE1ZBs8BCAD78xVLsXPwV/2qQx2FaO/7mhWL0Qodw8UcQJnkrWmgTFRobtTWxuRx8WWP GTjuhvbleoQ5Cxjr+v+1ARGCH46MxFP5DwauzPekwJUD5QKZlaw/bURTLmS2id5wWi3lqVH4 BVF2WzvGyyeV1o4RTCYDnZ9VLLylJ9bneEaIs/7cjCEbipGGFlfIML3sfqnIvMAxIMZrvcl9 qPV2k+KQ7q+aXavU5W+yLNn7QtXUB530Zlk/d2ETgzQ5FLYYnUDAaRl+8JUTjc0CNOTpCeik 80TZcE6f8M76Xa6yU8VcNko94Ck7iB4vj70q76P/J7kt98hklrr85/3NU3oti3nrIHmHABEB AAHNKE5laWwgQXJtc3Ryb25nIDxuYXJtc3Ryb25nQGJheWxpYnJlLmNvbT7CwHsEEwEKACUC GyMGCwkIBwMCBhUIAgkKCwQWAgMBAh4BAheABQJXDO2CAhkBAAoJEBaat7Gkz/iubGIH/iyk RqvgB62oKOFlgOTYCMkYpm2aAOZZLf6VKHKc7DoVwuUkjHfIRXdslbrxi4pk5VKU6ZP9AKsN NtMZntB8WrBTtkAZfZbTF7850uwd3eU5cN/7N1Q6g0JQihE7w4GlIkEpQ8vwSg5W7hkx3yQ6 2YzrUZh/b7QThXbNZ7xOeSEms014QXazx8+txR7jrGF3dYxBsCkotO/8DNtZ1R+aUvRfpKg5 ZgABTC0LmAQnuUUf2PHcKFAHZo5KrdO+tyfL+LgTUXIXkK+tenkLsAJ0cagz1EZ5gntuheLD YJuzS4zN+1Asmb9kVKxhjSQOcIh6g2tw7vaYJgL/OzJtZi6JlIXOwE0ETVkGzwEIALyKDN/O GURaHBVzwjgYq+ZtifvekdrSNl8TIDH8g1xicBYpQTbPn6bbSZbdvfeQPNCcD4/EhXZuhQXM coJsQQQnO4vwVULmPGgtGf8PVc7dxKOeta+qUh6+SRh3vIcAUFHDT3f/Zdspz+e2E0hPV2hi SvICLk11qO6cyJE13zeNFoeY3ggrKY+IzbFomIZY4yG6xI99NIPEVE9lNBXBKIlewIyVlkOa YvJWSV+p5gdJXOvScNN1epm5YHmf9aE2ZjnqZGoMMtsyw18YoX9BqMFInxqYQQ3j/HpVgTSv mo5ea5qQDDUaCsaTf8UeDcwYOtgI8iL4oHcsGtUXoUk33HEAEQEAAcLAXwQYAQIACQUCTVkG zwIbDAAKCRAWmrexpM/4rrXiB/sGbkQ6itMrAIfnM7IbRuiSZS1unlySUVYu3SD6YBYnNi3G 5EpbwfBNuT3H8//rVvtOFK4OD8cRYkxXRQmTvqa33eDIHu/zr1HMKErm+2SD6PO9umRef8V8 2o2oaCLvf4WeIssFjwB0b6a12opuRP7yo3E3gTCSKmbUuLv1CtxKQF+fUV1cVaTPMyT25Od+ RC1K+iOR0F54oUJvJeq7fUzbn/KdlhA8XPGzwGRy4zcsPWvwnXgfe5tk680fEKZVwOZKIEuJ C3v+/yZpQzDvGYJvbyix0lHnrCzq43WefRHI5XTTQbM0WUIBIcGmq38+OgUsMYu4NzLu7uZF Acmp6h8g Organization: Baylibre Message-ID: Date: Wed, 5 Dec 2018 16:02:17 +0100 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:60.0) Gecko/20100101 Thunderbird/60.2.1 MIME-Version: 1.0 In-Reply-To: <85aa8e12-0bca-6432-e1a8-0faceff1dd5e@codethink.co.uk> Content-Language: en-US X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20181205_070232_553642_534E7823 X-CRM114-Status: GOOD ( 26.97 ) X-BeenThere: linux-arm-kernel@lists.infradead.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: linux-kernel@vger.kernel.org, linux-arm-kernel@lists.infradead.org, ccaione@baylibre.com Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Sender: "linux-arm-kernel" Errors-To: linux-arm-kernel-bounces+infradead-linux-arm-kernel=archiver.kernel.org@lists.infradead.org SGkgQmVuLAoKT24gMDUvMTIvMjAxOCAxNDozNiwgQmVuIERvb2tzIHdyb3RlOgo+IE9uIDAyLzEy LzIwMTggMjI6MDgsIE1hcnRpbiBCbHVtZW5zdGluZ2wgd3JvdGU6Cj4+IEFkZCBzdXBwb3J0IGZv ciB0aGUgUlRDIGJsb2NrIG9uIHRoZSAzMi1iaXQgQW1sb2dpYyBNZXNvbjYsIE1lc29uOCwKPj4g TWVzb244YiBhbmQgTWVzb244bTIgU29Dcy4KPj4KPj4gVGhlIFJUQyBpcyBzcGxpdCBpbiB0byB0 d28gcGFydHMsIHdoaWNoIGFyZSBib3RoIG1hbmFnZWQgYnkgdGhpcyBkcml2ZXI6Cj4+IC0gdGhl IEFIQiBmcm9udCBlbmQKPj4gLSBhbmQgYSBzaW1wbGUgc2VyaWFsIGNvbm5lY3Rpb24gdG8gdGhl IGFjdHVhbCByZWdpc3RlcnMKPj4KPj4gVGhlIFJUQ19DT1VOVEVSIHJlZ2lzdGVyIHdoaWNoIGhv bGRzIHRoZSB0aW1lIGlzIDMyLWJpdHMgd2lkZS4KPj4KPj4gVGhlcmUgYXJlIGZvdXIgMzItYml0 IHdpZGUgKGluIHRvdGFsOiAxNiBieXRlcykgInJlZ21lbSIgcmVnaXN0ZXJzIHdoaWNoCj4+IGFy ZSBleHBvc2VkIHVzaW5nIG52bWVtLiBPbiBBbWxvZ2ljJ3MgMy4xMCBrZXJuZWwgdGhpcyBpcyB1 c2VkIHRvIHN0b3JlCj4+IGRhdGEgd2hpY2ggbmVlZHMgdG8gc3Vydml2ZSBhIHN1c3BlbmQgLyBy ZXN1bWUgY3ljbGUuCj4+Cj4+IFNpZ25lZC1vZmYtYnk6IEJlbiBEb29rcyA8YmVuLmRvb2tzQGNv ZGV0aGluay5jby51az4KPj4gW3Jlc3VycmVjdGVkIEJlbidzIHBhdGNoZXMgYWZ0ZXIgMiB5ZWFy c10KPj4gU2lnbmVkLW9mZi1ieTogTWFydGluIEJsdW1lbnN0aW5nbCA8bWFydGluLmJsdW1lbnN0 aW5nbEBnb29nbGVtYWlsLmNvbT4KPiAKPiBKdXN0IGNoZWNraW5nIGlmIHRoZSBjaGFuZ2Ugb2Yg YXV0aG9yIGlzIGRlbGliZXJhdGU/Cj4gbm90IHN1cmUgaG93IHRvIGRvID4xIGF1dGhvciBvbiBw YXRjaGVzIGxpa2UgdGhpcy4KCk1hcnRpbiBoYXMgYmVlbiB2ZXJ5IGV4cGxpY2l0IGFib3V0IHRo YXQgaW4gdGhlIGNvdmVyIGxldHRlciA6Cmh0dHBzOi8vcGF0Y2h3b3JrLmtlcm5lbC5vcmcvY292 ZXIvMTA3MDg0MjcvCgpOZWlsCgo+IAo+PiAtLS0KPj4gwqAgZHJpdmVycy9ydGMvS2NvbmZpZ8Kg wqDCoMKgIHzCoCAxMSArKwo+PiDCoCBkcml2ZXJzL3J0Yy9NYWtlZmlsZcKgwqDCoCB8wqDCoCAx ICsKPj4gwqAgZHJpdmVycy9ydGMvcnRjLW1lc29uLmMgfCA0MDkgKysrKysrKysrKysrKysrKysr KysrKysrKysrKysrKysrKysrKysrKwo+PiDCoCAzIGZpbGVzIGNoYW5nZWQsIDQyMSBpbnNlcnRp b25zKCspCj4+IMKgIGNyZWF0ZSBtb2RlIDEwMDY0NCBkcml2ZXJzL3J0Yy9ydGMtbWVzb24uYwo+ Pgo+PiBkaWZmIC0tZ2l0IGEvZHJpdmVycy9ydGMvS2NvbmZpZyBiL2RyaXZlcnMvcnRjL0tjb25m aWcKPj4gaW5kZXggYTgxOWVmMDdiN2VjLi5kNWQwZTNhZmZkYzYgMTAwNjQ0Cj4+IC0tLSBhL2Ry aXZlcnMvcnRjL0tjb25maWcKPj4gKysrIGIvZHJpdmVycy9ydGMvS2NvbmZpZwo+PiBAQCAtMTI4 NSw2ICsxMjg1LDE3IEBAIGNvbmZpZyBSVENfRFJWX0lNWERJCj4+IMKgwqDCoMKgwqDCoMKgwqAg VGhpcyBkcml2ZXIgY2FuIGFsc28gYmUgYnVpbHQgYXMgYSBtb2R1bGUsIGlmIHNvLCB0aGUgbW9k dWxlCj4+IMKgwqDCoMKgwqDCoMKgwqAgd2lsbCBiZSBjYWxsZWQgInJ0Yy1pbXhkaSIuCj4+IMKg ICtjb25maWcgUlRDX0RSVl9NRVNPTgo+PiArwqDCoMKgIHRyaXN0YXRlICJBbWxvZ2ljIE1lc29u IFJUQyIKPj4gK8KgwqDCoCBkZXBlbmRzIG9uIChBUk0gJiYgQVJDSF9NRVNPTikgfHwgQ09NUElM RV9URVNUCj4+ICvCoMKgwqAgc2VsZWN0IFJFR01BUF9NTUlPCj4+ICvCoMKgwqAgaGVscAo+PiAr wqDCoMKgwqDCoMKgIFN1cHBvcnQgZm9yIHRoZSBSVEMgYmxvY2sgb24gdGhlIEFtbG9naWMgTWVz b242LCBNZXNvbjgsIE1lc29uOGIKPj4gK8KgwqDCoMKgwqDCoCBhbmQgTWVzb244bTIgU29Dcy4K Pj4gKwo+PiArwqDCoMKgwqDCoMKgIFRoaXMgZHJpdmVyIGNhbiBhbHNvIGJlIGJ1aWx0IGFzIGEg bW9kdWxlLCBpZiBzbywgdGhlIG1vZHVsZQo+PiArwqDCoMKgwqDCoMKgIHdpbGwgYmUgY2FsbGVk ICJydGMtbWVzb24iLgo+PiArCj4+IMKgIGNvbmZpZyBSVENfRFJWX09NQVAKPj4gwqDCoMKgwqDC oCB0cmlzdGF0ZSAiVEkgT01BUCBSZWFsIFRpbWUgQ2xvY2siCj4+IMKgwqDCoMKgwqAgZGVwZW5k cyBvbiBBUkNIX09NQVAgfHwgQVJDSF9EQVZJTkNJIHx8IENPTVBJTEVfVEVTVAo+PiBkaWZmIC0t Z2l0IGEvZHJpdmVycy9ydGMvTWFrZWZpbGUgYi9kcml2ZXJzL3J0Yy9NYWtlZmlsZQo+PiBpbmRl eCAyOTBjMTczMGZiMGEuLjNiMDg4ZTc1MTQ5ZCAxMDA2NDQKPj4gLS0tIGEvZHJpdmVycy9ydGMv TWFrZWZpbGUKPj4gKysrIGIvZHJpdmVycy9ydGMvTWFrZWZpbGUKPj4gQEAgLTk5LDYgKzk5LDcg QEAgb2JqLSQoQ09ORklHX1JUQ19EUlZfTUFYODk5NynCoMKgwqAgKz0gcnRjLW1heDg5OTcubwo+ PiDCoCBvYmotJChDT05GSUdfUlRDX0RSVl9NQVg4OTk4KcKgwqDCoCArPSBydGMtbWF4ODk5OC5v Cj4+IMKgIG9iai0kKENPTkZJR19SVENfRFJWX01DMTNYWFgpwqDCoMKgICs9IHJ0Yy1tYzEzeHh4 Lm8KPj4gwqAgb2JqLSQoQ09ORklHX1JUQ19EUlZfTUNQNzk1KcKgwqDCoCArPSBydGMtbWNwNzk1 Lm8KPj4gK29iai0kKENPTkZJR19SVENfRFJWX01FU09OKcKgwqDCoCArPSBydGMtbWVzb24ubwo+ PiDCoCBvYmotJChDT05GSUdfUlRDX0RSVl9NT1hBUlQpwqDCoMKgICs9IHJ0Yy1tb3hhcnQubwo+ PiDCoCBvYmotJChDT05GSUdfUlRDX0RSVl9NUEM1MTIxKcKgwqDCoCArPSBydGMtbXBjNTEyMS5v Cj4+IMKgIG9iai0kKENPTkZJR19SVENfRFJWX01TTTYyNDIpwqDCoMKgICs9IHJ0Yy1tc202MjQy Lm8KPj4gZGlmZiAtLWdpdCBhL2RyaXZlcnMvcnRjL3J0Yy1tZXNvbi5jIGIvZHJpdmVycy9ydGMv cnRjLW1lc29uLmMKPj4gbmV3IGZpbGUgbW9kZSAxMDA2NDQKPj4gaW5kZXggMDAwMDAwMDAwMDAw Li4wOWQ2ODQ5YjgwNGEKPj4gLS0tIC9kZXYvbnVsbAo+PiArKysgYi9kcml2ZXJzL3J0Yy9ydGMt bWVzb24uYwo+PiBAQCAtMCwwICsxLDQwOSBAQAo+PiArLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZp ZXI6IEdQTC0yLjAKPj4gKy8qCj4+ICsgKiBSVEMgZHJpdmVyIGZvciB0aGUgaW50ZXJhbCBSVEMg YmxvY2sgaW4gdGhlIEFtbG9naWMgTWVzb242LCBNZXNvbjgsCj4+ICsgKiBNZXNvbjhiIGFuZCBN ZXNvbjhtMiBTb0NzLgo+PiArICoKPj4gKyAqIFRoZSBSVEMgaXMgc3BsaXQgaW4gdG8gdHdvIHBh cnRzLCB0aGUgQUhCIGZyb250IGVuZCBhbmQgYSBzaW1wbGUgc2VyaWFsCj4+ICsgKiBjb25uZWN0 aW9uIHRvIHRoZSBhY3R1YWwgcmVnaXN0ZXJzLiBUaGlzIGRyaXZlciBtYW5hZ2VzIGJvdGggcGFy dHMuCj4+ICsgKgo+PiArICogQ29weXJpZ2h0IChjKSAyMDE4IE1hcnRpbiBCbHVtZW5zdGluZ2wg PG1hcnRpbi5ibHVtZW5zdGluZ2xAZ29vZ2xlbWFpbC5jb20+Cj4+ICsgKiBDb3B5cmlnaHQgKGMp IDIwMTUgQmVuIERvb2tzIDxiZW4uZG9va3NAY29kZXRoaW5rLmNvLnVrPiBmb3IgQ29kZXRoaW5r IEx0ZAo+PiArICogQmFzZWQgb24gb3JpZ2luIGJ5IENhcmxvIENhaW9uZSA8Y2FybG9AZW5kbGVz c20uY29tPgo+PiArICovCj4+ICsKPj4gKyNpbmNsdWRlIDxsaW51eC9iaXRmaWVsZC5oPgo+PiAr I2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+Cj4+ICsjaW5jbHVkZSA8bGludXgvaW8uaD4KPj4gKyNp bmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KPj4gKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KPj4g KyNpbmNsdWRlIDxsaW51eC9udm1lbS1wcm92aWRlci5oPgo+PiArI2luY2x1ZGUgPGxpbnV4L29m Lmg+Cj4+ICsjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+Cj4+ICsjaW5jbHVkZSA8 bGludXgvcmVnbWFwLmg+Cj4+ICsjaW5jbHVkZSA8bGludXgvcmVndWxhdG9yL2NvbnN1bWVyLmg+ Cj4+ICsjaW5jbHVkZSA8bGludXgvcmVzZXQuaD4KPj4gKyNpbmNsdWRlIDxsaW51eC9ydGMuaD4K Pj4gKwo+PiArLyogcmVnaXN0ZXJzIGFjY2Vzc2VkIGZyb20gY3B1IGJ1cyAqLwo+PiArI2RlZmlu ZSBSVENfQUREUjDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgMHgwMAo+PiArwqDCoMKg ICNkZWZpbmUgUlRDX0FERFIwX0xJTkVfU0NMS8KgwqDCoMKgwqDCoMKgIEJJVCgwKQo+PiArwqDC oMKgICNkZWZpbmUgUlRDX0FERFIwX0xJTkVfU0VOwqDCoMKgwqDCoMKgwqAgQklUKDEpCj4+ICvC oMKgwqAgI2RlZmluZSBSVENfQUREUjBfTElORV9TREnCoMKgwqDCoMKgwqDCoCBCSVQoMikKPj4g K8KgwqDCoCAjZGVmaW5lIFJUQ19BRERSMF9TVEFSVF9TRVLCoMKgwqDCoMKgwqDCoCBCSVQoMTcp Cj4+ICvCoMKgwqAgI2RlZmluZSBSVENfQUREUjBfV0FJVF9TRVLCoMKgwqDCoMKgwqDCoCBCSVQo MjIpCj4+ICvCoMKgwqAgI2RlZmluZSBSVENfQUREUjBfREFUQcKgwqDCoMKgwqDCoMKgwqDCoMKg wqAgR0VOTUFTSygzMSwgMjQpCj4+ICsKPj4gKyNkZWZpbmUgUlRDX0FERFIxwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgIDB4MDQKPj4gK8KgwqDCoCAjZGVmaW5lIFJUQ19BRERSMV9TRE/C oMKgwqDCoMKgwqDCoMKgwqDCoMKgIEJJVCgwKQo+PiArwqDCoMKgICNkZWZpbmUgUlRDX0FERFIx X1NfUkVBRFnCoMKgwqDCoMKgwqDCoCBCSVQoMSkKPj4gKwo+PiArI2RlZmluZSBSVENfQUREUjLC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgMHgwOAo+PiArI2RlZmluZSBSVENfQUREUjPC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgMHgwYwo+PiArCj4+ICsjZGVmaW5lIFJUQ19S RUc0wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIDB4MTAKPj4gK8KgwqDCoCAjZGVmaW5l IFJUQ19SRUc0X1NUQVRJQ19WQUxVRcKgwqDCoMKgwqDCoMKgIEdFTk1BU0soNywgMCkKPj4gKwo+ PiArLyogcnRjIHJlZ2lzdGVycyBhY2Nlc3NlZCB2aWEgcnRjLXNlcmlhbCBpbnRlcmZhY2UgKi8K Pj4gKyNkZWZpbmUgUlRDX0NPVU5URVLCoMKgwqDCoMKgwqDCoCAoMCkKPj4gKyNkZWZpbmUgUlRD X1NFQ19BRErCoMKgwqDCoMKgwqDCoCAoMikKPj4gKyNkZWZpbmUgUlRDX1JFR01FTV8wwqDCoMKg wqDCoMKgwqAgKDQpCj4+ICsjZGVmaW5lIFJUQ19SRUdNRU1fMcKgwqDCoMKgwqDCoMKgICg1KQo+ PiArI2RlZmluZSBSVENfUkVHTUVNXzLCoMKgwqDCoMKgwqDCoCAoNikKPj4gKyNkZWZpbmUgUlRD X1JFR01FTV8zwqDCoMKgwqDCoMKgwqAgKDcpCj4+ICsKPj4gKyNkZWZpbmUgUlRDX0FERFJfQklU U8KgwqDCoMKgwqDCoMKgICgzKcKgwqDCoCAvKiBudW1iZXIgb2YgYWRkcmVzcyBiaXRzIHRvIHNl bmQgKi8KPj4gKyNkZWZpbmUgUlRDX0RBVEFfQklUU8KgwqDCoMKgwqDCoMKgICgzMinCoMKgwqAg LyogbnVtYmVyIG9mIGRhdGEgYml0cyB0byB0eC9yeCAqLwo+PiArCj4+ICsjZGVmaW5lIE1FU09O X1NUQVRJQ19CSUFTX0NVUsKgwqDCoCAoMHg1IDw8IDEpCj4+ICsjZGVmaW5lIE1FU09OX1NUQVRJ Q19WT0xUQUdFwqDCoMKgICgweDMgPDwgMTEpCj4+ICsjZGVmaW5lIE1FU09OX1NUQVRJQ19ERUZB VUxUwqDCoMKgIChNRVNPTl9TVEFUSUNfQklBU19DVVIgfCBNRVNPTl9TVEFUSUNfVk9MVEFHRSkK Pj4gKwo+PiArc3RydWN0IG1lc29uX3J0YyB7Cj4+ICvCoMKgwqAgc3RydWN0IHJ0Y19kZXZpY2XC oMKgwqAgKnJ0YzvCoMKgwqDCoMKgwqDCoCAvKiBydGMgZGV2aWNlIHdlIGNyZWF0ZWQgKi8KPj4g K8KgwqDCoCBzdHJ1Y3QgZGV2aWNlwqDCoMKgwqDCoMKgwqAgKmRldjvCoMKgwqDCoMKgwqDCoCAv KiBkZXZpY2Ugd2UgYm91bmQgZnJvbSAqLwo+PiArwqDCoMKgIHN0cnVjdCByZXNldF9jb250cm9s wqDCoMKgICpyZXNldDvCoMKgwqDCoMKgwqDCoCAvKiByZXNldCBzb3VyY2UgKi8KPj4gK8KgwqDC oCBzdHJ1Y3QgcmVndWxhdG9ywqDCoMKgICp2ZGQ7wqDCoMKgwqDCoMKgwqAgLyogdm9sdGFnZSBp bnB1dCAqLwo+PiArwqDCoMKgIHN0cnVjdCByZWdtYXDCoMKgwqDCoMKgwqDCoCAqcGVyaXBoZXJh bDvCoMKgwqAgLyogcGVyaXBoZXJhbCByZWdpc3RlcnMgKi8KPj4gK8KgwqDCoCBzdHJ1Y3QgcmVn bWFwwqDCoMKgwqDCoMKgwqAgKnNlcmlhbDvCoMKgwqAgLyogc2VyaWFsIHJlZ2lzdGVycyAqLwo+ PiArfTsKPj4gKwo+PiArc3RhdGljIGNvbnN0IHN0cnVjdCByZWdtYXBfY29uZmlnIG1lc29uX3J0 Y19wZXJpcGhlcmFsX3JlZ21hcF9jb25maWcgPSB7Cj4+ICvCoMKgwqAgLm5hbWXCoMKgwqDCoMKg wqDCoCA9ICJwZXJpcGhlcmFsLXJlZ2lzdGVycyIsCj4+ICvCoMKgwqAgLnJlZ19iaXRzwqDCoMKg ID0gOCwKPj4gK8KgwqDCoCAudmFsX2JpdHPCoMKgwqAgPSAzMiwKPj4gK8KgwqDCoCAucmVnX3N0 cmlkZcKgwqDCoCA9IDQsCj4+ICvCoMKgwqAgLm1heF9yZWdpc3RlcsKgwqDCoCA9IFJUQ19SRUc0 LAo+PiArwqDCoMKgIC5mYXN0X2lvwqDCoMKgID0gdHJ1ZSwKPj4gK307Cj4+ICsKPj4gKy8qIFJU QyBmcm9udC1lbmQgc2VyaWFsaXNlciBjb250cm9scyAqLwo+PiArCj4+ICtzdGF0aWMgdm9pZCBt ZXNvbl9ydGNfc2Nsa19wdWxzZShzdHJ1Y3QgbWVzb25fcnRjICpydGMpCj4+ICt7Cj4+ICvCoMKg wqAgdWRlbGF5KDUpOwo+PiArwqDCoMKgIHJlZ21hcF91cGRhdGVfYml0cyhydGMtPnBlcmlwaGVy YWwsIFJUQ19BRERSMCwgUlRDX0FERFIwX0xJTkVfU0NMSywgMCk7Cj4+ICvCoMKgwqAgdWRlbGF5 KDUpOwo+PiArwqDCoMKgIHJlZ21hcF91cGRhdGVfYml0cyhydGMtPnBlcmlwaGVyYWwsIFJUQ19B RERSMCwgUlRDX0FERFIwX0xJTkVfU0NMSywKPj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqAgUlRDX0FERFIwX0xJTkVfU0NMSyk7Cj4+ICt9Cj4+ICsKPj4gK3N0YXRpYyB2b2lkIG1lc29u X3J0Y19zZW5kX2JpdChzdHJ1Y3QgbWVzb25fcnRjICpydGMsIHVuc2lnbmVkIGludCBiaXQpCj4+ ICt7Cj4+ICvCoMKgwqAgcmVnbWFwX3VwZGF0ZV9iaXRzKHJ0Yy0+cGVyaXBoZXJhbCwgUlRDX0FE RFIwLCBSVENfQUREUjBfTElORV9TREksCj4+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg IGJpdCA/IFJUQ19BRERSMF9MSU5FX1NESSA6IDApOwo+PiArwqDCoMKgIG1lc29uX3J0Y19zY2xr X3B1bHNlKHJ0Yyk7Cj4+ICt9Cj4+ICsKPj4gK3N0YXRpYyB2b2lkIG1lc29uX3J0Y19zZW5kX2Jp dHMoc3RydWN0IG1lc29uX3J0YyAqcnRjLCB1MzIgZGF0YSwKPj4gK8KgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoCB1bnNpZ25lZCBpbnQgbnIpCj4+ICt7Cj4+ICvCoMKgwqAgdTMyIGJpdCA9 IDEgPDwgKG5yIC0gMSk7Cj4+ICsKPj4gK8KgwqDCoCB3aGlsZSAoYml0KSB7Cj4+ICvCoMKgwqDC oMKgwqDCoCBtZXNvbl9ydGNfc2VuZF9iaXQocnRjLCBkYXRhICYgYml0KTsKPj4gK8KgwqDCoMKg wqDCoMKgIGJpdCA+Pj0gMTsKPj4gK8KgwqDCoCB9Cj4+ICt9Cj4+ICsKPj4gK3N0YXRpYyB2b2lk IG1lc29uX3J0Y19zZXRfZGlyKHN0cnVjdCBtZXNvbl9ydGMgKnJ0YywgdTMyIG1vZGUpCj4+ICt7 Cj4+ICvCoMKgwqAgcmVnbWFwX3VwZGF0ZV9iaXRzKHJ0Yy0+cGVyaXBoZXJhbCwgUlRDX0FERFIw LCBSVENfQUREUjBfTElORV9TRU4sIDApOwo+PiArwqDCoMKgIHJlZ21hcF91cGRhdGVfYml0cyhy dGMtPnBlcmlwaGVyYWwsIFJUQ19BRERSMCwgUlRDX0FERFIwX0xJTkVfU0RJLCAwKTsKPj4gK8Kg wqDCoCBtZXNvbl9ydGNfc2VuZF9iaXQocnRjLCBtb2RlKTsKPj4gK8KgwqDCoCByZWdtYXBfdXBk YXRlX2JpdHMocnRjLT5wZXJpcGhlcmFsLCBSVENfQUREUjAsIFJUQ19BRERSMF9MSU5FX1NESSwg MCk7Cj4+ICt9Cj4+ICsKPj4gK3N0YXRpYyB1MzIgbWVzb25fcnRjX2dldF9kYXRhKHN0cnVjdCBt ZXNvbl9ydGMgKnJ0YykKPj4gK3sKPj4gK8KgwqDCoCB1MzIgdG1wLCB2YWwgPSAwOwo+PiArwqDC oMKgIGludCBiaXQ7Cj4+ICsKPj4gK8KgwqDCoCBmb3IgKGJpdCA9IDA7IGJpdCA8IFJUQ19EQVRB X0JJVFM7IGJpdCsrKSB7Cj4+ICvCoMKgwqDCoMKgwqDCoCBtZXNvbl9ydGNfc2Nsa19wdWxzZShy dGMpOwo+PiArwqDCoMKgwqDCoMKgwqAgdmFsIDw8PSAxOwo+PiArCj4+ICvCoMKgwqDCoMKgwqDC oCByZWdtYXBfcmVhZChydGMtPnBlcmlwaGVyYWwsIFJUQ19BRERSMSwgJnRtcCk7Cj4+ICvCoMKg wqDCoMKgwqDCoCB2YWwgfD0gdG1wICYgUlRDX0FERFIxX1NETzsKPj4gK8KgwqDCoCB9Cj4+ICsK Pj4gK8KgwqDCoCByZXR1cm4gdmFsOwo+PiArfQo+PiArCj4+ICtzdGF0aWMgaW50IG1lc29uX3J0 Y19nZXRfYnVzKHN0cnVjdCBtZXNvbl9ydGMgKnJ0YykKPj4gK3sKPj4gK8KgwqDCoCBpbnQgcmV0 LCByZXRyaWVzID0gMzsKPj4gK8KgwqDCoCB1MzIgdmFsOwo+PiArCj4+ICvCoMKgwqAgLyogcHJl cGFyZSBidXMgZm9yIHRyYW5zZmVycywgc2V0IGFsbCBsaW5lcyBsb3cgKi8KPj4gK8KgwqDCoCB2 YWwgPSBSVENfQUREUjBfTElORV9TREkgfCBSVENfQUREUjBfTElORV9TRU4gfCBSVENfQUREUjBf TElORV9TQ0xLOwo+PiArwqDCoMKgIHJlZ21hcF91cGRhdGVfYml0cyhydGMtPnBlcmlwaGVyYWws IFJUQ19BRERSMCwgdmFsLCAwKTsKPj4gKwo+PiArwqDCoMKgIGZvciAocmV0cmllcyA9IDA7IHJl dHJpZXMgPCAzOyByZXRyaWVzKyspIHsKPj4gK8KgwqDCoMKgwqDCoMKgIC8qIHdhaXQgZm9yIHRo ZSBidXMgdG8gYmUgcmVhZHkgKi8KPj4gK8KgwqDCoMKgwqDCoMKgIGlmICghcmVnbWFwX3JlYWRf cG9sbF90aW1lb3V0KHJ0Yy0+cGVyaXBoZXJhbCwgUlRDX0FERFIxLCB2YWwsCj4+ICvCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCB2YWwgJiBSVENfQURE UjFfU19SRUFEWSwgMTAsCj4+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoCAxMDAwMCkpCj4+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIHJldHVybiAw Owo+PiArCj4+ICvCoMKgwqDCoMKgwqDCoCBkZXZfd2FybihydGMtPmRldiwgImZhaWxlZCB0byBn ZXQgYnVzLCByZXNldHRpbmcgUlRDXG4iKTsKPj4gKwo+PiArwqDCoMKgwqDCoMKgwqAgcmV0ID0g cmVzZXRfY29udHJvbF9yZXNldChydGMtPnJlc2V0KTsKPj4gK8KgwqDCoMKgwqDCoMKgIGlmIChy ZXQpCj4+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIHJldHVybiByZXQ7Cj4+ICvCoMKgwqAgfQo+ PiArCj4+ICvCoMKgwqAgZGV2X2VycihydGMtPmRldiwgImJ1cyBpcyBub3QgcmVhZHlcbiIpOwo+ PiArwqDCoMKgIHJldHVybiAtRVRJTUVET1VUOwo+PiArfQo+PiArCj4+ICtzdGF0aWMgaW50IG1l c29uX3J0Y19zZXJpYWxfYnVzX3JlZ19yZWFkKHZvaWQgKmNvbnRleHQsIHVuc2lnbmVkIGludCBy ZWcsCj4+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIHVuc2lnbmVk IGludCAqZGF0YSkKPj4gK3sKPj4gK8KgwqDCoCBzdHJ1Y3QgbWVzb25fcnRjICpydGMgPSBjb250 ZXh0Owo+PiArwqDCoMKgIGludCByZXQ7Cj4+ICsKPj4gK8KgwqDCoCByZXQgPSBtZXNvbl9ydGNf Z2V0X2J1cyhydGMpOwo+PiArwqDCoMKgIGlmIChyZXQpCj4+ICvCoMKgwqDCoMKgwqDCoCByZXR1 cm4gcmV0Owo+PiArCj4+ICvCoMKgwqAgcmVnbWFwX3VwZGF0ZV9iaXRzKHJ0Yy0+cGVyaXBoZXJh bCwgUlRDX0FERFIwLCBSVENfQUREUjBfTElORV9TRU4sCj4+ICvCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgIFJUQ19BRERSMF9MSU5FX1NFTik7Cj4+ICvCoMKgwqAgbWVzb25fcnRjX3NlbmRf Yml0cyhydGMsIHJlZywgUlRDX0FERFJfQklUUyk7Cj4+ICvCoMKgwqAgbWVzb25fcnRjX3NldF9k aXIocnRjLCAwKTsKPj4gK8KgwqDCoCAqZGF0YSA9IG1lc29uX3J0Y19nZXRfZGF0YShydGMpOwo+ PiArCj4+ICvCoMKgwqAgcmV0dXJuIDA7Cj4+ICt9Cj4+ICsKPj4gK3N0YXRpYyBpbnQgbWVzb25f cnRjX3NlcmlhbF9idXNfcmVnX3dyaXRlKHZvaWQgKmNvbnRleHQsIHVuc2lnbmVkIGludCByZWcs Cj4+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgdW5zaWduZWQg aW50IGRhdGEpCj4+ICt7Cj4+ICvCoMKgwqAgc3RydWN0IG1lc29uX3J0YyAqcnRjID0gY29udGV4 dDsKPj4gK8KgwqDCoCBpbnQgcmV0Owo+PiArCj4+ICvCoMKgwqAgcmV0ID0gbWVzb25fcnRjX2dl dF9idXMocnRjKTsKPj4gK8KgwqDCoCBpZiAocmV0KQo+PiArwqDCoMKgwqDCoMKgwqAgcmV0dXJu IHJldDsKPj4gKwo+PiArwqDCoMKgIHJlZ21hcF91cGRhdGVfYml0cyhydGMtPnBlcmlwaGVyYWws IFJUQ19BRERSMCwgUlRDX0FERFIwX0xJTkVfU0VOLAo+PiArwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoCBSVENfQUREUjBfTElORV9TRU4pOwo+PiArwqDCoMKgIG1lc29uX3J0Y19zZW5kX2Jp dHMocnRjLCBkYXRhLCBSVENfREFUQV9CSVRTKTsKPj4gK8KgwqDCoCBtZXNvbl9ydGNfc2VuZF9i aXRzKHJ0YywgcmVnLCBSVENfQUREUl9CSVRTKTsKPj4gK8KgwqDCoCBtZXNvbl9ydGNfc2V0X2Rp cihydGMsIDEpOwo+PiArCj4+ICvCoMKgwqAgcmV0dXJuIDA7Cj4+ICt9Cj4+ICsKPj4gK3N0YXRp YyBjb25zdCBzdHJ1Y3QgcmVnbWFwX2J1cyBtZXNvbl9ydGNfc2VyaWFsX2J1cyA9IHsKPj4gK8Kg wqDCoCAucmVnX3JlYWTCoMKgwqAgPSBtZXNvbl9ydGNfc2VyaWFsX2J1c19yZWdfcmVhZCwKPj4g K8KgwqDCoCAucmVnX3dyaXRlwqDCoMKgID0gbWVzb25fcnRjX3NlcmlhbF9idXNfcmVnX3dyaXRl LAo+PiArfTsKPj4gKwo+PiArc3RhdGljIGNvbnN0IHN0cnVjdCByZWdtYXBfY29uZmlnIG1lc29u X3J0Y19zZXJpYWxfcmVnbWFwX2NvbmZpZyA9IHsKPj4gK8KgwqDCoCAubmFtZcKgwqDCoMKgwqDC oMKgID0gInNlcmlhbC1yZWdpc3RlcnMiLAo+PiArwqDCoMKgIC5yZWdfYml0c8KgwqDCoCA9IDQs Cj4+ICvCoMKgwqAgLnJlZ19zdHJpZGXCoMKgwqAgPSAxLAo+PiArwqDCoMKgIC52YWxfYml0c8Kg wqDCoCA9IDMyLAo+PiArwqDCoMKgIC5tYXhfcmVnaXN0ZXLCoMKgwqAgPSBSVENfUkVHTUVNXzMs Cj4+ICvCoMKgwqAgLmZhc3RfaW/CoMKgwqAgPSBmYWxzZSwKPj4gK307Cj4+ICsKPj4gK3N0YXRp YyBpbnQgbWVzb25fcnRjX3dyaXRlX3N0YXRpYyhzdHJ1Y3QgbWVzb25fcnRjICpydGMsIHUzMiBk YXRhKQo+PiArewo+PiArwqDCoMKgIHUzMiB0bXA7Cj4+ICsKPj4gK8KgwqDCoCByZWdtYXBfd3Jp dGUocnRjLT5wZXJpcGhlcmFsLCBSVENfUkVHNCwKPj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oCBGSUVMRF9QUkVQKFJUQ19SRUc0X1NUQVRJQ19WQUxVRSwgKGRhdGEgPj4gOCkpKTsKPj4gKwo+ PiArwqDCoMKgIC8qIHdyaXRlIHRoZSBzdGF0aWMgdmFsdWUgYW5kIHN0YXJ0IHRoZSBhdXRvIHNl cmlhbGl6ZXIgKi8KPj4gK8KgwqDCoCB0bXAgPSBGSUVMRF9QUkVQKFJUQ19BRERSMF9EQVRBLCAo ZGF0YSAmIDB4ZmYpKSB8IFJUQ19BRERSMF9TVEFSVF9TRVI7Cj4+ICvCoMKgwqAgcmVnbWFwX3Vw ZGF0ZV9iaXRzKHJ0Yy0+cGVyaXBoZXJhbCwgUlRDX0FERFIwLAo+PiArwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoCBSVENfQUREUjBfREFUQSB8IFJUQ19BRERSMF9TVEFSVF9TRVIsIHRtcCk7 Cj4+ICsKPj4gK8KgwqDCoCAvKiB3YWl0IGZvciB0aGUgYXV0byBzZXJpYWxpemVyIHRvIGNvbXBs ZXRlICovCj4+ICvCoMKgwqAgcmV0dXJuIHJlZ21hcF9yZWFkX3BvbGxfdGltZW91dChydGMtPnBl cmlwaGVyYWwsIFJUQ19SRUc0LCB0bXAsCj4+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoCAhKHRtcCAmIFJUQ19BRERSMF9XQUlUX1NFUiksIDEwLAo+PiArwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgMTAwMDApOwo+PiArfQo+PiArCj4+ICsvKiBS VEMgaW50ZXJmYWNlIGxheWVyIGZ1bmN0aW9ucyAqLwo+PiArCj4+ICtzdGF0aWMgaW50IG1lc29u X3J0Y19nZXR0aW1lKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IHJ0Y190aW1lICp0bSkKPj4g K3sKPj4gK8KgwqDCoCBzdHJ1Y3QgbWVzb25fcnRjICpydGMgPSBkZXZfZ2V0X2RydmRhdGEoZGV2 KTsKPj4gK8KgwqDCoCB1MzIgdGltZTsKPj4gK8KgwqDCoCBpbnQgcmV0Owo+PiArCj4+ICvCoMKg wqAgcmV0ID0gcmVnbWFwX3JlYWQocnRjLT5zZXJpYWwsIFJUQ19DT1VOVEVSLCAmdGltZSk7Cj4+ ICvCoMKgwqAgaWYgKCFyZXQpCj4+ICvCoMKgwqDCoMKgwqDCoCBydGNfdGltZTY0X3RvX3RtKHRp bWUsIHRtKTsKPj4gKwo+PiArwqDCoMKgIHJldHVybiByZXQ7Cj4+ICt9Cj4+ICsKPj4gK3N0YXRp YyBpbnQgbWVzb25fcnRjX3NldHRpbWUoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgcnRjX3Rp bWUgKnRtKQo+PiArewo+PiArwqDCoMKgIHN0cnVjdCBtZXNvbl9ydGMgKnJ0YyA9IGRldl9nZXRf ZHJ2ZGF0YShkZXYpOwo+PiArCj4+ICvCoMKgwqAgcmV0dXJuIHJlZ21hcF93cml0ZShydGMtPnNl cmlhbCwgUlRDX0NPVU5URVIsIHJ0Y190bV90b190aW1lNjQodG0pKTsKPj4gK30KPj4gKwo+PiAr c3RhdGljIGNvbnN0IHN0cnVjdCBydGNfY2xhc3Nfb3BzIG1lc29uX3J0Y19vcHMgPSB7Cj4+ICvC oMKgwqAgLnJlYWRfdGltZcKgwqDCoCA9IG1lc29uX3J0Y19nZXR0aW1lLAo+PiArwqDCoMKgIC5z ZXRfdGltZcKgwqDCoCA9IG1lc29uX3J0Y19zZXR0aW1lLAo+PiArfTsKPj4gKwo+PiArLyogTlZN RU0gaW50ZXJmYWNlIGxheWVyIGZ1bmN0aW9ucyAqLwo+PiArCj4+ICtzdGF0aWMgaW50IG1lc29u X3J0Y19yZWdtZW1fcmVhZCh2b2lkICpjb250ZXh0LCB1bnNpZ25lZCBpbnQgb2Zmc2V0LAo+PiAr wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgdm9pZCAqYnVmLCBzaXplX3QgYnl0ZXMp Cj4+ICt7Cj4+ICvCoMKgwqAgc3RydWN0IG1lc29uX3J0YyAqcnRjID0gY29udGV4dDsKPj4gK8Kg wqDCoCB1bnNpZ25lZCBpbnQgcmVhZF9vZmZzZXQsIHJlYWRfc2l6ZTsKPj4gKwo+PiArwqDCoMKg IHJlYWRfb2Zmc2V0ID0gUlRDX1JFR01FTV8wICsgKG9mZnNldCAvIDQpOwo+PiArwqDCoMKgIHJl YWRfc2l6ZSA9IGJ5dGVzIC8gNDsKPj4gKwo+PiArwqDCoMKgIHJldHVybiByZWdtYXBfYnVsa19y ZWFkKHJ0Yy0+c2VyaWFsLCByZWFkX29mZnNldCwgYnVmLCByZWFkX3NpemUpOwo+PiArfQo+PiAr Cj4+ICtzdGF0aWMgaW50IG1lc29uX3J0Y19yZWdtZW1fd3JpdGUodm9pZCAqY29udGV4dCwgdW5z aWduZWQgaW50IG9mZnNldCwKPj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAg dm9pZCAqYnVmLCBzaXplX3QgYnl0ZXMpCj4+ICt7Cj4+ICvCoMKgwqAgc3RydWN0IG1lc29uX3J0 YyAqcnRjID0gY29udGV4dDsKPj4gK8KgwqDCoCB1bnNpZ25lZCBpbnQgd3JpdGVfb2Zmc2V0LCB3 cml0ZV9zaXplOwo+PiArCj4+ICvCoMKgwqAgd3JpdGVfb2Zmc2V0ID0gUlRDX1JFR01FTV8wICsg KG9mZnNldCAvIDQpOwo+PiArwqDCoMKgIHdyaXRlX3NpemUgPSBieXRlcyAvIDQ7Cj4+ICsKPj4g K8KgwqDCoCByZXR1cm4gcmVnbWFwX2J1bGtfd3JpdGUocnRjLT5zZXJpYWwsIHdyaXRlX29mZnNl dCwgYnVmLCB3cml0ZV9zaXplKTsKPj4gK30KPj4gKwo+PiArc3RhdGljIGludCBtZXNvbl9ydGNf cHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKPj4gK3sKPj4gK8KgwqDCoCBzdHJ1 Y3QgbnZtZW1fY29uZmlnIG1lc29uX3J0Y19udm1lbV9jb25maWcgPSB7Cj4+ICvCoMKgwqDCoMKg wqDCoCAubmFtZSA9ICJtZXNvbi1ydGMtcmVnbWVtIiwKPj4gK8KgwqDCoMKgwqDCoMKgIC53b3Jk X3NpemUgPSA0LAo+PiArwqDCoMKgwqDCoMKgwqAgLnN0cmlkZSA9IDQsCj4+ICvCoMKgwqDCoMKg wqDCoCAuc2l6ZSA9IFNaXzE2LAo+PiArwqDCoMKgwqDCoMKgwqAgLnJlZ19yZWFkID0gbWVzb25f cnRjX3JlZ21lbV9yZWFkLAo+PiArwqDCoMKgwqDCoMKgwqAgLnJlZ193cml0ZSA9IG1lc29uX3J0 Y19yZWdtZW1fd3JpdGUsCj4+ICvCoMKgwqAgfTsKPj4gK8KgwqDCoCBzdHJ1Y3QgZGV2aWNlICpk ZXYgPSAmcGRldi0+ZGV2Owo+PiArwqDCoMKgIHN0cnVjdCBtZXNvbl9ydGMgKnJ0YzsKPj4gK8Kg wqDCoCBzdHJ1Y3QgcmVzb3VyY2UgKnJlczsKPj4gK8KgwqDCoCB2b2lkIF9faW9tZW0gKmJhc2U7 Cj4+ICvCoMKgwqAgaW50IHJldDsKPj4gK8KgwqDCoCB1MzIgdG07Cj4+ICsKPj4gK8KgwqDCoCBy dGMgPSBkZXZtX2t6YWxsb2MoZGV2LCBzaXplb2Yoc3RydWN0IG1lc29uX3J0YyksIEdGUF9LRVJO RUwpOwo+PiArwqDCoMKgIGlmICghcnRjKQo+PiArwqDCoMKgwqDCoMKgwqAgcmV0dXJuIC1FTk9N RU07Cj4+ICsKPj4gK8KgwqDCoCBydGMtPnJ0YyA9IGRldm1fcnRjX2FsbG9jYXRlX2RldmljZShk ZXYpOwo+PiArwqDCoMKgIGlmIChJU19FUlIocnRjLT5ydGMpKQo+PiArwqDCoMKgwqDCoMKgwqAg cmV0dXJuIFBUUl9FUlIocnRjLT5ydGMpOwo+PiArCj4+ICvCoMKgwqAgcGxhdGZvcm1fc2V0X2Ry dmRhdGEocGRldiwgcnRjKTsKPj4gKwo+PiArwqDCoMKgIHJ0Yy0+ZGV2ID0gZGV2Owo+PiArCj4+ ICvCoMKgwqAgcnRjLT5ydGMtPm9wcyA9ICZtZXNvbl9ydGNfb3BzOwo+PiArwqDCoMKgIHJ0Yy0+ cnRjLT5yYW5nZV9tYXggPSBVMzJfTUFYOwo+PiArCj4+ICvCoMKgwqAgcmVzID0gcGxhdGZvcm1f Z2V0X3Jlc291cmNlKHBkZXYsIElPUkVTT1VSQ0VfTUVNLCAwKTsKPj4gK8KgwqDCoCBiYXNlID0g ZGV2bV9pb3JlbWFwX3Jlc291cmNlKGRldiwgcmVzKTsKPj4gK8KgwqDCoCBpZiAoSVNfRVJSKGJh c2UpKQo+PiArwqDCoMKgwqDCoMKgwqAgcmV0dXJuIFBUUl9FUlIoYmFzZSk7Cj4+ICsKPj4gK8Kg wqDCoCBydGMtPnBlcmlwaGVyYWwgPSBkZXZtX3JlZ21hcF9pbml0X21taW8oZGV2LCBiYXNlLAo+ PiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgJm1lc29uX3J0Y19wZXJp cGhlcmFsX3JlZ21hcF9jb25maWcpOwo+PiArwqDCoMKgIGlmIChJU19FUlIocnRjLT5wZXJpcGhl cmFsKSkgewo+PiArwqDCoMKgwqDCoMKgwqAgZGV2X2VycihkZXYsICJmYWlsZWQgdG8gY3JlYXRl IHBlcmlwaGVyYWwgcmVnbWFwXG4iKTsKPj4gK8KgwqDCoMKgwqDCoMKgIHJldHVybiBQVFJfRVJS KHJ0Yy0+cGVyaXBoZXJhbCk7Cj4+ICvCoMKgwqAgfQo+PiArCj4+ICvCoMKgwqAgcnRjLT5yZXNl dCA9IGRldm1fcmVzZXRfY29udHJvbF9nZXQoZGV2LCBOVUxMKTsKPj4gK8KgwqDCoCBpZiAoSVNf RVJSKHJ0Yy0+cmVzZXQpKSB7Cj4+ICvCoMKgwqDCoMKgwqDCoCBkZXZfZXJyKGRldiwgIm1pc3Np bmcgcmVzZXQgbGluZVxuIik7Cj4+ICvCoMKgwqDCoMKgwqDCoCByZXR1cm4gUFRSX0VSUihydGMt PnJlc2V0KTsKPj4gK8KgwqDCoCB9Cj4+ICsKPj4gK8KgwqDCoCBydGMtPnZkZCA9IGRldm1fcmVn dWxhdG9yX2dldChkZXYsICJ2ZGQiKTsKPj4gK8KgwqDCoCBpZiAoSVNfRVJSKHJ0Yy0+dmRkKSkg ewo+PiArwqDCoMKgwqDCoMKgwqAgZGV2X2VycihkZXYsICJmYWlsZWQgdG8gZ2V0IHRoZSB2ZGQt c3VwcGx5XG4iKTsKPj4gK8KgwqDCoMKgwqDCoMKgIHJldHVybiBQVFJfRVJSKHJ0Yy0+dmRkKTsK Pj4gK8KgwqDCoCB9Cj4+ICsKPj4gK8KgwqDCoCByZXQgPSByZWd1bGF0b3JfZW5hYmxlKHJ0Yy0+ dmRkKTsKPj4gK8KgwqDCoCBpZiAocmV0KSB7Cj4+ICvCoMKgwqDCoMKgwqDCoCBkZXZfZXJyKGRl diwgImZhaWxlZCB0byBlbmFibGUgdmRkLXN1cHBseVxuIik7Cj4+ICvCoMKgwqDCoMKgwqDCoCBy ZXR1cm4gcmV0Owo+PiArwqDCoMKgIH0KPj4gKwo+PiArwqDCoMKgIHJldCA9IG1lc29uX3J0Y193 cml0ZV9zdGF0aWMocnRjLCBNRVNPTl9TVEFUSUNfREVGQVVMVCk7Cj4+ICvCoMKgwqAgaWYgKHJl dCkgewo+PiArwqDCoMKgwqDCoMKgwqAgZGV2X2VycihkZXYsICJmYWlsZWQgdG8gc2V0IHN0YXRp YyB2YWx1ZXNcbiIpOwo+PiArwqDCoMKgwqDCoMKgwqAgZ290byBvdXRfZGlzYWJsZV92ZGQ7Cj4+ ICvCoMKgwqAgfQo+PiArCj4+ICvCoMKgwqAgcnRjLT5zZXJpYWwgPSBkZXZtX3JlZ21hcF9pbml0 KGRldiwgJm1lc29uX3J0Y19zZXJpYWxfYnVzLCBydGMsCj4+ICvCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCAmbWVzb25fcnRjX3NlcmlhbF9yZWdtYXBfY29uZmln KTsKPj4gK8KgwqDCoCBpZiAoSVNfRVJSKHJ0Yy0+c2VyaWFsKSkgewo+PiArwqDCoMKgwqDCoMKg wqAgZGV2X2VycihkZXYsICJmYWlsZWQgdG8gY3JlYXRlIHNlcmlhbCByZWdtYXBcbiIpOwo+PiAr wqDCoMKgwqDCoMKgwqAgcmV0ID0gUFRSX0VSUihydGMtPnNlcmlhbCk7Cj4+ICvCoMKgwqDCoMKg wqDCoCBnb3RvIG91dF9kaXNhYmxlX3ZkZDsKPj4gK8KgwqDCoCB9Cj4+ICsKPj4gK8KgwqDCoCAv Kgo+PiArwqDCoMKgwqAgKiBjaGVjayBpZiB3ZSBjYW4gcmVhZCBSVEMgY291bnRlciwgaWYgbm90 IHRoZW4gdGhlIFJUQyBpcyBwcm9iYWJseQo+PiArwqDCoMKgwqAgKiBub3QgZnVuY3Rpb25hbC4g SWYgaXQgaXNuJ3QgcHJvYmFibHkgYmVzdCB0byBub3QgYmluZC4KPj4gK8KgwqDCoMKgICovCj4+ ICvCoMKgwqAgcmV0ID0gcmVnbWFwX3JlYWQocnRjLT5zZXJpYWwsIFJUQ19DT1VOVEVSLCAmdG0p Owo+PiArwqDCoMKgIGlmIChyZXQpIHsKPj4gK8KgwqDCoMKgwqDCoMKgIGRldl9lcnIoZGV2LCAi Y2Fubm90IHJlYWQgUlRDIGNvdW50ZXIsIFJUQyBub3QgZnVuY3Rpb25hbFxuIik7Cj4+ICvCoMKg wqDCoMKgwqDCoCBnb3RvIG91dF9kaXNhYmxlX3ZkZDsKPj4gK8KgwqDCoCB9Cj4+ICsKPj4gK8Kg wqDCoCBtZXNvbl9ydGNfbnZtZW1fY29uZmlnLnByaXYgPSBydGM7Cj4+ICvCoMKgwqAgcmV0ID0g cnRjX252bWVtX3JlZ2lzdGVyKHJ0Yy0+cnRjLCAmbWVzb25fcnRjX252bWVtX2NvbmZpZyk7Cj4+ ICvCoMKgwqAgaWYgKHJldCkKPj4gK8KgwqDCoMKgwqDCoMKgIGdvdG8gb3V0X2Rpc2FibGVfdmRk Owo+PiArCj4+ICvCoMKgwqAgcmV0ID0gcnRjX3JlZ2lzdGVyX2RldmljZShydGMtPnJ0Yyk7Cj4+ ICvCoMKgwqAgaWYgKHJldCkKPj4gK8KgwqDCoMKgwqDCoMKgIGdvdG8gb3V0X3VucmVnaXN0ZXJf bnZtZW07Cj4+ICsKPj4gK8KgwqDCoCByZXR1cm4gMDsKPj4gKwo+PiArb3V0X3VucmVnaXN0ZXJf bnZtZW06Cj4+ICvCoMKgwqAgcnRjX252bWVtX3VucmVnaXN0ZXIocnRjLT5ydGMpOwo+PiArCj4+ ICtvdXRfZGlzYWJsZV92ZGQ6Cj4+ICvCoMKgwqAgcmVndWxhdG9yX2Rpc2FibGUocnRjLT52ZGQp Owo+PiArwqDCoMKgIHJldHVybiByZXQ7Cj4+ICt9Cj4+ICsKPj4gK3N0YXRpYyBjb25zdCBzdHJ1 Y3Qgb2ZfZGV2aWNlX2lkIG1lc29uX3J0Y19kdF9tYXRjaFtdID0gewo+PiArwqDCoMKgIHsgLmNv bXBhdGlibGUgPSAiYW1sb2dpYyxtZXNvbjYtcnRjIiwgfSwKPj4gK8KgwqDCoCB7IC5jb21wYXRp YmxlID0gImFtbG9naWMsbWVzb244LXJ0YyIsIH0sCj4+ICvCoMKgwqAgeyAuY29tcGF0aWJsZSA9 ICJhbWxvZ2ljLG1lc29uOGItcnRjIiwgfSwKPj4gK8KgwqDCoCB7IC5jb21wYXRpYmxlID0gImFt bG9naWMsbWVzb244bTItcnRjIiwgfSwKPj4gK8KgwqDCoCB7IH0sCj4+ICt9Owo+PiArTU9EVUxF X0RFVklDRV9UQUJMRShvZiwgbWVzb25fcnRjX2R0X21hdGNoKTsKPj4gKwo+PiArc3RhdGljIHN0 cnVjdCBwbGF0Zm9ybV9kcml2ZXIgbWVzb25fcnRjX2RyaXZlciA9IHsKPj4gK8KgwqDCoCAucHJv YmXCoMKgwqDCoMKgwqDCoCA9IG1lc29uX3J0Y19wcm9iZSwKPj4gK8KgwqDCoCAuZHJpdmVywqDC oMKgwqDCoMKgwqAgPSB7Cj4+ICvCoMKgwqDCoMKgwqDCoCAubmFtZcKgwqDCoCA9ICJtZXNvbi1y dGMiLAo+PiArwqDCoMKgwqDCoMKgwqAgLm9mX21hdGNoX3RhYmxlwqDCoMKgID0gb2ZfbWF0Y2hf cHRyKG1lc29uX3J0Y19kdF9tYXRjaCksCj4+ICvCoMKgwqAgfSwKPj4gK307Cj4+ICttb2R1bGVf cGxhdGZvcm1fZHJpdmVyKG1lc29uX3J0Y19kcml2ZXIpOwo+PiArCj4+ICtNT0RVTEVfREVTQ1JJ UFRJT04oIkFtbG9naWMgTWVzb24gUlRDIERyaXZlciIpOwo+PiArTU9EVUxFX0FVVEhPUigiQmVu IERvb2tzIDxiZW4uZG9vc2tAY29kZXRoaW5rLmNvLnVrPiIpOwo+PiArTU9EVUxFX0FVVEhPUigi TWFydGluIEJsdW1lbnN0aW5nbCA8bWFydGluLmJsdW1lbnN0aW5nbEBnb29nbGVtYWlsLmNvbT4i KTsKPj4gK01PRFVMRV9MSUNFTlNFKCJHUEwgdjIiKTsKPj4gK01PRFVMRV9BTElBUygicGxhdGZv cm06bWVzb24tcnRjIik7Cj4+Cj4gCj4gCgoKX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fX18KbGludXgtYXJtLWtlcm5lbCBtYWlsaW5nIGxpc3QKbGludXgtYXJt LWtlcm5lbEBsaXN0cy5pbmZyYWRlYWQub3JnCmh0dHA6Ly9saXN0cy5pbmZyYWRlYWQub3JnL21h aWxtYW4vbGlzdGluZm8vbGludXgtYXJtLWtlcm5lbAo= 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.7 required=3.0 tests=DKIMWL_WL_HIGH,DKIM_SIGNED, DKIM_VALID,HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_PATCH,MAILING_LIST_MULTI, SIGNED_OFF_BY,SPF_PASS,URIBL_BLOCKED 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 52EE6C04EB9 for ; Wed, 5 Dec 2018 15:03:00 +0000 (UTC) Received: from bombadil.infradead.org (bombadil.infradead.org [198.137.202.133]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id 215FC206B7 for ; Wed, 5 Dec 2018 15:03:00 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (2048-bit key) header.d=lists.infradead.org header.i=@lists.infradead.org header.b="o/uNGCVZ"; dkim=fail reason="signature verification failed" (2048-bit key) header.d=baylibre-com.20150623.gappssmtp.com header.i=@baylibre-com.20150623.gappssmtp.com header.b="p9XetDgC" DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 215FC206B7 Authentication-Results: mail.kernel.org; dmarc=none (p=none dis=none) header.from=baylibre.com Authentication-Results: mail.kernel.org; spf=none smtp.mailfrom=linux-amlogic-bounces+linux-amlogic=archiver.kernel.org@lists.infradead.org DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=bombadil.20170209; h=Sender: Content-Transfer-Encoding:Content-Type:Cc:List-Subscribe:List-Help:List-Post: List-Archive:List-Unsubscribe:List-Id:In-Reply-To:MIME-Version:Date: Message-ID:From:References:To:Subject:Reply-To:Content-ID:Content-Description :Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID: List-Owner; bh=R9acD+f+Ph9oHWwww/aH2b+cpwWfei5izLEzM8rbrPg=; b=o/uNGCVZemPwHI dzo5fTKHUddgVUPQrj1w2VbF0QTMxJpU++ygYCY8u7Cq64TXskvgK8brzCbEE3d0HnpEp8uHZd3Aa TOELIxQo/5Xc0+xR3h53g7Y7JXiRoT1pX+V9YBb3Z84Hf08nKroqGqadHjVE1j+i5tOs4nMPOwAbE gwwdHnM7kZt+cfLaerBpaWQj2EnzY/qW4991fUqrAWEJOfISIGvAhSkeynwwq2C3LL55VCc6xnTme WQroQxQ0Kzsp1bIrB3W9QM2QZ1HcFIxhzX29gHByiiUg3V6gZ+ydoUDUeMW43dkM8b1+em+m2qM/A nvVGHUJdF8qB6i8Tl0zA==; Received: from localhost ([127.0.0.1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.90_1 #2 (Red Hat Linux)) id 1gUYhR-00078K-Cs; Wed, 05 Dec 2018 15:02:53 +0000 Received: from mail-wm1-x341.google.com ([2a00:1450:4864:20::341]) by bombadil.infradead.org with esmtps (Exim 4.90_1 #2 (Red Hat Linux)) id 1gUYh5-0006i7-Oj for linux-amlogic@lists.infradead.org; Wed, 05 Dec 2018 15:02:38 +0000 Received: by mail-wm1-x341.google.com with SMTP id m22so13268490wml.3 for ; Wed, 05 Dec 2018 07:02:20 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=baylibre-com.20150623.gappssmtp.com; s=20150623; h=subject:to:cc:references:from:openpgp:autocrypt:organization :message-id:date:user-agent:mime-version:in-reply-to :content-language:content-transfer-encoding; bh=bGynSR3sym+42cUjytHoZSlzy93vn4mANzjgbQsDTOo=; b=p9XetDgCdaVhMdo1jK2CzAvH5FJM21AThj5j87ziZEWQUuB07NRiJOwHiwP3lcSljv INZwVs13IVoJu3XlApN35cTcC5bI5Wxihxx8DsIJyOFHb/bQcdGka09kYCVwtWAcKb44 vOfPI05WxPOVimyR4rBN/iw4JtsLp4Ok0mZ0KfRCDrBbylDMlYQXQfOFTcS66yOnVx9/ Rav8+4gHa596sb9vyZQhyiiRZRgFzrAwV9QZQvKwbiCVAxBzYtCTzxWYBbUI7i/1q2oE 2F9otTbr5ou9lHVdiAJZq/A3e2fHSF6Av/UHsYp3edNKIKtgYgKSphNRxEgf6K5zR3xM 2IrA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:subject:to:cc:references:from:openpgp:autocrypt :organization:message-id:date:user-agent:mime-version:in-reply-to :content-language:content-transfer-encoding; bh=bGynSR3sym+42cUjytHoZSlzy93vn4mANzjgbQsDTOo=; b=GD+1EBnQmLw4zhE9cJSPh/DPSbzIBqrSA9FjYo/FjVycfoibk+2kIYQYq6wONYo0Kf 0lOhBR4D+/igHUC5LiMNxM/+AWofC2DT17I7oayXEd8s2A63Ol8r6+jEh8NySwgnfVeH tHARjYUNk5NASnbNtvP81H2j/OfEAU2ZA5FsbZpLlRyOr5PPP9OFhwyAx7yBAew6d4eU 6+xf7brTP3sMl5a7NfCItyXx5C8OaIy4kbemzP0oUmP1HMrmGSOD4QM5/Dp/7eR54wGu aLaDE//MwIqnJs1GHj11zlpmm1B13dM6DeWRGfLmliDTMVsIt0xDw8hh/ViwGphtwOp1 Wd5A== X-Gm-Message-State: AA+aEWZH6dOZJAtPGmbYM50x1SofeFANiu3TBT0yStlznn2eouY7jxMV xQmttrBIIDlwKckgNoPqoMyOnA== X-Google-Smtp-Source: AFSGD/Xs1EGYO/g+89ctnehdvG4hBXCRYt7qj9svVDPGauGDnQLkj34luOr+ZqzGo5SvLeeuSJNZ4A== X-Received: by 2002:a1c:b4e:: with SMTP id 75mr2628907wml.143.1544022139214; Wed, 05 Dec 2018 07:02:19 -0800 (PST) Received: from ?IPv6:2a01:cb1d:4ce:ea00:819f:4d34:9af9:e67? ([2a01:cb1d:4ce:ea00:819f:4d34:9af9:e67]) by smtp.gmail.com with ESMTPSA id j8sm18291226wmd.0.2018.12.05.07.02.18 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Wed, 05 Dec 2018 07:02:18 -0800 (PST) Subject: Re: [PATCH v5 2/2] rtc: support for the Amlogic Meson RTC To: Ben Dooks , Martin Blumenstingl , linux-amlogic@lists.infradead.org, linux-rtc@vger.kernel.org, alexandre.belloni@bootlin.com, a.zummo@towertech.it References: <20181202220847.24364-1-martin.blumenstingl@googlemail.com> <20181202220847.24364-3-martin.blumenstingl@googlemail.com> <85aa8e12-0bca-6432-e1a8-0faceff1dd5e@codethink.co.uk> From: Neil Armstrong Openpgp: preference=signencrypt Autocrypt: addr=narmstrong@baylibre.com; prefer-encrypt=mutual; keydata= xsBNBE1ZBs8BCAD78xVLsXPwV/2qQx2FaO/7mhWL0Qodw8UcQJnkrWmgTFRobtTWxuRx8WWP GTjuhvbleoQ5Cxjr+v+1ARGCH46MxFP5DwauzPekwJUD5QKZlaw/bURTLmS2id5wWi3lqVH4 BVF2WzvGyyeV1o4RTCYDnZ9VLLylJ9bneEaIs/7cjCEbipGGFlfIML3sfqnIvMAxIMZrvcl9 qPV2k+KQ7q+aXavU5W+yLNn7QtXUB530Zlk/d2ETgzQ5FLYYnUDAaRl+8JUTjc0CNOTpCeik 80TZcE6f8M76Xa6yU8VcNko94Ck7iB4vj70q76P/J7kt98hklrr85/3NU3oti3nrIHmHABEB AAHNKE5laWwgQXJtc3Ryb25nIDxuYXJtc3Ryb25nQGJheWxpYnJlLmNvbT7CwHsEEwEKACUC GyMGCwkIBwMCBhUIAgkKCwQWAgMBAh4BAheABQJXDO2CAhkBAAoJEBaat7Gkz/iubGIH/iyk RqvgB62oKOFlgOTYCMkYpm2aAOZZLf6VKHKc7DoVwuUkjHfIRXdslbrxi4pk5VKU6ZP9AKsN NtMZntB8WrBTtkAZfZbTF7850uwd3eU5cN/7N1Q6g0JQihE7w4GlIkEpQ8vwSg5W7hkx3yQ6 2YzrUZh/b7QThXbNZ7xOeSEms014QXazx8+txR7jrGF3dYxBsCkotO/8DNtZ1R+aUvRfpKg5 ZgABTC0LmAQnuUUf2PHcKFAHZo5KrdO+tyfL+LgTUXIXkK+tenkLsAJ0cagz1EZ5gntuheLD YJuzS4zN+1Asmb9kVKxhjSQOcIh6g2tw7vaYJgL/OzJtZi6JlIXOwE0ETVkGzwEIALyKDN/O GURaHBVzwjgYq+ZtifvekdrSNl8TIDH8g1xicBYpQTbPn6bbSZbdvfeQPNCcD4/EhXZuhQXM coJsQQQnO4vwVULmPGgtGf8PVc7dxKOeta+qUh6+SRh3vIcAUFHDT3f/Zdspz+e2E0hPV2hi SvICLk11qO6cyJE13zeNFoeY3ggrKY+IzbFomIZY4yG6xI99NIPEVE9lNBXBKIlewIyVlkOa YvJWSV+p5gdJXOvScNN1epm5YHmf9aE2ZjnqZGoMMtsyw18YoX9BqMFInxqYQQ3j/HpVgTSv mo5ea5qQDDUaCsaTf8UeDcwYOtgI8iL4oHcsGtUXoUk33HEAEQEAAcLAXwQYAQIACQUCTVkG zwIbDAAKCRAWmrexpM/4rrXiB/sGbkQ6itMrAIfnM7IbRuiSZS1unlySUVYu3SD6YBYnNi3G 5EpbwfBNuT3H8//rVvtOFK4OD8cRYkxXRQmTvqa33eDIHu/zr1HMKErm+2SD6PO9umRef8V8 2o2oaCLvf4WeIssFjwB0b6a12opuRP7yo3E3gTCSKmbUuLv1CtxKQF+fUV1cVaTPMyT25Od+ RC1K+iOR0F54oUJvJeq7fUzbn/KdlhA8XPGzwGRy4zcsPWvwnXgfe5tk680fEKZVwOZKIEuJ C3v+/yZpQzDvGYJvbyix0lHnrCzq43WefRHI5XTTQbM0WUIBIcGmq38+OgUsMYu4NzLu7uZF Acmp6h8g Organization: Baylibre Message-ID: Date: Wed, 5 Dec 2018 16:02:17 +0100 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:60.0) Gecko/20100101 Thunderbird/60.2.1 MIME-Version: 1.0 In-Reply-To: <85aa8e12-0bca-6432-e1a8-0faceff1dd5e@codethink.co.uk> Content-Language: en-US X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20181205_070232_368574_AFE08D36 X-CRM114-Status: GOOD ( 25.05 ) X-BeenThere: linux-amlogic@lists.infradead.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: linux-kernel@vger.kernel.org, linux-arm-kernel@lists.infradead.org, ccaione@baylibre.com Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Sender: "linux-amlogic" Errors-To: linux-amlogic-bounces+linux-amlogic=archiver.kernel.org@lists.infradead.org SGkgQmVuLAoKT24gMDUvMTIvMjAxOCAxNDozNiwgQmVuIERvb2tzIHdyb3RlOgo+IE9uIDAyLzEy LzIwMTggMjI6MDgsIE1hcnRpbiBCbHVtZW5zdGluZ2wgd3JvdGU6Cj4+IEFkZCBzdXBwb3J0IGZv ciB0aGUgUlRDIGJsb2NrIG9uIHRoZSAzMi1iaXQgQW1sb2dpYyBNZXNvbjYsIE1lc29uOCwKPj4g TWVzb244YiBhbmQgTWVzb244bTIgU29Dcy4KPj4KPj4gVGhlIFJUQyBpcyBzcGxpdCBpbiB0byB0 d28gcGFydHMsIHdoaWNoIGFyZSBib3RoIG1hbmFnZWQgYnkgdGhpcyBkcml2ZXI6Cj4+IC0gdGhl IEFIQiBmcm9udCBlbmQKPj4gLSBhbmQgYSBzaW1wbGUgc2VyaWFsIGNvbm5lY3Rpb24gdG8gdGhl IGFjdHVhbCByZWdpc3RlcnMKPj4KPj4gVGhlIFJUQ19DT1VOVEVSIHJlZ2lzdGVyIHdoaWNoIGhv bGRzIHRoZSB0aW1lIGlzIDMyLWJpdHMgd2lkZS4KPj4KPj4gVGhlcmUgYXJlIGZvdXIgMzItYml0 IHdpZGUgKGluIHRvdGFsOiAxNiBieXRlcykgInJlZ21lbSIgcmVnaXN0ZXJzIHdoaWNoCj4+IGFy ZSBleHBvc2VkIHVzaW5nIG52bWVtLiBPbiBBbWxvZ2ljJ3MgMy4xMCBrZXJuZWwgdGhpcyBpcyB1 c2VkIHRvIHN0b3JlCj4+IGRhdGEgd2hpY2ggbmVlZHMgdG8gc3Vydml2ZSBhIHN1c3BlbmQgLyBy ZXN1bWUgY3ljbGUuCj4+Cj4+IFNpZ25lZC1vZmYtYnk6IEJlbiBEb29rcyA8YmVuLmRvb2tzQGNv ZGV0aGluay5jby51az4KPj4gW3Jlc3VycmVjdGVkIEJlbidzIHBhdGNoZXMgYWZ0ZXIgMiB5ZWFy c10KPj4gU2lnbmVkLW9mZi1ieTogTWFydGluIEJsdW1lbnN0aW5nbCA8bWFydGluLmJsdW1lbnN0 aW5nbEBnb29nbGVtYWlsLmNvbT4KPiAKPiBKdXN0IGNoZWNraW5nIGlmIHRoZSBjaGFuZ2Ugb2Yg YXV0aG9yIGlzIGRlbGliZXJhdGU/Cj4gbm90IHN1cmUgaG93IHRvIGRvID4xIGF1dGhvciBvbiBw YXRjaGVzIGxpa2UgdGhpcy4KCk1hcnRpbiBoYXMgYmVlbiB2ZXJ5IGV4cGxpY2l0IGFib3V0IHRo YXQgaW4gdGhlIGNvdmVyIGxldHRlciA6Cmh0dHBzOi8vcGF0Y2h3b3JrLmtlcm5lbC5vcmcvY292 ZXIvMTA3MDg0MjcvCgpOZWlsCgo+IAo+PiAtLS0KPj4gwqAgZHJpdmVycy9ydGMvS2NvbmZpZ8Kg wqDCoMKgIHzCoCAxMSArKwo+PiDCoCBkcml2ZXJzL3J0Yy9NYWtlZmlsZcKgwqDCoCB8wqDCoCAx ICsKPj4gwqAgZHJpdmVycy9ydGMvcnRjLW1lc29uLmMgfCA0MDkgKysrKysrKysrKysrKysrKysr KysrKysrKysrKysrKysrKysrKysrKwo+PiDCoCAzIGZpbGVzIGNoYW5nZWQsIDQyMSBpbnNlcnRp b25zKCspCj4+IMKgIGNyZWF0ZSBtb2RlIDEwMDY0NCBkcml2ZXJzL3J0Yy9ydGMtbWVzb24uYwo+ Pgo+PiBkaWZmIC0tZ2l0IGEvZHJpdmVycy9ydGMvS2NvbmZpZyBiL2RyaXZlcnMvcnRjL0tjb25m aWcKPj4gaW5kZXggYTgxOWVmMDdiN2VjLi5kNWQwZTNhZmZkYzYgMTAwNjQ0Cj4+IC0tLSBhL2Ry aXZlcnMvcnRjL0tjb25maWcKPj4gKysrIGIvZHJpdmVycy9ydGMvS2NvbmZpZwo+PiBAQCAtMTI4 NSw2ICsxMjg1LDE3IEBAIGNvbmZpZyBSVENfRFJWX0lNWERJCj4+IMKgwqDCoMKgwqDCoMKgwqAg VGhpcyBkcml2ZXIgY2FuIGFsc28gYmUgYnVpbHQgYXMgYSBtb2R1bGUsIGlmIHNvLCB0aGUgbW9k dWxlCj4+IMKgwqDCoMKgwqDCoMKgwqAgd2lsbCBiZSBjYWxsZWQgInJ0Yy1pbXhkaSIuCj4+IMKg ICtjb25maWcgUlRDX0RSVl9NRVNPTgo+PiArwqDCoMKgIHRyaXN0YXRlICJBbWxvZ2ljIE1lc29u IFJUQyIKPj4gK8KgwqDCoCBkZXBlbmRzIG9uIChBUk0gJiYgQVJDSF9NRVNPTikgfHwgQ09NUElM RV9URVNUCj4+ICvCoMKgwqAgc2VsZWN0IFJFR01BUF9NTUlPCj4+ICvCoMKgwqAgaGVscAo+PiAr wqDCoMKgwqDCoMKgIFN1cHBvcnQgZm9yIHRoZSBSVEMgYmxvY2sgb24gdGhlIEFtbG9naWMgTWVz b242LCBNZXNvbjgsIE1lc29uOGIKPj4gK8KgwqDCoMKgwqDCoCBhbmQgTWVzb244bTIgU29Dcy4K Pj4gKwo+PiArwqDCoMKgwqDCoMKgIFRoaXMgZHJpdmVyIGNhbiBhbHNvIGJlIGJ1aWx0IGFzIGEg bW9kdWxlLCBpZiBzbywgdGhlIG1vZHVsZQo+PiArwqDCoMKgwqDCoMKgIHdpbGwgYmUgY2FsbGVk ICJydGMtbWVzb24iLgo+PiArCj4+IMKgIGNvbmZpZyBSVENfRFJWX09NQVAKPj4gwqDCoMKgwqDC oCB0cmlzdGF0ZSAiVEkgT01BUCBSZWFsIFRpbWUgQ2xvY2siCj4+IMKgwqDCoMKgwqAgZGVwZW5k cyBvbiBBUkNIX09NQVAgfHwgQVJDSF9EQVZJTkNJIHx8IENPTVBJTEVfVEVTVAo+PiBkaWZmIC0t Z2l0IGEvZHJpdmVycy9ydGMvTWFrZWZpbGUgYi9kcml2ZXJzL3J0Yy9NYWtlZmlsZQo+PiBpbmRl eCAyOTBjMTczMGZiMGEuLjNiMDg4ZTc1MTQ5ZCAxMDA2NDQKPj4gLS0tIGEvZHJpdmVycy9ydGMv TWFrZWZpbGUKPj4gKysrIGIvZHJpdmVycy9ydGMvTWFrZWZpbGUKPj4gQEAgLTk5LDYgKzk5LDcg QEAgb2JqLSQoQ09ORklHX1JUQ19EUlZfTUFYODk5NynCoMKgwqAgKz0gcnRjLW1heDg5OTcubwo+ PiDCoCBvYmotJChDT05GSUdfUlRDX0RSVl9NQVg4OTk4KcKgwqDCoCArPSBydGMtbWF4ODk5OC5v Cj4+IMKgIG9iai0kKENPTkZJR19SVENfRFJWX01DMTNYWFgpwqDCoMKgICs9IHJ0Yy1tYzEzeHh4 Lm8KPj4gwqAgb2JqLSQoQ09ORklHX1JUQ19EUlZfTUNQNzk1KcKgwqDCoCArPSBydGMtbWNwNzk1 Lm8KPj4gK29iai0kKENPTkZJR19SVENfRFJWX01FU09OKcKgwqDCoCArPSBydGMtbWVzb24ubwo+ PiDCoCBvYmotJChDT05GSUdfUlRDX0RSVl9NT1hBUlQpwqDCoMKgICs9IHJ0Yy1tb3hhcnQubwo+ PiDCoCBvYmotJChDT05GSUdfUlRDX0RSVl9NUEM1MTIxKcKgwqDCoCArPSBydGMtbXBjNTEyMS5v Cj4+IMKgIG9iai0kKENPTkZJR19SVENfRFJWX01TTTYyNDIpwqDCoMKgICs9IHJ0Yy1tc202MjQy Lm8KPj4gZGlmZiAtLWdpdCBhL2RyaXZlcnMvcnRjL3J0Yy1tZXNvbi5jIGIvZHJpdmVycy9ydGMv cnRjLW1lc29uLmMKPj4gbmV3IGZpbGUgbW9kZSAxMDA2NDQKPj4gaW5kZXggMDAwMDAwMDAwMDAw Li4wOWQ2ODQ5YjgwNGEKPj4gLS0tIC9kZXYvbnVsbAo+PiArKysgYi9kcml2ZXJzL3J0Yy9ydGMt bWVzb24uYwo+PiBAQCAtMCwwICsxLDQwOSBAQAo+PiArLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZp ZXI6IEdQTC0yLjAKPj4gKy8qCj4+ICsgKiBSVEMgZHJpdmVyIGZvciB0aGUgaW50ZXJhbCBSVEMg YmxvY2sgaW4gdGhlIEFtbG9naWMgTWVzb242LCBNZXNvbjgsCj4+ICsgKiBNZXNvbjhiIGFuZCBN ZXNvbjhtMiBTb0NzLgo+PiArICoKPj4gKyAqIFRoZSBSVEMgaXMgc3BsaXQgaW4gdG8gdHdvIHBh cnRzLCB0aGUgQUhCIGZyb250IGVuZCBhbmQgYSBzaW1wbGUgc2VyaWFsCj4+ICsgKiBjb25uZWN0 aW9uIHRvIHRoZSBhY3R1YWwgcmVnaXN0ZXJzLiBUaGlzIGRyaXZlciBtYW5hZ2VzIGJvdGggcGFy dHMuCj4+ICsgKgo+PiArICogQ29weXJpZ2h0IChjKSAyMDE4IE1hcnRpbiBCbHVtZW5zdGluZ2wg PG1hcnRpbi5ibHVtZW5zdGluZ2xAZ29vZ2xlbWFpbC5jb20+Cj4+ICsgKiBDb3B5cmlnaHQgKGMp IDIwMTUgQmVuIERvb2tzIDxiZW4uZG9va3NAY29kZXRoaW5rLmNvLnVrPiBmb3IgQ29kZXRoaW5r IEx0ZAo+PiArICogQmFzZWQgb24gb3JpZ2luIGJ5IENhcmxvIENhaW9uZSA8Y2FybG9AZW5kbGVz c20uY29tPgo+PiArICovCj4+ICsKPj4gKyNpbmNsdWRlIDxsaW51eC9iaXRmaWVsZC5oPgo+PiAr I2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+Cj4+ICsjaW5jbHVkZSA8bGludXgvaW8uaD4KPj4gKyNp bmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KPj4gKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KPj4g KyNpbmNsdWRlIDxsaW51eC9udm1lbS1wcm92aWRlci5oPgo+PiArI2luY2x1ZGUgPGxpbnV4L29m Lmg+Cj4+ICsjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+Cj4+ICsjaW5jbHVkZSA8 bGludXgvcmVnbWFwLmg+Cj4+ICsjaW5jbHVkZSA8bGludXgvcmVndWxhdG9yL2NvbnN1bWVyLmg+ Cj4+ICsjaW5jbHVkZSA8bGludXgvcmVzZXQuaD4KPj4gKyNpbmNsdWRlIDxsaW51eC9ydGMuaD4K Pj4gKwo+PiArLyogcmVnaXN0ZXJzIGFjY2Vzc2VkIGZyb20gY3B1IGJ1cyAqLwo+PiArI2RlZmlu ZSBSVENfQUREUjDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgMHgwMAo+PiArwqDCoMKg ICNkZWZpbmUgUlRDX0FERFIwX0xJTkVfU0NMS8KgwqDCoMKgwqDCoMKgIEJJVCgwKQo+PiArwqDC oMKgICNkZWZpbmUgUlRDX0FERFIwX0xJTkVfU0VOwqDCoMKgwqDCoMKgwqAgQklUKDEpCj4+ICvC oMKgwqAgI2RlZmluZSBSVENfQUREUjBfTElORV9TREnCoMKgwqDCoMKgwqDCoCBCSVQoMikKPj4g K8KgwqDCoCAjZGVmaW5lIFJUQ19BRERSMF9TVEFSVF9TRVLCoMKgwqDCoMKgwqDCoCBCSVQoMTcp Cj4+ICvCoMKgwqAgI2RlZmluZSBSVENfQUREUjBfV0FJVF9TRVLCoMKgwqDCoMKgwqDCoCBCSVQo MjIpCj4+ICvCoMKgwqAgI2RlZmluZSBSVENfQUREUjBfREFUQcKgwqDCoMKgwqDCoMKgwqDCoMKg wqAgR0VOTUFTSygzMSwgMjQpCj4+ICsKPj4gKyNkZWZpbmUgUlRDX0FERFIxwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgIDB4MDQKPj4gK8KgwqDCoCAjZGVmaW5lIFJUQ19BRERSMV9TRE/C oMKgwqDCoMKgwqDCoMKgwqDCoMKgIEJJVCgwKQo+PiArwqDCoMKgICNkZWZpbmUgUlRDX0FERFIx X1NfUkVBRFnCoMKgwqDCoMKgwqDCoCBCSVQoMSkKPj4gKwo+PiArI2RlZmluZSBSVENfQUREUjLC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgMHgwOAo+PiArI2RlZmluZSBSVENfQUREUjPC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgMHgwYwo+PiArCj4+ICsjZGVmaW5lIFJUQ19S RUc0wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIDB4MTAKPj4gK8KgwqDCoCAjZGVmaW5l IFJUQ19SRUc0X1NUQVRJQ19WQUxVRcKgwqDCoMKgwqDCoMKgIEdFTk1BU0soNywgMCkKPj4gKwo+ PiArLyogcnRjIHJlZ2lzdGVycyBhY2Nlc3NlZCB2aWEgcnRjLXNlcmlhbCBpbnRlcmZhY2UgKi8K Pj4gKyNkZWZpbmUgUlRDX0NPVU5URVLCoMKgwqDCoMKgwqDCoCAoMCkKPj4gKyNkZWZpbmUgUlRD X1NFQ19BRErCoMKgwqDCoMKgwqDCoCAoMikKPj4gKyNkZWZpbmUgUlRDX1JFR01FTV8wwqDCoMKg wqDCoMKgwqAgKDQpCj4+ICsjZGVmaW5lIFJUQ19SRUdNRU1fMcKgwqDCoMKgwqDCoMKgICg1KQo+ PiArI2RlZmluZSBSVENfUkVHTUVNXzLCoMKgwqDCoMKgwqDCoCAoNikKPj4gKyNkZWZpbmUgUlRD X1JFR01FTV8zwqDCoMKgwqDCoMKgwqAgKDcpCj4+ICsKPj4gKyNkZWZpbmUgUlRDX0FERFJfQklU U8KgwqDCoMKgwqDCoMKgICgzKcKgwqDCoCAvKiBudW1iZXIgb2YgYWRkcmVzcyBiaXRzIHRvIHNl bmQgKi8KPj4gKyNkZWZpbmUgUlRDX0RBVEFfQklUU8KgwqDCoMKgwqDCoMKgICgzMinCoMKgwqAg LyogbnVtYmVyIG9mIGRhdGEgYml0cyB0byB0eC9yeCAqLwo+PiArCj4+ICsjZGVmaW5lIE1FU09O X1NUQVRJQ19CSUFTX0NVUsKgwqDCoCAoMHg1IDw8IDEpCj4+ICsjZGVmaW5lIE1FU09OX1NUQVRJ Q19WT0xUQUdFwqDCoMKgICgweDMgPDwgMTEpCj4+ICsjZGVmaW5lIE1FU09OX1NUQVRJQ19ERUZB VUxUwqDCoMKgIChNRVNPTl9TVEFUSUNfQklBU19DVVIgfCBNRVNPTl9TVEFUSUNfVk9MVEFHRSkK Pj4gKwo+PiArc3RydWN0IG1lc29uX3J0YyB7Cj4+ICvCoMKgwqAgc3RydWN0IHJ0Y19kZXZpY2XC oMKgwqAgKnJ0YzvCoMKgwqDCoMKgwqDCoCAvKiBydGMgZGV2aWNlIHdlIGNyZWF0ZWQgKi8KPj4g K8KgwqDCoCBzdHJ1Y3QgZGV2aWNlwqDCoMKgwqDCoMKgwqAgKmRldjvCoMKgwqDCoMKgwqDCoCAv KiBkZXZpY2Ugd2UgYm91bmQgZnJvbSAqLwo+PiArwqDCoMKgIHN0cnVjdCByZXNldF9jb250cm9s wqDCoMKgICpyZXNldDvCoMKgwqDCoMKgwqDCoCAvKiByZXNldCBzb3VyY2UgKi8KPj4gK8KgwqDC oCBzdHJ1Y3QgcmVndWxhdG9ywqDCoMKgICp2ZGQ7wqDCoMKgwqDCoMKgwqAgLyogdm9sdGFnZSBp bnB1dCAqLwo+PiArwqDCoMKgIHN0cnVjdCByZWdtYXDCoMKgwqDCoMKgwqDCoCAqcGVyaXBoZXJh bDvCoMKgwqAgLyogcGVyaXBoZXJhbCByZWdpc3RlcnMgKi8KPj4gK8KgwqDCoCBzdHJ1Y3QgcmVn bWFwwqDCoMKgwqDCoMKgwqAgKnNlcmlhbDvCoMKgwqAgLyogc2VyaWFsIHJlZ2lzdGVycyAqLwo+ PiArfTsKPj4gKwo+PiArc3RhdGljIGNvbnN0IHN0cnVjdCByZWdtYXBfY29uZmlnIG1lc29uX3J0 Y19wZXJpcGhlcmFsX3JlZ21hcF9jb25maWcgPSB7Cj4+ICvCoMKgwqAgLm5hbWXCoMKgwqDCoMKg wqDCoCA9ICJwZXJpcGhlcmFsLXJlZ2lzdGVycyIsCj4+ICvCoMKgwqAgLnJlZ19iaXRzwqDCoMKg ID0gOCwKPj4gK8KgwqDCoCAudmFsX2JpdHPCoMKgwqAgPSAzMiwKPj4gK8KgwqDCoCAucmVnX3N0 cmlkZcKgwqDCoCA9IDQsCj4+ICvCoMKgwqAgLm1heF9yZWdpc3RlcsKgwqDCoCA9IFJUQ19SRUc0 LAo+PiArwqDCoMKgIC5mYXN0X2lvwqDCoMKgID0gdHJ1ZSwKPj4gK307Cj4+ICsKPj4gKy8qIFJU QyBmcm9udC1lbmQgc2VyaWFsaXNlciBjb250cm9scyAqLwo+PiArCj4+ICtzdGF0aWMgdm9pZCBt ZXNvbl9ydGNfc2Nsa19wdWxzZShzdHJ1Y3QgbWVzb25fcnRjICpydGMpCj4+ICt7Cj4+ICvCoMKg wqAgdWRlbGF5KDUpOwo+PiArwqDCoMKgIHJlZ21hcF91cGRhdGVfYml0cyhydGMtPnBlcmlwaGVy YWwsIFJUQ19BRERSMCwgUlRDX0FERFIwX0xJTkVfU0NMSywgMCk7Cj4+ICvCoMKgwqAgdWRlbGF5 KDUpOwo+PiArwqDCoMKgIHJlZ21hcF91cGRhdGVfYml0cyhydGMtPnBlcmlwaGVyYWwsIFJUQ19B RERSMCwgUlRDX0FERFIwX0xJTkVfU0NMSywKPj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqAgUlRDX0FERFIwX0xJTkVfU0NMSyk7Cj4+ICt9Cj4+ICsKPj4gK3N0YXRpYyB2b2lkIG1lc29u X3J0Y19zZW5kX2JpdChzdHJ1Y3QgbWVzb25fcnRjICpydGMsIHVuc2lnbmVkIGludCBiaXQpCj4+ ICt7Cj4+ICvCoMKgwqAgcmVnbWFwX3VwZGF0ZV9iaXRzKHJ0Yy0+cGVyaXBoZXJhbCwgUlRDX0FE RFIwLCBSVENfQUREUjBfTElORV9TREksCj4+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg IGJpdCA/IFJUQ19BRERSMF9MSU5FX1NESSA6IDApOwo+PiArwqDCoMKgIG1lc29uX3J0Y19zY2xr X3B1bHNlKHJ0Yyk7Cj4+ICt9Cj4+ICsKPj4gK3N0YXRpYyB2b2lkIG1lc29uX3J0Y19zZW5kX2Jp dHMoc3RydWN0IG1lc29uX3J0YyAqcnRjLCB1MzIgZGF0YSwKPj4gK8KgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoCB1bnNpZ25lZCBpbnQgbnIpCj4+ICt7Cj4+ICvCoMKgwqAgdTMyIGJpdCA9 IDEgPDwgKG5yIC0gMSk7Cj4+ICsKPj4gK8KgwqDCoCB3aGlsZSAoYml0KSB7Cj4+ICvCoMKgwqDC oMKgwqDCoCBtZXNvbl9ydGNfc2VuZF9iaXQocnRjLCBkYXRhICYgYml0KTsKPj4gK8KgwqDCoMKg wqDCoMKgIGJpdCA+Pj0gMTsKPj4gK8KgwqDCoCB9Cj4+ICt9Cj4+ICsKPj4gK3N0YXRpYyB2b2lk IG1lc29uX3J0Y19zZXRfZGlyKHN0cnVjdCBtZXNvbl9ydGMgKnJ0YywgdTMyIG1vZGUpCj4+ICt7 Cj4+ICvCoMKgwqAgcmVnbWFwX3VwZGF0ZV9iaXRzKHJ0Yy0+cGVyaXBoZXJhbCwgUlRDX0FERFIw LCBSVENfQUREUjBfTElORV9TRU4sIDApOwo+PiArwqDCoMKgIHJlZ21hcF91cGRhdGVfYml0cyhy dGMtPnBlcmlwaGVyYWwsIFJUQ19BRERSMCwgUlRDX0FERFIwX0xJTkVfU0RJLCAwKTsKPj4gK8Kg wqDCoCBtZXNvbl9ydGNfc2VuZF9iaXQocnRjLCBtb2RlKTsKPj4gK8KgwqDCoCByZWdtYXBfdXBk YXRlX2JpdHMocnRjLT5wZXJpcGhlcmFsLCBSVENfQUREUjAsIFJUQ19BRERSMF9MSU5FX1NESSwg MCk7Cj4+ICt9Cj4+ICsKPj4gK3N0YXRpYyB1MzIgbWVzb25fcnRjX2dldF9kYXRhKHN0cnVjdCBt ZXNvbl9ydGMgKnJ0YykKPj4gK3sKPj4gK8KgwqDCoCB1MzIgdG1wLCB2YWwgPSAwOwo+PiArwqDC oMKgIGludCBiaXQ7Cj4+ICsKPj4gK8KgwqDCoCBmb3IgKGJpdCA9IDA7IGJpdCA8IFJUQ19EQVRB X0JJVFM7IGJpdCsrKSB7Cj4+ICvCoMKgwqDCoMKgwqDCoCBtZXNvbl9ydGNfc2Nsa19wdWxzZShy dGMpOwo+PiArwqDCoMKgwqDCoMKgwqAgdmFsIDw8PSAxOwo+PiArCj4+ICvCoMKgwqDCoMKgwqDC oCByZWdtYXBfcmVhZChydGMtPnBlcmlwaGVyYWwsIFJUQ19BRERSMSwgJnRtcCk7Cj4+ICvCoMKg wqDCoMKgwqDCoCB2YWwgfD0gdG1wICYgUlRDX0FERFIxX1NETzsKPj4gK8KgwqDCoCB9Cj4+ICsK Pj4gK8KgwqDCoCByZXR1cm4gdmFsOwo+PiArfQo+PiArCj4+ICtzdGF0aWMgaW50IG1lc29uX3J0 Y19nZXRfYnVzKHN0cnVjdCBtZXNvbl9ydGMgKnJ0YykKPj4gK3sKPj4gK8KgwqDCoCBpbnQgcmV0 LCByZXRyaWVzID0gMzsKPj4gK8KgwqDCoCB1MzIgdmFsOwo+PiArCj4+ICvCoMKgwqAgLyogcHJl cGFyZSBidXMgZm9yIHRyYW5zZmVycywgc2V0IGFsbCBsaW5lcyBsb3cgKi8KPj4gK8KgwqDCoCB2 YWwgPSBSVENfQUREUjBfTElORV9TREkgfCBSVENfQUREUjBfTElORV9TRU4gfCBSVENfQUREUjBf TElORV9TQ0xLOwo+PiArwqDCoMKgIHJlZ21hcF91cGRhdGVfYml0cyhydGMtPnBlcmlwaGVyYWws IFJUQ19BRERSMCwgdmFsLCAwKTsKPj4gKwo+PiArwqDCoMKgIGZvciAocmV0cmllcyA9IDA7IHJl dHJpZXMgPCAzOyByZXRyaWVzKyspIHsKPj4gK8KgwqDCoMKgwqDCoMKgIC8qIHdhaXQgZm9yIHRo ZSBidXMgdG8gYmUgcmVhZHkgKi8KPj4gK8KgwqDCoMKgwqDCoMKgIGlmICghcmVnbWFwX3JlYWRf cG9sbF90aW1lb3V0KHJ0Yy0+cGVyaXBoZXJhbCwgUlRDX0FERFIxLCB2YWwsCj4+ICvCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCB2YWwgJiBSVENfQURE UjFfU19SRUFEWSwgMTAsCj4+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoCAxMDAwMCkpCj4+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIHJldHVybiAw Owo+PiArCj4+ICvCoMKgwqDCoMKgwqDCoCBkZXZfd2FybihydGMtPmRldiwgImZhaWxlZCB0byBn ZXQgYnVzLCByZXNldHRpbmcgUlRDXG4iKTsKPj4gKwo+PiArwqDCoMKgwqDCoMKgwqAgcmV0ID0g cmVzZXRfY29udHJvbF9yZXNldChydGMtPnJlc2V0KTsKPj4gK8KgwqDCoMKgwqDCoMKgIGlmIChy ZXQpCj4+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIHJldHVybiByZXQ7Cj4+ICvCoMKgwqAgfQo+ PiArCj4+ICvCoMKgwqAgZGV2X2VycihydGMtPmRldiwgImJ1cyBpcyBub3QgcmVhZHlcbiIpOwo+ PiArwqDCoMKgIHJldHVybiAtRVRJTUVET1VUOwo+PiArfQo+PiArCj4+ICtzdGF0aWMgaW50IG1l c29uX3J0Y19zZXJpYWxfYnVzX3JlZ19yZWFkKHZvaWQgKmNvbnRleHQsIHVuc2lnbmVkIGludCBy ZWcsCj4+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIHVuc2lnbmVk IGludCAqZGF0YSkKPj4gK3sKPj4gK8KgwqDCoCBzdHJ1Y3QgbWVzb25fcnRjICpydGMgPSBjb250 ZXh0Owo+PiArwqDCoMKgIGludCByZXQ7Cj4+ICsKPj4gK8KgwqDCoCByZXQgPSBtZXNvbl9ydGNf Z2V0X2J1cyhydGMpOwo+PiArwqDCoMKgIGlmIChyZXQpCj4+ICvCoMKgwqDCoMKgwqDCoCByZXR1 cm4gcmV0Owo+PiArCj4+ICvCoMKgwqAgcmVnbWFwX3VwZGF0ZV9iaXRzKHJ0Yy0+cGVyaXBoZXJh bCwgUlRDX0FERFIwLCBSVENfQUREUjBfTElORV9TRU4sCj4+ICvCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgIFJUQ19BRERSMF9MSU5FX1NFTik7Cj4+ICvCoMKgwqAgbWVzb25fcnRjX3NlbmRf Yml0cyhydGMsIHJlZywgUlRDX0FERFJfQklUUyk7Cj4+ICvCoMKgwqAgbWVzb25fcnRjX3NldF9k aXIocnRjLCAwKTsKPj4gK8KgwqDCoCAqZGF0YSA9IG1lc29uX3J0Y19nZXRfZGF0YShydGMpOwo+ PiArCj4+ICvCoMKgwqAgcmV0dXJuIDA7Cj4+ICt9Cj4+ICsKPj4gK3N0YXRpYyBpbnQgbWVzb25f cnRjX3NlcmlhbF9idXNfcmVnX3dyaXRlKHZvaWQgKmNvbnRleHQsIHVuc2lnbmVkIGludCByZWcs Cj4+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgdW5zaWduZWQg aW50IGRhdGEpCj4+ICt7Cj4+ICvCoMKgwqAgc3RydWN0IG1lc29uX3J0YyAqcnRjID0gY29udGV4 dDsKPj4gK8KgwqDCoCBpbnQgcmV0Owo+PiArCj4+ICvCoMKgwqAgcmV0ID0gbWVzb25fcnRjX2dl dF9idXMocnRjKTsKPj4gK8KgwqDCoCBpZiAocmV0KQo+PiArwqDCoMKgwqDCoMKgwqAgcmV0dXJu IHJldDsKPj4gKwo+PiArwqDCoMKgIHJlZ21hcF91cGRhdGVfYml0cyhydGMtPnBlcmlwaGVyYWws IFJUQ19BRERSMCwgUlRDX0FERFIwX0xJTkVfU0VOLAo+PiArwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoCBSVENfQUREUjBfTElORV9TRU4pOwo+PiArwqDCoMKgIG1lc29uX3J0Y19zZW5kX2Jp dHMocnRjLCBkYXRhLCBSVENfREFUQV9CSVRTKTsKPj4gK8KgwqDCoCBtZXNvbl9ydGNfc2VuZF9i aXRzKHJ0YywgcmVnLCBSVENfQUREUl9CSVRTKTsKPj4gK8KgwqDCoCBtZXNvbl9ydGNfc2V0X2Rp cihydGMsIDEpOwo+PiArCj4+ICvCoMKgwqAgcmV0dXJuIDA7Cj4+ICt9Cj4+ICsKPj4gK3N0YXRp YyBjb25zdCBzdHJ1Y3QgcmVnbWFwX2J1cyBtZXNvbl9ydGNfc2VyaWFsX2J1cyA9IHsKPj4gK8Kg wqDCoCAucmVnX3JlYWTCoMKgwqAgPSBtZXNvbl9ydGNfc2VyaWFsX2J1c19yZWdfcmVhZCwKPj4g K8KgwqDCoCAucmVnX3dyaXRlwqDCoMKgID0gbWVzb25fcnRjX3NlcmlhbF9idXNfcmVnX3dyaXRl LAo+PiArfTsKPj4gKwo+PiArc3RhdGljIGNvbnN0IHN0cnVjdCByZWdtYXBfY29uZmlnIG1lc29u X3J0Y19zZXJpYWxfcmVnbWFwX2NvbmZpZyA9IHsKPj4gK8KgwqDCoCAubmFtZcKgwqDCoMKgwqDC oMKgID0gInNlcmlhbC1yZWdpc3RlcnMiLAo+PiArwqDCoMKgIC5yZWdfYml0c8KgwqDCoCA9IDQs Cj4+ICvCoMKgwqAgLnJlZ19zdHJpZGXCoMKgwqAgPSAxLAo+PiArwqDCoMKgIC52YWxfYml0c8Kg wqDCoCA9IDMyLAo+PiArwqDCoMKgIC5tYXhfcmVnaXN0ZXLCoMKgwqAgPSBSVENfUkVHTUVNXzMs Cj4+ICvCoMKgwqAgLmZhc3RfaW/CoMKgwqAgPSBmYWxzZSwKPj4gK307Cj4+ICsKPj4gK3N0YXRp YyBpbnQgbWVzb25fcnRjX3dyaXRlX3N0YXRpYyhzdHJ1Y3QgbWVzb25fcnRjICpydGMsIHUzMiBk YXRhKQo+PiArewo+PiArwqDCoMKgIHUzMiB0bXA7Cj4+ICsKPj4gK8KgwqDCoCByZWdtYXBfd3Jp dGUocnRjLT5wZXJpcGhlcmFsLCBSVENfUkVHNCwKPj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oCBGSUVMRF9QUkVQKFJUQ19SRUc0X1NUQVRJQ19WQUxVRSwgKGRhdGEgPj4gOCkpKTsKPj4gKwo+ PiArwqDCoMKgIC8qIHdyaXRlIHRoZSBzdGF0aWMgdmFsdWUgYW5kIHN0YXJ0IHRoZSBhdXRvIHNl cmlhbGl6ZXIgKi8KPj4gK8KgwqDCoCB0bXAgPSBGSUVMRF9QUkVQKFJUQ19BRERSMF9EQVRBLCAo ZGF0YSAmIDB4ZmYpKSB8IFJUQ19BRERSMF9TVEFSVF9TRVI7Cj4+ICvCoMKgwqAgcmVnbWFwX3Vw ZGF0ZV9iaXRzKHJ0Yy0+cGVyaXBoZXJhbCwgUlRDX0FERFIwLAo+PiArwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoCBSVENfQUREUjBfREFUQSB8IFJUQ19BRERSMF9TVEFSVF9TRVIsIHRtcCk7 Cj4+ICsKPj4gK8KgwqDCoCAvKiB3YWl0IGZvciB0aGUgYXV0byBzZXJpYWxpemVyIHRvIGNvbXBs ZXRlICovCj4+ICvCoMKgwqAgcmV0dXJuIHJlZ21hcF9yZWFkX3BvbGxfdGltZW91dChydGMtPnBl cmlwaGVyYWwsIFJUQ19SRUc0LCB0bXAsCj4+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoCAhKHRtcCAmIFJUQ19BRERSMF9XQUlUX1NFUiksIDEwLAo+PiArwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgMTAwMDApOwo+PiArfQo+PiArCj4+ICsvKiBS VEMgaW50ZXJmYWNlIGxheWVyIGZ1bmN0aW9ucyAqLwo+PiArCj4+ICtzdGF0aWMgaW50IG1lc29u X3J0Y19nZXR0aW1lKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IHJ0Y190aW1lICp0bSkKPj4g K3sKPj4gK8KgwqDCoCBzdHJ1Y3QgbWVzb25fcnRjICpydGMgPSBkZXZfZ2V0X2RydmRhdGEoZGV2 KTsKPj4gK8KgwqDCoCB1MzIgdGltZTsKPj4gK8KgwqDCoCBpbnQgcmV0Owo+PiArCj4+ICvCoMKg wqAgcmV0ID0gcmVnbWFwX3JlYWQocnRjLT5zZXJpYWwsIFJUQ19DT1VOVEVSLCAmdGltZSk7Cj4+ ICvCoMKgwqAgaWYgKCFyZXQpCj4+ICvCoMKgwqDCoMKgwqDCoCBydGNfdGltZTY0X3RvX3RtKHRp bWUsIHRtKTsKPj4gKwo+PiArwqDCoMKgIHJldHVybiByZXQ7Cj4+ICt9Cj4+ICsKPj4gK3N0YXRp YyBpbnQgbWVzb25fcnRjX3NldHRpbWUoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgcnRjX3Rp bWUgKnRtKQo+PiArewo+PiArwqDCoMKgIHN0cnVjdCBtZXNvbl9ydGMgKnJ0YyA9IGRldl9nZXRf ZHJ2ZGF0YShkZXYpOwo+PiArCj4+ICvCoMKgwqAgcmV0dXJuIHJlZ21hcF93cml0ZShydGMtPnNl cmlhbCwgUlRDX0NPVU5URVIsIHJ0Y190bV90b190aW1lNjQodG0pKTsKPj4gK30KPj4gKwo+PiAr c3RhdGljIGNvbnN0IHN0cnVjdCBydGNfY2xhc3Nfb3BzIG1lc29uX3J0Y19vcHMgPSB7Cj4+ICvC oMKgwqAgLnJlYWRfdGltZcKgwqDCoCA9IG1lc29uX3J0Y19nZXR0aW1lLAo+PiArwqDCoMKgIC5z ZXRfdGltZcKgwqDCoCA9IG1lc29uX3J0Y19zZXR0aW1lLAo+PiArfTsKPj4gKwo+PiArLyogTlZN RU0gaW50ZXJmYWNlIGxheWVyIGZ1bmN0aW9ucyAqLwo+PiArCj4+ICtzdGF0aWMgaW50IG1lc29u X3J0Y19yZWdtZW1fcmVhZCh2b2lkICpjb250ZXh0LCB1bnNpZ25lZCBpbnQgb2Zmc2V0LAo+PiAr wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgdm9pZCAqYnVmLCBzaXplX3QgYnl0ZXMp Cj4+ICt7Cj4+ICvCoMKgwqAgc3RydWN0IG1lc29uX3J0YyAqcnRjID0gY29udGV4dDsKPj4gK8Kg wqDCoCB1bnNpZ25lZCBpbnQgcmVhZF9vZmZzZXQsIHJlYWRfc2l6ZTsKPj4gKwo+PiArwqDCoMKg IHJlYWRfb2Zmc2V0ID0gUlRDX1JFR01FTV8wICsgKG9mZnNldCAvIDQpOwo+PiArwqDCoMKgIHJl YWRfc2l6ZSA9IGJ5dGVzIC8gNDsKPj4gKwo+PiArwqDCoMKgIHJldHVybiByZWdtYXBfYnVsa19y ZWFkKHJ0Yy0+c2VyaWFsLCByZWFkX29mZnNldCwgYnVmLCByZWFkX3NpemUpOwo+PiArfQo+PiAr Cj4+ICtzdGF0aWMgaW50IG1lc29uX3J0Y19yZWdtZW1fd3JpdGUodm9pZCAqY29udGV4dCwgdW5z aWduZWQgaW50IG9mZnNldCwKPj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAg dm9pZCAqYnVmLCBzaXplX3QgYnl0ZXMpCj4+ICt7Cj4+ICvCoMKgwqAgc3RydWN0IG1lc29uX3J0 YyAqcnRjID0gY29udGV4dDsKPj4gK8KgwqDCoCB1bnNpZ25lZCBpbnQgd3JpdGVfb2Zmc2V0LCB3 cml0ZV9zaXplOwo+PiArCj4+ICvCoMKgwqAgd3JpdGVfb2Zmc2V0ID0gUlRDX1JFR01FTV8wICsg KG9mZnNldCAvIDQpOwo+PiArwqDCoMKgIHdyaXRlX3NpemUgPSBieXRlcyAvIDQ7Cj4+ICsKPj4g K8KgwqDCoCByZXR1cm4gcmVnbWFwX2J1bGtfd3JpdGUocnRjLT5zZXJpYWwsIHdyaXRlX29mZnNl dCwgYnVmLCB3cml0ZV9zaXplKTsKPj4gK30KPj4gKwo+PiArc3RhdGljIGludCBtZXNvbl9ydGNf cHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKPj4gK3sKPj4gK8KgwqDCoCBzdHJ1 Y3QgbnZtZW1fY29uZmlnIG1lc29uX3J0Y19udm1lbV9jb25maWcgPSB7Cj4+ICvCoMKgwqDCoMKg wqDCoCAubmFtZSA9ICJtZXNvbi1ydGMtcmVnbWVtIiwKPj4gK8KgwqDCoMKgwqDCoMKgIC53b3Jk X3NpemUgPSA0LAo+PiArwqDCoMKgwqDCoMKgwqAgLnN0cmlkZSA9IDQsCj4+ICvCoMKgwqDCoMKg wqDCoCAuc2l6ZSA9IFNaXzE2LAo+PiArwqDCoMKgwqDCoMKgwqAgLnJlZ19yZWFkID0gbWVzb25f cnRjX3JlZ21lbV9yZWFkLAo+PiArwqDCoMKgwqDCoMKgwqAgLnJlZ193cml0ZSA9IG1lc29uX3J0 Y19yZWdtZW1fd3JpdGUsCj4+ICvCoMKgwqAgfTsKPj4gK8KgwqDCoCBzdHJ1Y3QgZGV2aWNlICpk ZXYgPSAmcGRldi0+ZGV2Owo+PiArwqDCoMKgIHN0cnVjdCBtZXNvbl9ydGMgKnJ0YzsKPj4gK8Kg wqDCoCBzdHJ1Y3QgcmVzb3VyY2UgKnJlczsKPj4gK8KgwqDCoCB2b2lkIF9faW9tZW0gKmJhc2U7 Cj4+ICvCoMKgwqAgaW50IHJldDsKPj4gK8KgwqDCoCB1MzIgdG07Cj4+ICsKPj4gK8KgwqDCoCBy dGMgPSBkZXZtX2t6YWxsb2MoZGV2LCBzaXplb2Yoc3RydWN0IG1lc29uX3J0YyksIEdGUF9LRVJO RUwpOwo+PiArwqDCoMKgIGlmICghcnRjKQo+PiArwqDCoMKgwqDCoMKgwqAgcmV0dXJuIC1FTk9N RU07Cj4+ICsKPj4gK8KgwqDCoCBydGMtPnJ0YyA9IGRldm1fcnRjX2FsbG9jYXRlX2RldmljZShk ZXYpOwo+PiArwqDCoMKgIGlmIChJU19FUlIocnRjLT5ydGMpKQo+PiArwqDCoMKgwqDCoMKgwqAg cmV0dXJuIFBUUl9FUlIocnRjLT5ydGMpOwo+PiArCj4+ICvCoMKgwqAgcGxhdGZvcm1fc2V0X2Ry dmRhdGEocGRldiwgcnRjKTsKPj4gKwo+PiArwqDCoMKgIHJ0Yy0+ZGV2ID0gZGV2Owo+PiArCj4+ ICvCoMKgwqAgcnRjLT5ydGMtPm9wcyA9ICZtZXNvbl9ydGNfb3BzOwo+PiArwqDCoMKgIHJ0Yy0+ cnRjLT5yYW5nZV9tYXggPSBVMzJfTUFYOwo+PiArCj4+ICvCoMKgwqAgcmVzID0gcGxhdGZvcm1f Z2V0X3Jlc291cmNlKHBkZXYsIElPUkVTT1VSQ0VfTUVNLCAwKTsKPj4gK8KgwqDCoCBiYXNlID0g ZGV2bV9pb3JlbWFwX3Jlc291cmNlKGRldiwgcmVzKTsKPj4gK8KgwqDCoCBpZiAoSVNfRVJSKGJh c2UpKQo+PiArwqDCoMKgwqDCoMKgwqAgcmV0dXJuIFBUUl9FUlIoYmFzZSk7Cj4+ICsKPj4gK8Kg wqDCoCBydGMtPnBlcmlwaGVyYWwgPSBkZXZtX3JlZ21hcF9pbml0X21taW8oZGV2LCBiYXNlLAo+ PiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgJm1lc29uX3J0Y19wZXJp cGhlcmFsX3JlZ21hcF9jb25maWcpOwo+PiArwqDCoMKgIGlmIChJU19FUlIocnRjLT5wZXJpcGhl cmFsKSkgewo+PiArwqDCoMKgwqDCoMKgwqAgZGV2X2VycihkZXYsICJmYWlsZWQgdG8gY3JlYXRl IHBlcmlwaGVyYWwgcmVnbWFwXG4iKTsKPj4gK8KgwqDCoMKgwqDCoMKgIHJldHVybiBQVFJfRVJS KHJ0Yy0+cGVyaXBoZXJhbCk7Cj4+ICvCoMKgwqAgfQo+PiArCj4+ICvCoMKgwqAgcnRjLT5yZXNl dCA9IGRldm1fcmVzZXRfY29udHJvbF9nZXQoZGV2LCBOVUxMKTsKPj4gK8KgwqDCoCBpZiAoSVNf RVJSKHJ0Yy0+cmVzZXQpKSB7Cj4+ICvCoMKgwqDCoMKgwqDCoCBkZXZfZXJyKGRldiwgIm1pc3Np bmcgcmVzZXQgbGluZVxuIik7Cj4+ICvCoMKgwqDCoMKgwqDCoCByZXR1cm4gUFRSX0VSUihydGMt PnJlc2V0KTsKPj4gK8KgwqDCoCB9Cj4+ICsKPj4gK8KgwqDCoCBydGMtPnZkZCA9IGRldm1fcmVn dWxhdG9yX2dldChkZXYsICJ2ZGQiKTsKPj4gK8KgwqDCoCBpZiAoSVNfRVJSKHJ0Yy0+dmRkKSkg ewo+PiArwqDCoMKgwqDCoMKgwqAgZGV2X2VycihkZXYsICJmYWlsZWQgdG8gZ2V0IHRoZSB2ZGQt c3VwcGx5XG4iKTsKPj4gK8KgwqDCoMKgwqDCoMKgIHJldHVybiBQVFJfRVJSKHJ0Yy0+dmRkKTsK Pj4gK8KgwqDCoCB9Cj4+ICsKPj4gK8KgwqDCoCByZXQgPSByZWd1bGF0b3JfZW5hYmxlKHJ0Yy0+ dmRkKTsKPj4gK8KgwqDCoCBpZiAocmV0KSB7Cj4+ICvCoMKgwqDCoMKgwqDCoCBkZXZfZXJyKGRl diwgImZhaWxlZCB0byBlbmFibGUgdmRkLXN1cHBseVxuIik7Cj4+ICvCoMKgwqDCoMKgwqDCoCBy ZXR1cm4gcmV0Owo+PiArwqDCoMKgIH0KPj4gKwo+PiArwqDCoMKgIHJldCA9IG1lc29uX3J0Y193 cml0ZV9zdGF0aWMocnRjLCBNRVNPTl9TVEFUSUNfREVGQVVMVCk7Cj4+ICvCoMKgwqAgaWYgKHJl dCkgewo+PiArwqDCoMKgwqDCoMKgwqAgZGV2X2VycihkZXYsICJmYWlsZWQgdG8gc2V0IHN0YXRp YyB2YWx1ZXNcbiIpOwo+PiArwqDCoMKgwqDCoMKgwqAgZ290byBvdXRfZGlzYWJsZV92ZGQ7Cj4+ ICvCoMKgwqAgfQo+PiArCj4+ICvCoMKgwqAgcnRjLT5zZXJpYWwgPSBkZXZtX3JlZ21hcF9pbml0 KGRldiwgJm1lc29uX3J0Y19zZXJpYWxfYnVzLCBydGMsCj4+ICvCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCAmbWVzb25fcnRjX3NlcmlhbF9yZWdtYXBfY29uZmln KTsKPj4gK8KgwqDCoCBpZiAoSVNfRVJSKHJ0Yy0+c2VyaWFsKSkgewo+PiArwqDCoMKgwqDCoMKg wqAgZGV2X2VycihkZXYsICJmYWlsZWQgdG8gY3JlYXRlIHNlcmlhbCByZWdtYXBcbiIpOwo+PiAr wqDCoMKgwqDCoMKgwqAgcmV0ID0gUFRSX0VSUihydGMtPnNlcmlhbCk7Cj4+ICvCoMKgwqDCoMKg wqDCoCBnb3RvIG91dF9kaXNhYmxlX3ZkZDsKPj4gK8KgwqDCoCB9Cj4+ICsKPj4gK8KgwqDCoCAv Kgo+PiArwqDCoMKgwqAgKiBjaGVjayBpZiB3ZSBjYW4gcmVhZCBSVEMgY291bnRlciwgaWYgbm90 IHRoZW4gdGhlIFJUQyBpcyBwcm9iYWJseQo+PiArwqDCoMKgwqAgKiBub3QgZnVuY3Rpb25hbC4g SWYgaXQgaXNuJ3QgcHJvYmFibHkgYmVzdCB0byBub3QgYmluZC4KPj4gK8KgwqDCoMKgICovCj4+ ICvCoMKgwqAgcmV0ID0gcmVnbWFwX3JlYWQocnRjLT5zZXJpYWwsIFJUQ19DT1VOVEVSLCAmdG0p Owo+PiArwqDCoMKgIGlmIChyZXQpIHsKPj4gK8KgwqDCoMKgwqDCoMKgIGRldl9lcnIoZGV2LCAi Y2Fubm90IHJlYWQgUlRDIGNvdW50ZXIsIFJUQyBub3QgZnVuY3Rpb25hbFxuIik7Cj4+ICvCoMKg wqDCoMKgwqDCoCBnb3RvIG91dF9kaXNhYmxlX3ZkZDsKPj4gK8KgwqDCoCB9Cj4+ICsKPj4gK8Kg wqDCoCBtZXNvbl9ydGNfbnZtZW1fY29uZmlnLnByaXYgPSBydGM7Cj4+ICvCoMKgwqAgcmV0ID0g cnRjX252bWVtX3JlZ2lzdGVyKHJ0Yy0+cnRjLCAmbWVzb25fcnRjX252bWVtX2NvbmZpZyk7Cj4+ ICvCoMKgwqAgaWYgKHJldCkKPj4gK8KgwqDCoMKgwqDCoMKgIGdvdG8gb3V0X2Rpc2FibGVfdmRk Owo+PiArCj4+ICvCoMKgwqAgcmV0ID0gcnRjX3JlZ2lzdGVyX2RldmljZShydGMtPnJ0Yyk7Cj4+ ICvCoMKgwqAgaWYgKHJldCkKPj4gK8KgwqDCoMKgwqDCoMKgIGdvdG8gb3V0X3VucmVnaXN0ZXJf bnZtZW07Cj4+ICsKPj4gK8KgwqDCoCByZXR1cm4gMDsKPj4gKwo+PiArb3V0X3VucmVnaXN0ZXJf bnZtZW06Cj4+ICvCoMKgwqAgcnRjX252bWVtX3VucmVnaXN0ZXIocnRjLT5ydGMpOwo+PiArCj4+ ICtvdXRfZGlzYWJsZV92ZGQ6Cj4+ICvCoMKgwqAgcmVndWxhdG9yX2Rpc2FibGUocnRjLT52ZGQp Owo+PiArwqDCoMKgIHJldHVybiByZXQ7Cj4+ICt9Cj4+ICsKPj4gK3N0YXRpYyBjb25zdCBzdHJ1 Y3Qgb2ZfZGV2aWNlX2lkIG1lc29uX3J0Y19kdF9tYXRjaFtdID0gewo+PiArwqDCoMKgIHsgLmNv bXBhdGlibGUgPSAiYW1sb2dpYyxtZXNvbjYtcnRjIiwgfSwKPj4gK8KgwqDCoCB7IC5jb21wYXRp YmxlID0gImFtbG9naWMsbWVzb244LXJ0YyIsIH0sCj4+ICvCoMKgwqAgeyAuY29tcGF0aWJsZSA9 ICJhbWxvZ2ljLG1lc29uOGItcnRjIiwgfSwKPj4gK8KgwqDCoCB7IC5jb21wYXRpYmxlID0gImFt bG9naWMsbWVzb244bTItcnRjIiwgfSwKPj4gK8KgwqDCoCB7IH0sCj4+ICt9Owo+PiArTU9EVUxF X0RFVklDRV9UQUJMRShvZiwgbWVzb25fcnRjX2R0X21hdGNoKTsKPj4gKwo+PiArc3RhdGljIHN0 cnVjdCBwbGF0Zm9ybV9kcml2ZXIgbWVzb25fcnRjX2RyaXZlciA9IHsKPj4gK8KgwqDCoCAucHJv YmXCoMKgwqDCoMKgwqDCoCA9IG1lc29uX3J0Y19wcm9iZSwKPj4gK8KgwqDCoCAuZHJpdmVywqDC oMKgwqDCoMKgwqAgPSB7Cj4+ICvCoMKgwqDCoMKgwqDCoCAubmFtZcKgwqDCoCA9ICJtZXNvbi1y dGMiLAo+PiArwqDCoMKgwqDCoMKgwqAgLm9mX21hdGNoX3RhYmxlwqDCoMKgID0gb2ZfbWF0Y2hf cHRyKG1lc29uX3J0Y19kdF9tYXRjaCksCj4+ICvCoMKgwqAgfSwKPj4gK307Cj4+ICttb2R1bGVf cGxhdGZvcm1fZHJpdmVyKG1lc29uX3J0Y19kcml2ZXIpOwo+PiArCj4+ICtNT0RVTEVfREVTQ1JJ UFRJT04oIkFtbG9naWMgTWVzb24gUlRDIERyaXZlciIpOwo+PiArTU9EVUxFX0FVVEhPUigiQmVu IERvb2tzIDxiZW4uZG9vc2tAY29kZXRoaW5rLmNvLnVrPiIpOwo+PiArTU9EVUxFX0FVVEhPUigi TWFydGluIEJsdW1lbnN0aW5nbCA8bWFydGluLmJsdW1lbnN0aW5nbEBnb29nbGVtYWlsLmNvbT4i KTsKPj4gK01PRFVMRV9MSUNFTlNFKCJHUEwgdjIiKTsKPj4gK01PRFVMRV9BTElBUygicGxhdGZv cm06bWVzb24tcnRjIik7Cj4+Cj4gCj4gCgoKX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fX18KbGludXgtYW1sb2dpYyBtYWlsaW5nIGxpc3QKbGludXgtYW1sb2dp Y0BsaXN0cy5pbmZyYWRlYWQub3JnCmh0dHA6Ly9saXN0cy5pbmZyYWRlYWQub3JnL21haWxtYW4v bGlzdGluZm8vbGludXgtYW1sb2dpYwo=