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=-16.8 required=3.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_CR_TRAILER,INCLUDES_PATCH, MAILING_LIST_MULTI,SPF_HELO_NONE,SPF_PASS,URIBL_BLOCKED,USER_AGENT_GIT autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id EF2C4C433ED for ; Tue, 11 May 2021 22:01:26 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id AF12F6162A for ; Tue, 11 May 2021 22:01:26 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S229637AbhEKWCd (ORCPT ); Tue, 11 May 2021 18:02:33 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:38658 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S230137AbhEKWCc (ORCPT ); Tue, 11 May 2021 18:02:32 -0400 Received: from mail-ej1-x62b.google.com (mail-ej1-x62b.google.com [IPv6:2a00:1450:4864:20::62b]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 94708C06174A for ; Tue, 11 May 2021 15:01:25 -0700 (PDT) Received: by mail-ej1-x62b.google.com with SMTP id k10so767073ejj.8 for ; Tue, 11 May 2021 15:01:25 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=prusa3d-cz.20150623.gappssmtp.com; s=20150623; h=from:to:cc:subject:date:message-id:mime-version :content-transfer-encoding; bh=aGJjejPNA5+HMTFCgCKvKscy9gIyFJ9LNB8FwA+a0eA=; b=lSYYG5TkeMPH6yJvWJfv6HkQ78/unirOq5GkK1zRHwqVqPDT1neDhZnEwhB3aIk1WN ccSD5cT+lC9MuEbKJvxyJSiZG0XGxdRr1Gk9sL0DPWPpiYYf/x21zwjtBCfvjyJWr5Uy 0cPkthWelSPwkEFznsl4O4mgMAlAbS1dFm8l0Nq17xaK1ejlSu+fylpKJs8TqdaNv4kq wYlWN5Qd7DJRW1DC2Q/rKS3/HOZacFhbE1A6INPAZtVSQ8mxFlqS6JCJneNRFLnn7paO TTjIcbKt5Cmr6gYBNAU/4iY1bgJlSE1pieqQ5bxhZhHyqZoqJVWg/Thoe4dUD5LTqaDJ Ry4w== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:mime-version :content-transfer-encoding; bh=aGJjejPNA5+HMTFCgCKvKscy9gIyFJ9LNB8FwA+a0eA=; b=gCKVOotxTUvpAnwQ6/yKJjKJS3jRcMQPNEm+j6ERPWcyQMRp8hIGzBht0EoS/GIeTX CWMn+5ni8+F9vsYC3TSG/eL53W2Z6nqtU+gcLfeE3QI2opRmAgNJJJK7C5ZROO9L+WZn wgQcJo+4zxtabrHNGJCkK4R3X3hcmU2F9llO6fRbgVcMaE+i+qRHSDBx3A/yNgNNM4/v i3wI+Hm/oppi19le2ucgtmSZGMqkNqPQVyLhf8nyiwwreR7Yfowttr9buPqxKbvZuCLy Bce71UIMkK0GHWb8emONXQ9FF+5dfecbgCQv/4wvIu3xy47DyRw+y6cb1iGc9bnr1fJQ nDDw== X-Gm-Message-State: AOAM533SF8sA7nCRp0DXjWWjnoO5W5golK2E1WlD4wjiwNG8jHhh0Wlb 8of3K+TO0B0Cnu/kCI+piBcDYw== X-Google-Smtp-Source: ABdhPJwQDxOCJUSPBVJxUM2UQdm7il6zg5MtuKvXHXR16O7cx/bB48W1ka2HDs4n20LYkpslpNYh9g== X-Received: by 2002:a17:906:564f:: with SMTP id v15mr33165529ejr.96.1620770484363; Tue, 11 May 2021 15:01:24 -0700 (PDT) Received: from zen.local (ip-89-102-194-33.net.upcbroadband.cz. [89.102.194.33]) by smtp.gmail.com with ESMTPSA id r17sm15583636edo.48.2021.05.11.15.01.23 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 11 May 2021 15:01:23 -0700 (PDT) From: Roman Beranek X-Google-Original-From: Roman Beranek To: =?UTF-8?q?Uwe=20Kleine-K=C3=B6nig?= Cc: Thierry Reding , Lee Jones , Maxime Ripard , Chen-Yu Tsai , Jernej Skrabec , linux-pwm@vger.kernel.org, linux-arm-kernel@lists.infradead.org, linux-sunxi@lists.linux.dev, linux-sunxi@googlegroups.com, Roman Beranek Subject: [PATCH] pwm: sun4i: Avoid waiting until the next period Date: Wed, 12 May 2021 00:00:14 +0200 Message-Id: <20210511220014.1945519-1-roman.beranek@prusa3d.com> X-Mailer: git-send-email 2.31.1 MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit Precedence: bulk List-ID: X-Mailing-List: linux-pwm@vger.kernel.org As disabling PWM by clearing the PWM_EN bit doesn't take an effect until the last pulse cycle ends, gating the clock too soon may result in the output signal getting stuck in an active state. Although the code gives an appearance that it takes care of this particular problem by waiting for the next period before finally clearing the CLK_GATING and EN bits, unless the EN bit has already been cleared by the time the delay begins, this measure doesn't achieve anything. However, even if this detail were to be fixed, there would still remain another issue to deal with: if the PWM were to be disabled shortly after having its period shortened, the length of the delay might turn out insufficient. So instead of waiting for the moment when it becomes safe to gate the clock, let's not bother gating it in the first place. Signed-off-by: Roman Beranek Suggested-by: Uwe Kleine-König --- drivers/pwm/pwm-sun4i.c | 52 +++++++++++------------------------------ 1 file changed, 13 insertions(+), 39 deletions(-) diff --git a/drivers/pwm/pwm-sun4i.c b/drivers/pwm/pwm-sun4i.c index e01becd10..809163186 100644 --- a/drivers/pwm/pwm-sun4i.c +++ b/drivers/pwm/pwm-sun4i.c @@ -89,7 +89,6 @@ struct sun4i_pwm_chip { void __iomem *base; spinlock_t ctrl_lock; const struct sun4i_pwm_data *data; - unsigned long next_period[2]; }; static inline struct sun4i_pwm_chip *to_sun4i_pwm_chip(struct pwm_chip *chip) @@ -235,26 +234,15 @@ static int sun4i_pwm_apply(struct pwm_chip *chip, struct pwm_device *pwm, struct pwm_state cstate; u32 ctrl, duty = 0, period = 0, val; int ret; - unsigned int delay_us, prescaler = 0; - unsigned long now; + unsigned int prescaler = 0; bool bypass; pwm_get_state(pwm, &cstate); - if (!cstate.enabled) { - ret = clk_prepare_enable(sun4i_pwm->clk); - if (ret) { - dev_err(chip->dev, "failed to enable PWM clock\n"); - return ret; - } - } - ret = sun4i_pwm_calculate(sun4i_pwm, state, &duty, &period, &prescaler, &bypass); if (ret) { dev_err(chip->dev, "period exceeds the maximum value\n"); - if (!cstate.enabled) - clk_disable_unprepare(sun4i_pwm->clk); return ret; } @@ -284,8 +272,6 @@ static int sun4i_pwm_apply(struct pwm_chip *chip, struct pwm_device *pwm, val = (duty & PWM_DTY_MASK) | PWM_PRD(period); sun4i_pwm_writel(sun4i_pwm, val, PWM_CH_PRD(pwm->hwpwm)); - sun4i_pwm->next_period[pwm->hwpwm] = jiffies + - nsecs_to_jiffies(cstate.period + 1000); if (state->polarity != PWM_POLARITY_NORMAL) ctrl &= ~BIT_CH(PWM_ACT_STATE, pwm->hwpwm); @@ -296,34 +282,12 @@ static int sun4i_pwm_apply(struct pwm_chip *chip, struct pwm_device *pwm, if (state->enabled) ctrl |= BIT_CH(PWM_EN, pwm->hwpwm); + else + ctrl &= ~BIT_CH(PWM_EN, pwm->hwpwm); sun4i_pwm_writel(sun4i_pwm, ctrl, PWM_CTRL_REG); - - spin_unlock(&sun4i_pwm->ctrl_lock); - - if (state->enabled) - return 0; - - /* We need a full period to elapse before disabling the channel. */ - now = jiffies; - if (time_before(now, sun4i_pwm->next_period[pwm->hwpwm])) { - delay_us = jiffies_to_usecs(sun4i_pwm->next_period[pwm->hwpwm] - - now); - if ((delay_us / 500) > MAX_UDELAY_MS) - msleep(delay_us / 1000 + 1); - else - usleep_range(delay_us, delay_us * 2); - } - - spin_lock(&sun4i_pwm->ctrl_lock); - ctrl = sun4i_pwm_readl(sun4i_pwm, PWM_CTRL_REG); - ctrl &= ~BIT_CH(PWM_CLK_GATING, pwm->hwpwm); - ctrl &= ~BIT_CH(PWM_EN, pwm->hwpwm); - sun4i_pwm_writel(sun4i_pwm, ctrl, PWM_CTRL_REG); spin_unlock(&sun4i_pwm->ctrl_lock); - clk_disable_unprepare(sun4i_pwm->clk); - return 0; } @@ -457,6 +421,13 @@ static int sun4i_pwm_probe(struct platform_device *pdev) goto err_bus; } + ret = clk_prepare_enable(pwm->clk); + if (ret) { + dev_err(&pdev->dev, "failed to prepare and enable PWM clock %pe\n", + ERR_PTR(ret)); + goto err_clk; + } + pwm->chip.dev = &pdev->dev; pwm->chip.ops = &sun4i_pwm_ops; pwm->chip.npwm = pwm->data->npwm; @@ -476,6 +447,8 @@ static int sun4i_pwm_probe(struct platform_device *pdev) return 0; err_pwm_add: + clk_disable_unprepare(pwm->clk); +err_clk: clk_disable_unprepare(pwm->bus_clk); err_bus: reset_control_assert(pwm->rst); @@ -492,6 +465,7 @@ static int sun4i_pwm_remove(struct platform_device *pdev) if (ret) return ret; + clk_disable_unprepare(pwm->clk); clk_disable_unprepare(pwm->bus_clk); reset_control_assert(pwm->rst); -- 2.31.1 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=-17.4 required=3.0 tests=BAYES_00,DKIMWL_WL_HIGH, DKIM_SIGNED,DKIM_VALID,HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_CR_TRAILER, INCLUDES_PATCH,MAILING_LIST_MULTI,SPF_HELO_NONE,SPF_PASS,URIBL_BLOCKED, USER_AGENT_GIT autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 2FF1EC433B4 for ; Tue, 11 May 2021 22:03:35 +0000 (UTC) Received: from desiato.infradead.org (desiato.infradead.org [90.155.92.199]) (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 7FD486162A for ; Tue, 11 May 2021 22:03:34 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 7FD486162A Authentication-Results: mail.kernel.org; dmarc=none (p=none dis=none) header.from=prusa3d.cz Authentication-Results: mail.kernel.org; spf=none smtp.mailfrom=linux-arm-kernel-bounces+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=desiato.20200630; h=Sender:Content-Transfer-Encoding :Content-Type:List-Subscribe:List-Help:List-Post:List-Archive: List-Unsubscribe:List-Id:MIME-Version:Message-Id:Date:Subject:Cc:To:From: Reply-To:Content-ID:Content-Description:Resent-Date:Resent-From:Resent-Sender :Resent-To:Resent-Cc:Resent-Message-ID:In-Reply-To:References:List-Owner; bh=yByC+ChDEuHwUQDMWmQj8O7ykN0Q20EFAuYhwwa1f1I=; b=cFze6/GPMPnZ2yaKwxuDHDCE1s lsPNeGJmYRgY6FQQJOfdpBjScdQ8Ex48fgKGAyG18D3VzyA+n4cB2E5/1LGYpc8wz4NnsTLnivPhT hn2Vgno9fldI/1GBXWVV/5WxGwDy+vzIhKJk+YiHgteLnsAoKRcnk5bc5jHnpVU9/A0YHnbUVoAEv zOnSc8mW6EIbXdBJDOiY6YPwT8SHwacJnfh7ODn6eYCl/Aqi1XQUIy8Hf9h/2CgBmrttHwWRwp9lE pvdm8rndCaHL9wPB2zynx57PpoN+GYddgQNvBPY7t3t1Gtv+p3Czb9lH8jDMPy0Eo8FFA7EvX+i5A 1Mz8LPCg==; Received: from localhost ([::1] helo=desiato.infradead.org) by desiato.infradead.org with esmtp (Exim 4.94 #2 (Red Hat Linux)) id 1lgaRd-001Nyc-Ri; Tue, 11 May 2021 22:01:38 +0000 Received: from bombadil.infradead.org ([2607:7c80:54:e::133]) by desiato.infradead.org with esmtps (Exim 4.94 #2 (Red Hat Linux)) id 1lgaRZ-001NyF-Uj for linux-arm-kernel@desiato.infradead.org; Tue, 11 May 2021 22:01:34 +0000 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=infradead.org; s=bombadil.20210309; h=Content-Transfer-Encoding: Content-Type:MIME-Version:Message-Id:Date:Subject:Cc:To:From:Sender:Reply-To: Content-ID:Content-Description:In-Reply-To:References; bh=aGJjejPNA5+HMTFCgCKvKscy9gIyFJ9LNB8FwA+a0eA=; b=t/rcA376W6nA+3vmUopZRc/g1P wwbAwT9mX6E1ZnsKsDV+FYt3UFL+imC8wk3Z1O1rXPq4+EqkdutgE+euQnMlohqh7k3c1TaJ8hird OVyic281FzB53CPyNHLKXuTPkSXVYziu7ziDpypfLfXeARe/Nymx9HUpLAGqXsKcBkKBK/YerigdG BJqoSAlsTEn/DNzs3O0uDSzYRoVJwQFiIM1xCPfVt9uK5AFvq4OaLNa2xrTCi6IhzabHJL8cE9Wsm GGgVfzXurKAjc2ucttDsAmUk92l21MoryURfhDAKgMXyQWmH29MWgcUpg3YQ5oejtQ0dyPY9D+jwR t8vBHnyQ==; Received: from mail-ej1-x630.google.com ([2a00:1450:4864:20::630]) by bombadil.infradead.org with esmtps (Exim 4.94 #2 (Red Hat Linux)) id 1lgaRW-009wUz-MC for linux-arm-kernel@lists.infradead.org; Tue, 11 May 2021 22:01:32 +0000 Received: by mail-ej1-x630.google.com with SMTP id t4so32064246ejo.0 for ; Tue, 11 May 2021 15:01:25 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=prusa3d-cz.20150623.gappssmtp.com; s=20150623; h=from:to:cc:subject:date:message-id:mime-version :content-transfer-encoding; bh=aGJjejPNA5+HMTFCgCKvKscy9gIyFJ9LNB8FwA+a0eA=; b=lSYYG5TkeMPH6yJvWJfv6HkQ78/unirOq5GkK1zRHwqVqPDT1neDhZnEwhB3aIk1WN ccSD5cT+lC9MuEbKJvxyJSiZG0XGxdRr1Gk9sL0DPWPpiYYf/x21zwjtBCfvjyJWr5Uy 0cPkthWelSPwkEFznsl4O4mgMAlAbS1dFm8l0Nq17xaK1ejlSu+fylpKJs8TqdaNv4kq wYlWN5Qd7DJRW1DC2Q/rKS3/HOZacFhbE1A6INPAZtVSQ8mxFlqS6JCJneNRFLnn7paO TTjIcbKt5Cmr6gYBNAU/4iY1bgJlSE1pieqQ5bxhZhHyqZoqJVWg/Thoe4dUD5LTqaDJ Ry4w== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:mime-version :content-transfer-encoding; bh=aGJjejPNA5+HMTFCgCKvKscy9gIyFJ9LNB8FwA+a0eA=; b=SaB4nig5afOWv72L7P/YA6FTX9k7E9aG1+8IKc7lJultlBFVBvdmlp0f7PmOhA5KA7 /hhh74UXCKJIP+4q+JonBpPX8wjsj1QUxAMX8ROsdg7fhADan+L8JGdChTnuNzJCANhe pCJSfkY36nEb4Zd576cTSumgYKNaAwbLXs+tJID8yLqtA2IxF+AWN2cgsXtJfldJ0qtB e/rDl3OZWalRtrfTQBWiIeYIytJRTGjn/8SsRLlm5/9JdcfdBTWXF0PYU+NZ7BdHtmTq B7oDHpjjSY4dT+rteg1XOPP9d9kzQk4W7KhwIm+AciWUvgGK9ZeqTd8ZoEcDiLo1CECt mXsQ== X-Gm-Message-State: AOAM533WwS9tFTYkJ+PVvWpsF1/3pQ1os6m8ND7Lt3G/ST6AjYqiT8Vu RXifvNsZRixyo9J22xYRpwtrsQ== X-Google-Smtp-Source: ABdhPJwQDxOCJUSPBVJxUM2UQdm7il6zg5MtuKvXHXR16O7cx/bB48W1ka2HDs4n20LYkpslpNYh9g== X-Received: by 2002:a17:906:564f:: with SMTP id v15mr33165529ejr.96.1620770484363; Tue, 11 May 2021 15:01:24 -0700 (PDT) Received: from zen.local (ip-89-102-194-33.net.upcbroadband.cz. [89.102.194.33]) by smtp.gmail.com with ESMTPSA id r17sm15583636edo.48.2021.05.11.15.01.23 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 11 May 2021 15:01:23 -0700 (PDT) From: Roman Beranek X-Google-Original-From: Roman Beranek To: =?UTF-8?q?Uwe=20Kleine-K=C3=B6nig?= Cc: Thierry Reding , Lee Jones , Maxime Ripard , Chen-Yu Tsai , Jernej Skrabec , linux-pwm@vger.kernel.org, linux-arm-kernel@lists.infradead.org, linux-sunxi@lists.linux.dev, linux-sunxi@googlegroups.com, Roman Beranek Subject: [PATCH] pwm: sun4i: Avoid waiting until the next period Date: Wed, 12 May 2021 00:00:14 +0200 Message-Id: <20210511220014.1945519-1-roman.beranek@prusa3d.com> X-Mailer: git-send-email 2.31.1 MIME-Version: 1.0 X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20210511_150130_818107_C912C841 X-CRM114-Status: GOOD ( 19.02 ) X-BeenThere: linux-arm-kernel@lists.infradead.org X-Mailman-Version: 2.1.34 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Sender: "linux-arm-kernel" Errors-To: linux-arm-kernel-bounces+linux-arm-kernel=archiver.kernel.org@lists.infradead.org QXMgZGlzYWJsaW5nIFBXTSBieSBjbGVhcmluZyB0aGUgUFdNX0VOIGJpdCBkb2Vzbid0IHRha2Ug YW4gZWZmZWN0IHVudGlsCnRoZSBsYXN0IHB1bHNlIGN5Y2xlIGVuZHMsIGdhdGluZyB0aGUgY2xv Y2sgdG9vIHNvb24gbWF5IHJlc3VsdCBpbiB0aGUKb3V0cHV0IHNpZ25hbCBnZXR0aW5nIHN0dWNr IGluIGFuIGFjdGl2ZSBzdGF0ZS4gQWx0aG91Z2ggdGhlIGNvZGUgZ2l2ZXMKYW4gYXBwZWFyYW5j ZSB0aGF0IGl0IHRha2VzIGNhcmUgb2YgdGhpcyBwYXJ0aWN1bGFyIHByb2JsZW0gYnkgd2FpdGlu Zwpmb3IgdGhlIG5leHQgcGVyaW9kIGJlZm9yZSBmaW5hbGx5IGNsZWFyaW5nIHRoZSBDTEtfR0FU SU5HIGFuZCBFTiBiaXRzLAp1bmxlc3MgdGhlIEVOIGJpdCBoYXMgYWxyZWFkeSBiZWVuIGNsZWFy ZWQgYnkgdGhlIHRpbWUgdGhlIGRlbGF5IGJlZ2lucywKdGhpcyBtZWFzdXJlIGRvZXNuJ3QgYWNo aWV2ZSBhbnl0aGluZy4KCkhvd2V2ZXIsIGV2ZW4gaWYgdGhpcyBkZXRhaWwgd2VyZSB0byBiZSBm aXhlZCwgdGhlcmUgd291bGQgc3RpbGwgcmVtYWluCmFub3RoZXIgaXNzdWUgdG8gZGVhbCB3aXRo OiBpZiB0aGUgUFdNIHdlcmUgdG8gYmUgZGlzYWJsZWQgc2hvcnRseSBhZnRlcgpoYXZpbmcgaXRz IHBlcmlvZCBzaG9ydGVuZWQsIHRoZSBsZW5ndGggb2YgdGhlIGRlbGF5IG1pZ2h0IHR1cm4gb3V0 Cmluc3VmZmljaWVudC4gU28gaW5zdGVhZCBvZiB3YWl0aW5nIGZvciB0aGUgbW9tZW50IHdoZW4g aXQgYmVjb21lcyBzYWZlCnRvIGdhdGUgdGhlIGNsb2NrLCBsZXQncyBub3QgYm90aGVyIGdhdGlu ZyBpdCBpbiB0aGUgZmlyc3QgcGxhY2UuCgpTaWduZWQtb2ZmLWJ5OiBSb21hbiBCZXJhbmVrIDxy b21hbi5iZXJhbmVrQHBydXNhM2QuY29tPgpTdWdnZXN0ZWQtYnk6IFV3ZSBLbGVpbmUtS8O2bmln IDx1LmtsZWluZS1rb2VuaWdAcGVuZ3V0cm9uaXguZGU+Ci0tLQogZHJpdmVycy9wd20vcHdtLXN1 bjRpLmMgfCA1MiArKysrKysrKysrKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogMSBm aWxlIGNoYW5nZWQsIDEzIGluc2VydGlvbnMoKyksIDM5IGRlbGV0aW9ucygtKQoKZGlmZiAtLWdp dCBhL2RyaXZlcnMvcHdtL3B3bS1zdW40aS5jIGIvZHJpdmVycy9wd20vcHdtLXN1bjRpLmMKaW5k ZXggZTAxYmVjZDEwLi44MDkxNjMxODYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcHdtL3B3bS1zdW40 aS5jCisrKyBiL2RyaXZlcnMvcHdtL3B3bS1zdW40aS5jCkBAIC04OSw3ICs4OSw2IEBAIHN0cnVj dCBzdW40aV9wd21fY2hpcCB7CiAJdm9pZCBfX2lvbWVtICpiYXNlOwogCXNwaW5sb2NrX3QgY3Ry bF9sb2NrOwogCWNvbnN0IHN0cnVjdCBzdW40aV9wd21fZGF0YSAqZGF0YTsKLQl1bnNpZ25lZCBs b25nIG5leHRfcGVyaW9kWzJdOwogfTsKIAogc3RhdGljIGlubGluZSBzdHJ1Y3Qgc3VuNGlfcHdt X2NoaXAgKnRvX3N1bjRpX3B3bV9jaGlwKHN0cnVjdCBwd21fY2hpcCAqY2hpcCkKQEAgLTIzNSwy NiArMjM0LDE1IEBAIHN0YXRpYyBpbnQgc3VuNGlfcHdtX2FwcGx5KHN0cnVjdCBwd21fY2hpcCAq Y2hpcCwgc3RydWN0IHB3bV9kZXZpY2UgKnB3bSwKIAlzdHJ1Y3QgcHdtX3N0YXRlIGNzdGF0ZTsK IAl1MzIgY3RybCwgZHV0eSA9IDAsIHBlcmlvZCA9IDAsIHZhbDsKIAlpbnQgcmV0OwotCXVuc2ln bmVkIGludCBkZWxheV91cywgcHJlc2NhbGVyID0gMDsKLQl1bnNpZ25lZCBsb25nIG5vdzsKKwl1 bnNpZ25lZCBpbnQgcHJlc2NhbGVyID0gMDsKIAlib29sIGJ5cGFzczsKIAogCXB3bV9nZXRfc3Rh dGUocHdtLCAmY3N0YXRlKTsKIAotCWlmICghY3N0YXRlLmVuYWJsZWQpIHsKLQkJcmV0ID0gY2xr X3ByZXBhcmVfZW5hYmxlKHN1bjRpX3B3bS0+Y2xrKTsKLQkJaWYgKHJldCkgewotCQkJZGV2X2Vy cihjaGlwLT5kZXYsICJmYWlsZWQgdG8gZW5hYmxlIFBXTSBjbG9ja1xuIik7Ci0JCQlyZXR1cm4g cmV0OwotCQl9Ci0JfQotCiAJcmV0ID0gc3VuNGlfcHdtX2NhbGN1bGF0ZShzdW40aV9wd20sIHN0 YXRlLCAmZHV0eSwgJnBlcmlvZCwgJnByZXNjYWxlciwKIAkJCQkgICZieXBhc3MpOwogCWlmIChy ZXQpIHsKIAkJZGV2X2VycihjaGlwLT5kZXYsICJwZXJpb2QgZXhjZWVkcyB0aGUgbWF4aW11bSB2 YWx1ZVxuIik7Ci0JCWlmICghY3N0YXRlLmVuYWJsZWQpCi0JCQljbGtfZGlzYWJsZV91bnByZXBh cmUoc3VuNGlfcHdtLT5jbGspOwogCQlyZXR1cm4gcmV0OwogCX0KIApAQCAtMjg0LDggKzI3Miw2 IEBAIHN0YXRpYyBpbnQgc3VuNGlfcHdtX2FwcGx5KHN0cnVjdCBwd21fY2hpcCAqY2hpcCwgc3Ry dWN0IHB3bV9kZXZpY2UgKnB3bSwKIAogCXZhbCA9IChkdXR5ICYgUFdNX0RUWV9NQVNLKSB8IFBX TV9QUkQocGVyaW9kKTsKIAlzdW40aV9wd21fd3JpdGVsKHN1bjRpX3B3bSwgdmFsLCBQV01fQ0hf UFJEKHB3bS0+aHdwd20pKTsKLQlzdW40aV9wd20tPm5leHRfcGVyaW9kW3B3bS0+aHdwd21dID0g amlmZmllcyArCi0JCW5zZWNzX3RvX2ppZmZpZXMoY3N0YXRlLnBlcmlvZCArIDEwMDApOwogCiAJ aWYgKHN0YXRlLT5wb2xhcml0eSAhPSBQV01fUE9MQVJJVFlfTk9STUFMKQogCQljdHJsICY9IH5C SVRfQ0goUFdNX0FDVF9TVEFURSwgcHdtLT5od3B3bSk7CkBAIC0yOTYsMzQgKzI4MiwxMiBAQCBz dGF0aWMgaW50IHN1bjRpX3B3bV9hcHBseShzdHJ1Y3QgcHdtX2NoaXAgKmNoaXAsIHN0cnVjdCBw d21fZGV2aWNlICpwd20sCiAKIAlpZiAoc3RhdGUtPmVuYWJsZWQpCiAJCWN0cmwgfD0gQklUX0NI KFBXTV9FTiwgcHdtLT5od3B3bSk7CisJZWxzZQorCQljdHJsICY9IH5CSVRfQ0goUFdNX0VOLCBw d20tPmh3cHdtKTsKIAogCXN1bjRpX3B3bV93cml0ZWwoc3VuNGlfcHdtLCBjdHJsLCBQV01fQ1RS TF9SRUcpOwotCi0Jc3Bpbl91bmxvY2soJnN1bjRpX3B3bS0+Y3RybF9sb2NrKTsKLQotCWlmIChz dGF0ZS0+ZW5hYmxlZCkKLQkJcmV0dXJuIDA7Ci0KLQkvKiBXZSBuZWVkIGEgZnVsbCBwZXJpb2Qg dG8gZWxhcHNlIGJlZm9yZSBkaXNhYmxpbmcgdGhlIGNoYW5uZWwuICovCi0Jbm93ID0gamlmZmll czsKLQlpZiAodGltZV9iZWZvcmUobm93LCBzdW40aV9wd20tPm5leHRfcGVyaW9kW3B3bS0+aHdw d21dKSkgewotCQlkZWxheV91cyA9IGppZmZpZXNfdG9fdXNlY3Moc3VuNGlfcHdtLT5uZXh0X3Bl cmlvZFtwd20tPmh3cHdtXSAtCi0JCQkJCSAgIG5vdyk7Ci0JCWlmICgoZGVsYXlfdXMgLyA1MDAp ID4gTUFYX1VERUxBWV9NUykKLQkJCW1zbGVlcChkZWxheV91cyAvIDEwMDAgKyAxKTsKLQkJZWxz ZQotCQkJdXNsZWVwX3JhbmdlKGRlbGF5X3VzLCBkZWxheV91cyAqIDIpOwotCX0KLQotCXNwaW5f bG9jaygmc3VuNGlfcHdtLT5jdHJsX2xvY2spOwotCWN0cmwgPSBzdW40aV9wd21fcmVhZGwoc3Vu NGlfcHdtLCBQV01fQ1RSTF9SRUcpOwotCWN0cmwgJj0gfkJJVF9DSChQV01fQ0xLX0dBVElORywg cHdtLT5od3B3bSk7Ci0JY3RybCAmPSB+QklUX0NIKFBXTV9FTiwgcHdtLT5od3B3bSk7Ci0Jc3Vu NGlfcHdtX3dyaXRlbChzdW40aV9wd20sIGN0cmwsIFBXTV9DVFJMX1JFRyk7CiAJc3Bpbl91bmxv Y2soJnN1bjRpX3B3bS0+Y3RybF9sb2NrKTsKIAotCWNsa19kaXNhYmxlX3VucHJlcGFyZShzdW40 aV9wd20tPmNsayk7Ci0KIAlyZXR1cm4gMDsKIH0KIApAQCAtNDU3LDYgKzQyMSwxMyBAQCBzdGF0 aWMgaW50IHN1bjRpX3B3bV9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQogCQln b3RvIGVycl9idXM7CiAJfQogCisJcmV0ID0gY2xrX3ByZXBhcmVfZW5hYmxlKHB3bS0+Y2xrKTsK KwlpZiAocmV0KSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgImZhaWxlZCB0byBwcmVwYXJlIGFu ZCBlbmFibGUgUFdNIGNsb2NrICVwZVxuIiwKKwkJCUVSUl9QVFIocmV0KSk7CisJCWdvdG8gZXJy X2NsazsKKwl9CisKIAlwd20tPmNoaXAuZGV2ID0gJnBkZXYtPmRldjsKIAlwd20tPmNoaXAub3Bz ID0gJnN1bjRpX3B3bV9vcHM7CiAJcHdtLT5jaGlwLm5wd20gPSBwd20tPmRhdGEtPm5wd207CkBA IC00NzYsNiArNDQ3LDggQEAgc3RhdGljIGludCBzdW40aV9wd21fcHJvYmUoc3RydWN0IHBsYXRm b3JtX2RldmljZSAqcGRldikKIAlyZXR1cm4gMDsKIAogZXJyX3B3bV9hZGQ6CisJY2xrX2Rpc2Fi bGVfdW5wcmVwYXJlKHB3bS0+Y2xrKTsKK2Vycl9jbGs6CiAJY2xrX2Rpc2FibGVfdW5wcmVwYXJl KHB3bS0+YnVzX2Nsayk7CiBlcnJfYnVzOgogCXJlc2V0X2NvbnRyb2xfYXNzZXJ0KHB3bS0+cnN0 KTsKQEAgLTQ5Miw2ICs0NjUsNyBAQCBzdGF0aWMgaW50IHN1bjRpX3B3bV9yZW1vdmUoc3RydWN0 IHBsYXRmb3JtX2RldmljZSAqcGRldikKIAlpZiAocmV0KQogCQlyZXR1cm4gcmV0OwogCisJY2xr X2Rpc2FibGVfdW5wcmVwYXJlKHB3bS0+Y2xrKTsKIAljbGtfZGlzYWJsZV91bnByZXBhcmUocHdt LT5idXNfY2xrKTsKIAlyZXNldF9jb250cm9sX2Fzc2VydChwd20tPnJzdCk7CiAKLS0gCjIuMzEu MQoKCl9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCmxpbnV4 LWFybS1rZXJuZWwgbWFpbGluZyBsaXN0CmxpbnV4LWFybS1rZXJuZWxAbGlzdHMuaW5mcmFkZWFk Lm9yZwpodHRwOi8vbGlzdHMuaW5mcmFkZWFkLm9yZy9tYWlsbWFuL2xpc3RpbmZvL2xpbnV4LWFy bS1rZXJuZWwK