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 Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id A8CD4C43217 for ; Wed, 2 Nov 2022 08:36:18 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S230256AbiKBIgR (ORCPT ); Wed, 2 Nov 2022 04:36:17 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:43474 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S230210AbiKBIgR (ORCPT ); Wed, 2 Nov 2022 04:36:17 -0400 Received: from twspam01.aspeedtech.com (twspam01.aspeedtech.com [211.20.114.71]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id C0EDB60F1; Wed, 2 Nov 2022 01:36:15 -0700 (PDT) Received: from mail.aspeedtech.com ([192.168.0.24]) by twspam01.aspeedtech.com with ESMTP id 2A28BAHv072663; Wed, 2 Nov 2022 16:11:11 +0800 (GMT-8) (envelope-from billy_tsai@aspeedtech.com) Received: from BillyTsai-pc.aspeed.com (192.168.2.149) by TWMBX02.aspeed.com (192.168.0.24) with Microsoft SMTP Server (TLS) id 15.0.1497.2; Wed, 2 Nov 2022 16:34:24 +0800 From: Billy Tsai To: , , , , , , , , , , , , , , , , , CC: kernel test robot Subject: [v3 2/3] pwm: Add Aspeed ast2600 PWM support Date: Wed, 2 Nov 2022 16:36:00 +0800 Message-ID: <20221102083601.10456-3-billy_tsai@aspeedtech.com> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20221102083601.10456-1-billy_tsai@aspeedtech.com> References: <20221102083601.10456-1-billy_tsai@aspeedtech.com> MIME-Version: 1.0 Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: 8bit X-Originating-IP: [192.168.2.149] X-ClientProxiedBy: TWMBX02.aspeed.com (192.168.0.24) To TWMBX02.aspeed.com (192.168.0.24) X-DNSRBL: X-MAIL: twspam01.aspeedtech.com 2A28BAHv072663 Precedence: bulk List-ID: X-Mailing-List: linux-hwmon@vger.kernel.org This patch add the support of PWM controller which can be found at aspeed ast2600 soc. The pwm supoorts up to 16 channels and it's part function of multi-function device "pwm-tach controller". Signed-off-by: Billy Tsai Reviewed-by: Uwe Kleine-König Reported-by: kernel test robot --- drivers/pwm/Kconfig | 10 + drivers/pwm/Makefile | 1 + drivers/pwm/pwm-aspeed-ast2600.c | 319 +++++++++++++++++++++++++++++++ 3 files changed, 330 insertions(+) create mode 100644 drivers/pwm/pwm-aspeed-ast2600.c diff --git a/drivers/pwm/Kconfig b/drivers/pwm/Kconfig index aa29841bbb79..3313f074f15e 100644 --- a/drivers/pwm/Kconfig +++ b/drivers/pwm/Kconfig @@ -51,6 +51,16 @@ config PWM_AB8500 To compile this driver as a module, choose M here: the module will be called pwm-ab8500. +config PWM_ASPEED_AST2600 + tristate "Aspeed ast2600 PWM support" + depends on ARCH_ASPEED || COMPILE_TEST + depends on HAVE_CLK && HAS_IOMEM + help + This driver provides support for Aspeed ast2600 PWM controllers. + + To compile this driver as a module, choose M here: the module + will be called pwm-aspeed-ast2600. + config PWM_ATMEL tristate "Atmel PWM support" depends on ARCH_AT91 || COMPILE_TEST diff --git a/drivers/pwm/Makefile b/drivers/pwm/Makefile index 708840b7fba8..6be0c67bf08a 100644 --- a/drivers/pwm/Makefile +++ b/drivers/pwm/Makefile @@ -2,6 +2,7 @@ obj-$(CONFIG_PWM) += core.o obj-$(CONFIG_PWM_SYSFS) += sysfs.o obj-$(CONFIG_PWM_AB8500) += pwm-ab8500.o +obj-$(CONFIG_PWM_ASPEED_AST2600) += pwm-aspeed-ast2600.o obj-$(CONFIG_PWM_ATMEL) += pwm-atmel.o obj-$(CONFIG_PWM_ATMEL_HLCDC_PWM) += pwm-atmel-hlcdc.o obj-$(CONFIG_PWM_ATMEL_TCB) += pwm-atmel-tcb.o diff --git a/drivers/pwm/pwm-aspeed-ast2600.c b/drivers/pwm/pwm-aspeed-ast2600.c new file mode 100644 index 000000000000..e571e9fadf0f --- /dev/null +++ b/drivers/pwm/pwm-aspeed-ast2600.c @@ -0,0 +1,319 @@ +// SPDX-License-Identifier: GPL-2.0-or-later +/* + * Copyright (C) 2021 Aspeed Technology Inc. + * + * PWM controller driver for Aspeed ast2600 SoCs. + * This drivers doesn't support earlier version of the IP. + * + * The hardware operates in time quantities of length + * Q := (DIV_L + 1) << DIV_H / input-clk + * The length of a PWM period is (DUTY_CYCLE_PERIOD + 1) * Q. + * The maximal value for DUTY_CYCLE_PERIOD is used here to provide + * a fine grained selection for the duty cycle. + * + * This driver uses DUTY_CYCLE_RISING_POINT = 0, so from the start of a + * period the output is active until DUTY_CYCLE_FALLING_POINT * Q. Note + * that if DUTY_CYCLE_RISING_POINT = DUTY_CYCLE_FALLING_POINT the output is + * always active. + * + * Register usage: + * PIN_ENABLE: When it is unset the pwm controller will emit inactive level to the external. + * Use to determine whether the PWM channel is enabled or disabled + * CLK_ENABLE: When it is unset the pwm controller will assert the duty counter reset and + * emit inactive level to the PIN_ENABLE mux after that the driver can still change the pwm period + * and duty and the value will apply when CLK_ENABLE be set again. + * Use to determine whether duty_cycle bigger than 0. + * PWM_ASPEED_CTRL_INVERSE: When it is toggled the output value will inverse immediately. + * PWM_ASPEED_DUTY_CYCLE_FALLING_POINT/PWM_ASPEED_DUTY_CYCLE_RISING_POINT: When these two + * values are equal it means the duty cycle = 100%. + * + * The glitch may generate at: + * - Enabled changing when the duty_cycle bigger than 0% and less than 100%. + * - Polarity changing when the duty_cycle bigger than 0% and less than 100%. + * + * Limitations: + * - When changing both duty cycle and period, we cannot prevent in + * software that the output might produce a period with mixed + * settings. + * - Disabling the PWM doesn't complete the current period. + * + * Improvements: + * - When only changing one of duty cycle or period, our pwm controller will not + * generate the glitch, the configure will change at next cycle of pwm. + * This improvement can disable/enable through PWM_ASPEED_CTRL_DUTY_SYNC_DISABLE. + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +/* The channel number of Aspeed pwm controller */ +#define PWM_ASPEED_NR_PWMS 16 +/* PWM Control Register */ +#define PWM_ASPEED_CTRL(ch) ((ch) * 0x10 + 0x00) +#define PWM_ASPEED_CTRL_LOAD_SEL_RISING_AS_WDT BIT(19) +#define PWM_ASPEED_CTRL_DUTY_LOAD_AS_WDT_ENABLE BIT(18) +#define PWM_ASPEED_CTRL_DUTY_SYNC_DISABLE BIT(17) +#define PWM_ASPEED_CTRL_CLK_ENABLE BIT(16) +#define PWM_ASPEED_CTRL_LEVEL_OUTPUT BIT(15) +#define PWM_ASPEED_CTRL_INVERSE BIT(14) +#define PWM_ASPEED_CTRL_OPEN_DRAIN_ENABLE BIT(13) +#define PWM_ASPEED_CTRL_PIN_ENABLE BIT(12) +#define PWM_ASPEED_CTRL_CLK_DIV_H GENMASK(11, 8) +#define PWM_ASPEED_CTRL_CLK_DIV_L GENMASK(7, 0) + +/* PWM Duty Cycle Register */ +#define PWM_ASPEED_DUTY_CYCLE(ch) ((ch) * 0x10 + 0x04) +#define PWM_ASPEED_DUTY_CYCLE_PERIOD GENMASK(31, 24) +#define PWM_ASPEED_DUTY_CYCLE_POINT_AS_WDT GENMASK(23, 16) +#define PWM_ASPEED_DUTY_CYCLE_FALLING_POINT GENMASK(15, 8) +#define PWM_ASPEED_DUTY_CYCLE_RISING_POINT GENMASK(7, 0) + +/* PWM fixed value */ +#define PWM_ASPEED_FIXED_PERIOD FIELD_MAX(PWM_ASPEED_DUTY_CYCLE_PERIOD) + +struct aspeed_pwm_data { + struct pwm_chip chip; + struct clk *clk; + struct regmap *regmap; + struct reset_control *reset; +}; + +static inline struct aspeed_pwm_data * +aspeed_pwm_chip_to_data(struct pwm_chip *chip) +{ + return container_of(chip, struct aspeed_pwm_data, chip); +} + +static void aspeed_pwm_get_state(struct pwm_chip *chip, struct pwm_device *pwm, + struct pwm_state *state) +{ + struct device *dev = chip->dev; + struct aspeed_pwm_data *priv = aspeed_pwm_chip_to_data(chip); + u32 hwpwm = pwm->hwpwm; + bool polarity, pin_en, clk_en; + u32 duty_pt, val; + unsigned long rate; + u64 div_h, div_l, duty_cycle_period, dividend; + + regmap_read(priv->regmap, PWM_ASPEED_CTRL(hwpwm), &val); + polarity = FIELD_GET(PWM_ASPEED_CTRL_INVERSE, val); + pin_en = FIELD_GET(PWM_ASPEED_CTRL_PIN_ENABLE, val); + clk_en = FIELD_GET(PWM_ASPEED_CTRL_CLK_ENABLE, val); + div_h = FIELD_GET(PWM_ASPEED_CTRL_CLK_DIV_H, val); + div_l = FIELD_GET(PWM_ASPEED_CTRL_CLK_DIV_L, val); + regmap_read(priv->regmap, PWM_ASPEED_DUTY_CYCLE(hwpwm), &val); + duty_pt = FIELD_GET(PWM_ASPEED_DUTY_CYCLE_FALLING_POINT, val); + duty_cycle_period = FIELD_GET(PWM_ASPEED_DUTY_CYCLE_PERIOD, val); + + rate = clk_get_rate(priv->clk); + + /* + * This multiplication doesn't overflow, the upper bound is + * 1000000000 * 256 * 256 << 15 = 0x1dcd650000000000 + */ + dividend = (u64)NSEC_PER_SEC * (div_l + 1) * (duty_cycle_period + 1) + << div_h; + state->period = DIV_ROUND_UP_ULL(dividend, rate); + + if (clk_en && duty_pt) { + dividend = (u64)NSEC_PER_SEC * (div_l + 1) * duty_pt + << div_h; + state->duty_cycle = DIV_ROUND_UP_ULL(dividend, rate); + } else { + state->duty_cycle = clk_en ? state->period : 0; + } + state->polarity = polarity ? PWM_POLARITY_INVERSED : PWM_POLARITY_NORMAL; + state->enabled = pin_en; + dev_dbg(dev, "get period: %lldns, duty_cycle: %lldns", state->period, + state->duty_cycle); +} + +static int aspeed_pwm_apply(struct pwm_chip *chip, struct pwm_device *pwm, + const struct pwm_state *state) +{ + struct device *dev = chip->dev; + struct aspeed_pwm_data *priv = aspeed_pwm_chip_to_data(chip); + u32 hwpwm = pwm->hwpwm, duty_pt; + unsigned long rate; + u64 div_h, div_l, divisor, expect_period; + bool clk_en; + + rate = clk_get_rate(priv->clk); + expect_period = min(div64_u64(ULLONG_MAX, (u64)rate), state->period); + dev_dbg(dev, "expect period: %lldns, duty_cycle: %lldns", expect_period, + state->duty_cycle); + /* + * Pick the smallest value for div_h so that div_l can be the biggest + * which results in a finer resolution near the target period value. + */ + divisor = (u64)NSEC_PER_SEC * (PWM_ASPEED_FIXED_PERIOD + 1) * + (FIELD_MAX(PWM_ASPEED_CTRL_CLK_DIV_L) + 1); + div_h = order_base_2(DIV64_U64_ROUND_UP(rate * expect_period, divisor)); + if (div_h > 0xf) + div_h = 0xf; + + divisor = ((u64)NSEC_PER_SEC * (PWM_ASPEED_FIXED_PERIOD + 1)) << div_h; + div_l = div64_u64(rate * expect_period, divisor); + + if (div_l == 0) + return -ERANGE; + + div_l -= 1; + + if (div_l > 255) + div_l = 255; + + dev_dbg(dev, "clk source: %ld div_h %lld, div_l : %lld\n", rate, div_h, + div_l); + /* duty_pt = duty_cycle * (PERIOD + 1) / period */ + duty_pt = div64_u64(state->duty_cycle * rate, + (u64)NSEC_PER_SEC * (div_l + 1) << div_h); + dev_dbg(dev, "duty_cycle = %lld, duty_pt = %d\n", state->duty_cycle, + duty_pt); + + /* + * Fixed DUTY_CYCLE_PERIOD to its max value to get a + * fine-grained resolution for duty_cycle at the expense of a + * coarser period resolution. + */ + regmap_update_bits(priv->regmap, PWM_ASPEED_DUTY_CYCLE(hwpwm), + PWM_ASPEED_DUTY_CYCLE_PERIOD, + FIELD_PREP(PWM_ASPEED_DUTY_CYCLE_PERIOD, + PWM_ASPEED_FIXED_PERIOD)); + if (duty_pt == 0) { + /* emit inactive level and assert the duty counter reset */ + clk_en = 0; + } else { + clk_en = 1; + if (duty_pt >= (PWM_ASPEED_FIXED_PERIOD + 1)) + duty_pt = 0; + regmap_update_bits(priv->regmap, PWM_ASPEED_DUTY_CYCLE(hwpwm), + PWM_ASPEED_DUTY_CYCLE_RISING_POINT | + PWM_ASPEED_DUTY_CYCLE_FALLING_POINT, + FIELD_PREP(PWM_ASPEED_DUTY_CYCLE_FALLING_POINT, duty_pt)); + } + + regmap_update_bits(priv->regmap, PWM_ASPEED_CTRL(hwpwm), + PWM_ASPEED_CTRL_CLK_DIV_H | PWM_ASPEED_CTRL_CLK_DIV_L | + PWM_ASPEED_CTRL_PIN_ENABLE | PWM_ASPEED_CTRL_CLK_ENABLE | + PWM_ASPEED_CTRL_INVERSE, + FIELD_PREP(PWM_ASPEED_CTRL_CLK_DIV_H, div_h) | + FIELD_PREP(PWM_ASPEED_CTRL_CLK_DIV_L, div_l) | + FIELD_PREP(PWM_ASPEED_CTRL_PIN_ENABLE, state->enabled) | + FIELD_PREP(PWM_ASPEED_CTRL_CLK_ENABLE, clk_en) | + FIELD_PREP(PWM_ASPEED_CTRL_INVERSE, state->polarity)); + return 0; +} + +static const struct pwm_ops aspeed_pwm_ops = { + .apply = aspeed_pwm_apply, + .get_state = aspeed_pwm_get_state, + .owner = THIS_MODULE, +}; + +static void aspeed_pwm_reset_assert(void *data) +{ + struct reset_control *rst = data; + + reset_control_assert(rst); +} + +static void aspeed_pwm_chip_remove(void *data) +{ + struct pwm_chip *chip = data; + + pwmchip_remove(chip); +} + +static int aspeed_pwm_probe(struct platform_device *pdev) +{ + struct device *dev = &pdev->dev; + int ret; + struct aspeed_pwm_data *priv; + struct device_node *np; + struct platform_device *parent_dev; + + priv = devm_kzalloc(dev, sizeof(*priv), GFP_KERNEL); + if (!priv) + return -ENOMEM; + + np = pdev->dev.parent->of_node; + if (!of_device_is_compatible(np, "aspeed,ast2600-pwm-tach")) + return dev_err_probe(dev, -ENODEV, + "Unsupported pwm device binding\n"); + + priv->regmap = syscon_node_to_regmap(np); + if (IS_ERR(priv->regmap)) + return dev_err_probe(dev, PTR_ERR(priv->regmap), + "Couldn't get regmap\n"); + + parent_dev = of_find_device_by_node(np); + priv->clk = devm_clk_get_enabled(&parent_dev->dev, NULL); + if (IS_ERR(priv->clk)) + return dev_err_probe(dev, PTR_ERR(priv->clk), + "Couldn't get clock\n"); + + priv->reset = devm_reset_control_get_shared(&parent_dev->dev, NULL); + if (IS_ERR(priv->reset)) + return dev_err_probe(dev, PTR_ERR(priv->reset), + "Couldn't get reset control\n"); + + ret = reset_control_deassert(priv->reset); + if (ret) + return dev_err_probe(dev, ret, + "Couldn't deassert reset control\n"); + + ret = devm_add_action_or_reset(dev, aspeed_pwm_reset_assert, + priv->reset); + if (ret) + return ret; + + priv->chip.dev = dev; + priv->chip.ops = &aspeed_pwm_ops; + priv->chip.npwm = PWM_ASPEED_NR_PWMS; + + ret = pwmchip_add(&priv->chip); + if (ret < 0) + return dev_err_probe(dev, ret, "Failed to add PWM chip\n"); + ret = devm_add_action_or_reset(dev, aspeed_pwm_chip_remove, + &priv->chip); + if (ret) + return ret; + return 0; +} + +static const struct of_device_id of_pwm_match_table[] = { + { + .compatible = "aspeed,ast2600-pwm", + }, + {}, +}; +MODULE_DEVICE_TABLE(of, of_pwm_match_table); + +static struct platform_driver aspeed_pwm_driver = { + .probe = aspeed_pwm_probe, + .driver = { + .name = "aspeed-pwm", + .of_match_table = of_pwm_match_table, + }, +}; + +module_platform_driver(aspeed_pwm_driver); + +MODULE_AUTHOR("Billy Tsai "); +MODULE_DESCRIPTION("Aspeed ast2600 PWM device driver"); +MODULE_LICENSE("GPL v2"); -- 2.25.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 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 smtp.lore.kernel.org (Postfix) with ESMTPS id B75A2C4332F for ; Wed, 2 Nov 2022 09:31:53 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=bombadil.20210309; h=Sender: Content-Transfer-Encoding:Content-Type:List-Subscribe:List-Help:List-Post: List-Archive:List-Unsubscribe:List-Id:MIME-Version:References:In-Reply-To: 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: List-Owner; bh=U4reNOBGLrTHIW1rCEy4KkGxzGksUKirEZbXEX5+IlM=; b=yvo2SmFv0B6s6x 94+KdJp5ro3xfzDQy01e7NUdPkCH1GPJAc6BV0MV7HAsa+uO8z0eNsqHssPE1zAGCbmei/SAXsnFK iB6KFuzQDiAnuH7BIVe0FJUceLECYTURSyXvHpnMTaUJvtJS0Cc4WQGpynq6jIlcNm5z5shDQhy4U 0D9aoR6TuFFnKdebZwnqFICros1e4iIAfaxfVI7lnG3K8LeniWkVGVsOVBfrXOBUzJyWmghSow9uA ONe1VyJmIvTGDWts3T5kvPwrFMYI1k8X4H3Wd5MIhFlppnwB2l/BxBexQg4Ib3RlesyfBx2vi49ch clVAN5AE2A7222kRteyA==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.94.2 #2 (Red Hat Linux)) id 1oqA4n-00AFqV-0w; Wed, 02 Nov 2022 09:30:25 +0000 Received: from desiato.infradead.org ([2001:8b0:10b:1:d65d:64ff:fe57:4e05]) by bombadil.infradead.org with esmtps (Exim 4.94.2 #2 (Red Hat Linux)) id 1oqA3e-00AFRs-JC for linux-arm-kernel@bombadil.infradead.org; Wed, 02 Nov 2022 09:29:14 +0000 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=infradead.org; s=desiato.20200630; h=Content-Transfer-Encoding:Content-Type :MIME-Version:References:In-Reply-To:Message-ID:Date:Subject:CC:To:From: Sender:Reply-To:Content-ID:Content-Description; bh=pInw2zSLWmjY0AECRmPvfAJrn5ik9Uv/UTRIFrMpmRQ=; b=oqSSxJAb9Z4pJiGfY+d1xMpZ0C dGkRegVTEMPZooW7083n5AVUabIpBbq3V7xrxRUCJ8VnTjswofBi8S8h2z8vpeiAJ+43ZD3EsSFuu 2AuB4devJk6NcQieVYV4E9ckzjobS6fgjVbKwOPb+FPksxOg3PvU6sxve4h/SL/5G+oUaAyK4UPkV 92HKP3jS2X1/0Cmxj+xELfuXFmzCSTpakM+Wl02FW8Qzt8ZYZ4K2orqCBTVa3IOHZ/iyIAWZ9gSSx AUQEs2qfdpbYR/Ryrr0QaCfUC9AWCV7J2Tn9Aa730+JIjvRHEKBYTwcGEKu8QnfKan+xpCSzNlti7 8iBAr6/A==; Received: from twspam01.aspeedtech.com ([211.20.114.71]) by desiato.infradead.org with esmtps (Exim 4.94.2 #2 (Red Hat Linux)) id 1oq9DN-008LS2-7L for linux-arm-kernel@lists.infradead.org; Wed, 02 Nov 2022 08:35:18 +0000 Received: from mail.aspeedtech.com ([192.168.0.24]) by twspam01.aspeedtech.com with ESMTP id 2A28BAHv072663; Wed, 2 Nov 2022 16:11:11 +0800 (GMT-8) (envelope-from billy_tsai@aspeedtech.com) Received: from BillyTsai-pc.aspeed.com (192.168.2.149) by TWMBX02.aspeed.com (192.168.0.24) with Microsoft SMTP Server (TLS) id 15.0.1497.2; Wed, 2 Nov 2022 16:34:24 +0800 From: Billy Tsai To: , , , , , , , , , , , , , , , , , CC: kernel test robot Subject: [v3 2/3] pwm: Add Aspeed ast2600 PWM support Date: Wed, 2 Nov 2022 16:36:00 +0800 Message-ID: <20221102083601.10456-3-billy_tsai@aspeedtech.com> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20221102083601.10456-1-billy_tsai@aspeedtech.com> References: <20221102083601.10456-1-billy_tsai@aspeedtech.com> MIME-Version: 1.0 X-Originating-IP: [192.168.2.149] X-ClientProxiedBy: TWMBX02.aspeed.com (192.168.0.24) To TWMBX02.aspeed.com (192.168.0.24) X-DNSRBL: X-MAIL: twspam01.aspeedtech.com 2A28BAHv072663 X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20221102_083513_928569_F97D6464 X-CRM114-Status: GOOD ( 34.82 ) 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 VGhpcyBwYXRjaCBhZGQgdGhlIHN1cHBvcnQgb2YgUFdNIGNvbnRyb2xsZXIgd2hpY2ggY2FuIGJl IGZvdW5kIGF0IGFzcGVlZAphc3QyNjAwIHNvYy4gVGhlIHB3bSBzdXBvb3J0cyB1cCB0byAxNiBj aGFubmVscyBhbmQgaXQncyBwYXJ0IGZ1bmN0aW9uCm9mIG11bHRpLWZ1bmN0aW9uIGRldmljZSAi cHdtLXRhY2ggY29udHJvbGxlciIuCgpTaWduZWQtb2ZmLWJ5OiBCaWxseSBUc2FpIDxiaWxseV90 c2FpQGFzcGVlZHRlY2guY29tPgpSZXZpZXdlZC1ieTogVXdlIEtsZWluZS1Lw7ZuaWcgPHUua2xl aW5lLWtvZW5pZ0BwZW5ndXRyb25peC5kZT4KUmVwb3J0ZWQtYnk6IGtlcm5lbCB0ZXN0IHJvYm90 IDxsa3BAaW50ZWwuY29tPgotLS0KIGRyaXZlcnMvcHdtL0tjb25maWcgICAgICAgICAgICAgIHwg IDEwICsKIGRyaXZlcnMvcHdtL01ha2VmaWxlICAgICAgICAgICAgIHwgICAxICsKIGRyaXZlcnMv cHdtL3B3bS1hc3BlZWQtYXN0MjYwMC5jIHwgMzE5ICsrKysrKysrKysrKysrKysrKysrKysrKysr KysrKysKIDMgZmlsZXMgY2hhbmdlZCwgMzMwIGluc2VydGlvbnMoKykKIGNyZWF0ZSBtb2RlIDEw MDY0NCBkcml2ZXJzL3B3bS9wd20tYXNwZWVkLWFzdDI2MDAuYwoKZGlmZiAtLWdpdCBhL2RyaXZl cnMvcHdtL0tjb25maWcgYi9kcml2ZXJzL3B3bS9LY29uZmlnCmluZGV4IGFhMjk4NDFiYmI3OS4u MzMxM2YwNzRmMTVlIDEwMDY0NAotLS0gYS9kcml2ZXJzL3B3bS9LY29uZmlnCisrKyBiL2RyaXZl cnMvcHdtL0tjb25maWcKQEAgLTUxLDYgKzUxLDE2IEBAIGNvbmZpZyBQV01fQUI4NTAwCiAJICBU byBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUgbW9k dWxlCiAJICB3aWxsIGJlIGNhbGxlZCBwd20tYWI4NTAwLgogCitjb25maWcgUFdNX0FTUEVFRF9B U1QyNjAwCisJdHJpc3RhdGUgIkFzcGVlZCBhc3QyNjAwIFBXTSBzdXBwb3J0IgorCWRlcGVuZHMg b24gQVJDSF9BU1BFRUQgfHwgQ09NUElMRV9URVNUCisJZGVwZW5kcyBvbiBIQVZFX0NMSyAmJiBI QVNfSU9NRU0KKwloZWxwCisJICBUaGlzIGRyaXZlciBwcm92aWRlcyBzdXBwb3J0IGZvciBBc3Bl ZWQgYXN0MjYwMCBQV00gY29udHJvbGxlcnMuCisKKwkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIg YXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZSBtb2R1bGUKKwkgIHdpbGwgYmUgY2FsbGVk IHB3bS1hc3BlZWQtYXN0MjYwMC4KKwogY29uZmlnIFBXTV9BVE1FTAogCXRyaXN0YXRlICJBdG1l bCBQV00gc3VwcG9ydCIKIAlkZXBlbmRzIG9uIEFSQ0hfQVQ5MSB8fCBDT01QSUxFX1RFU1QKZGlm ZiAtLWdpdCBhL2RyaXZlcnMvcHdtL01ha2VmaWxlIGIvZHJpdmVycy9wd20vTWFrZWZpbGUKaW5k ZXggNzA4ODQwYjdmYmE4Li42YmUwYzY3YmYwOGEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcHdtL01h a2VmaWxlCisrKyBiL2RyaXZlcnMvcHdtL01ha2VmaWxlCkBAIC0yLDYgKzIsNyBAQAogb2JqLSQo Q09ORklHX1BXTSkJCSs9IGNvcmUubwogb2JqLSQoQ09ORklHX1BXTV9TWVNGUykJCSs9IHN5c2Zz Lm8KIG9iai0kKENPTkZJR19QV01fQUI4NTAwKQkrPSBwd20tYWI4NTAwLm8KK29iai0kKENPTkZJ R19QV01fQVNQRUVEX0FTVDI2MDApCSs9IHB3bS1hc3BlZWQtYXN0MjYwMC5vCiBvYmotJChDT05G SUdfUFdNX0FUTUVMKQkJKz0gcHdtLWF0bWVsLm8KIG9iai0kKENPTkZJR19QV01fQVRNRUxfSExD RENfUFdNKQkrPSBwd20tYXRtZWwtaGxjZGMubwogb2JqLSQoQ09ORklHX1BXTV9BVE1FTF9UQ0Ip CSs9IHB3bS1hdG1lbC10Y2IubwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wd20vcHdtLWFzcGVlZC1h c3QyNjAwLmMgYi9kcml2ZXJzL3B3bS9wd20tYXNwZWVkLWFzdDI2MDAuYwpuZXcgZmlsZSBtb2Rl IDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMDAuLmU1NzFlOWZhZGYwZgotLS0gL2Rldi9udWxsCisr KyBiL2RyaXZlcnMvcHdtL3B3bS1hc3BlZWQtYXN0MjYwMC5jCkBAIC0wLDAgKzEsMzE5IEBACisv LyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMC1vci1sYXRlcgorLyoKKyAqIENvcHly aWdodCAoQykgMjAyMSBBc3BlZWQgVGVjaG5vbG9neSBJbmMuCisgKgorICogUFdNIGNvbnRyb2xs ZXIgZHJpdmVyIGZvciBBc3BlZWQgYXN0MjYwMCBTb0NzLgorICogVGhpcyBkcml2ZXJzIGRvZXNu J3Qgc3VwcG9ydCBlYXJsaWVyIHZlcnNpb24gb2YgdGhlIElQLgorICoKKyAqIFRoZSBoYXJkd2Fy ZSBvcGVyYXRlcyBpbiB0aW1lIHF1YW50aXRpZXMgb2YgbGVuZ3RoCisgKiBRIDo9IChESVZfTCAr IDEpIDw8IERJVl9IIC8gaW5wdXQtY2xrCisgKiBUaGUgbGVuZ3RoIG9mIGEgUFdNIHBlcmlvZCBp cyAoRFVUWV9DWUNMRV9QRVJJT0QgKyAxKSAqIFEuCisgKiBUaGUgbWF4aW1hbCB2YWx1ZSBmb3Ig RFVUWV9DWUNMRV9QRVJJT0QgaXMgdXNlZCBoZXJlIHRvIHByb3ZpZGUKKyAqIGEgZmluZSBncmFp bmVkIHNlbGVjdGlvbiBmb3IgdGhlIGR1dHkgY3ljbGUuCisgKgorICogVGhpcyBkcml2ZXIgdXNl cyBEVVRZX0NZQ0xFX1JJU0lOR19QT0lOVCA9IDAsIHNvIGZyb20gdGhlIHN0YXJ0IG9mIGEKKyAq IHBlcmlvZCB0aGUgb3V0cHV0IGlzIGFjdGl2ZSB1bnRpbCBEVVRZX0NZQ0xFX0ZBTExJTkdfUE9J TlQgKiBRLiBOb3RlCisgKiB0aGF0IGlmIERVVFlfQ1lDTEVfUklTSU5HX1BPSU5UID0gRFVUWV9D WUNMRV9GQUxMSU5HX1BPSU5UIHRoZSBvdXRwdXQgaXMKKyAqIGFsd2F5cyBhY3RpdmUuCisgKgor ICogUmVnaXN0ZXIgdXNhZ2U6CisgKiBQSU5fRU5BQkxFOiBXaGVuIGl0IGlzIHVuc2V0IHRoZSBw d20gY29udHJvbGxlciB3aWxsIGVtaXQgaW5hY3RpdmUgbGV2ZWwgdG8gdGhlIGV4dGVybmFsLgor ICogVXNlIHRvIGRldGVybWluZSB3aGV0aGVyIHRoZSBQV00gY2hhbm5lbCBpcyBlbmFibGVkIG9y IGRpc2FibGVkCisgKiBDTEtfRU5BQkxFOiBXaGVuIGl0IGlzIHVuc2V0IHRoZSBwd20gY29udHJv bGxlciB3aWxsIGFzc2VydCB0aGUgZHV0eSBjb3VudGVyIHJlc2V0IGFuZAorICogZW1pdCBpbmFj dGl2ZSBsZXZlbCB0byB0aGUgUElOX0VOQUJMRSBtdXggYWZ0ZXIgdGhhdCB0aGUgZHJpdmVyIGNh biBzdGlsbCBjaGFuZ2UgdGhlIHB3bSBwZXJpb2QKKyAqIGFuZCBkdXR5IGFuZCB0aGUgdmFsdWUg d2lsbCBhcHBseSB3aGVuIENMS19FTkFCTEUgYmUgc2V0IGFnYWluLgorICogVXNlIHRvIGRldGVy bWluZSB3aGV0aGVyIGR1dHlfY3ljbGUgYmlnZ2VyIHRoYW4gMC4KKyAqIFBXTV9BU1BFRURfQ1RS TF9JTlZFUlNFOiBXaGVuIGl0IGlzIHRvZ2dsZWQgdGhlIG91dHB1dCB2YWx1ZSB3aWxsIGludmVy c2UgaW1tZWRpYXRlbHkuCisgKiBQV01fQVNQRUVEX0RVVFlfQ1lDTEVfRkFMTElOR19QT0lOVC9Q V01fQVNQRUVEX0RVVFlfQ1lDTEVfUklTSU5HX1BPSU5UOiBXaGVuIHRoZXNlIHR3bworICogdmFs dWVzIGFyZSBlcXVhbCBpdCBtZWFucyB0aGUgZHV0eSBjeWNsZSA9IDEwMCUuCisgKgorICogVGhl IGdsaXRjaCBtYXkgZ2VuZXJhdGUgYXQ6CisgKiAtIEVuYWJsZWQgY2hhbmdpbmcgd2hlbiB0aGUg ZHV0eV9jeWNsZSBiaWdnZXIgdGhhbiAwJSBhbmQgbGVzcyB0aGFuIDEwMCUuCisgKiAtIFBvbGFy aXR5IGNoYW5naW5nIHdoZW4gdGhlIGR1dHlfY3ljbGUgYmlnZ2VyIHRoYW4gMCUgYW5kIGxlc3Mg dGhhbiAxMDAlLgorICoKKyAqIExpbWl0YXRpb25zOgorICogLSBXaGVuIGNoYW5naW5nIGJvdGgg ZHV0eSBjeWNsZSBhbmQgcGVyaW9kLCB3ZSBjYW5ub3QgcHJldmVudCBpbgorICogICBzb2Z0d2Fy ZSB0aGF0IHRoZSBvdXRwdXQgbWlnaHQgcHJvZHVjZSBhIHBlcmlvZCB3aXRoIG1peGVkCisgKiAg IHNldHRpbmdzLgorICogLSBEaXNhYmxpbmcgdGhlIFBXTSBkb2Vzbid0IGNvbXBsZXRlIHRoZSBj dXJyZW50IHBlcmlvZC4KKyAqCisgKiBJbXByb3ZlbWVudHM6CisgKiAtIFdoZW4gb25seSBjaGFu Z2luZyBvbmUgb2YgZHV0eSBjeWNsZSBvciBwZXJpb2QsIG91ciBwd20gY29udHJvbGxlciB3aWxs IG5vdAorICogICBnZW5lcmF0ZSB0aGUgZ2xpdGNoLCB0aGUgY29uZmlndXJlIHdpbGwgY2hhbmdl IGF0IG5leHQgY3ljbGUgb2YgcHdtLgorICogICBUaGlzIGltcHJvdmVtZW50IGNhbiBkaXNhYmxl L2VuYWJsZSB0aHJvdWdoIFBXTV9BU1BFRURfQ1RSTF9EVVRZX1NZTkNfRElTQUJMRS4KKyAqLwor CisjaW5jbHVkZSA8bGludXgvYml0ZmllbGQuaD4KKyNpbmNsdWRlIDxsaW51eC9jbGsuaD4KKyNp bmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L2lvLmg+CisjaW5jbHVkZSA8 bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvbWF0aDY0Lmg+CisjaW5jbHVkZSA8bGlu dXgvbWZkL3N5c2Nvbi5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxp bnV4L29mX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L29mX3BsYXRmb3JtLmg+CisjaW5jbHVk ZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvcHdtLmg+CisjaW5j bHVkZSA8bGludXgvcmVnbWFwLmg+CisjaW5jbHVkZSA8bGludXgvcmVzZXQuaD4KKyNpbmNsdWRl IDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvc3lzZnMuaD4KKworLyogVGhlIGNoYW5u ZWwgbnVtYmVyIG9mIEFzcGVlZCBwd20gY29udHJvbGxlciAqLworI2RlZmluZSBQV01fQVNQRUVE X05SX1BXTVMJCQkxNgorLyogUFdNIENvbnRyb2wgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgUFdNX0FT UEVFRF9DVFJMKGNoKQkJCSgoY2gpICogMHgxMCArIDB4MDApCisjZGVmaW5lIFBXTV9BU1BFRURf Q1RSTF9MT0FEX1NFTF9SSVNJTkdfQVNfV0RUCUJJVCgxOSkKKyNkZWZpbmUgUFdNX0FTUEVFRF9D VFJMX0RVVFlfTE9BRF9BU19XRFRfRU5BQkxFCUJJVCgxOCkKKyNkZWZpbmUgUFdNX0FTUEVFRF9D VFJMX0RVVFlfU1lOQ19ESVNBQkxFCUJJVCgxNykKKyNkZWZpbmUgUFdNX0FTUEVFRF9DVFJMX0NM S19FTkFCTEUJCUJJVCgxNikKKyNkZWZpbmUgUFdNX0FTUEVFRF9DVFJMX0xFVkVMX09VVFBVVAkJ QklUKDE1KQorI2RlZmluZSBQV01fQVNQRUVEX0NUUkxfSU5WRVJTRQkJCUJJVCgxNCkKKyNkZWZp bmUgUFdNX0FTUEVFRF9DVFJMX09QRU5fRFJBSU5fRU5BQkxFCUJJVCgxMykKKyNkZWZpbmUgUFdN X0FTUEVFRF9DVFJMX1BJTl9FTkFCTEUJCUJJVCgxMikKKyNkZWZpbmUgUFdNX0FTUEVFRF9DVFJM X0NMS19ESVZfSAkJR0VOTUFTSygxMSwgOCkKKyNkZWZpbmUgUFdNX0FTUEVFRF9DVFJMX0NMS19E SVZfTAkJR0VOTUFTSyg3LCAwKQorCisvKiBQV00gRHV0eSBDeWNsZSBSZWdpc3RlciAqLworI2Rl ZmluZSBQV01fQVNQRUVEX0RVVFlfQ1lDTEUoY2gpCQkoKGNoKSAqIDB4MTAgKyAweDA0KQorI2Rl ZmluZSBQV01fQVNQRUVEX0RVVFlfQ1lDTEVfUEVSSU9ECQlHRU5NQVNLKDMxLCAyNCkKKyNkZWZp bmUgUFdNX0FTUEVFRF9EVVRZX0NZQ0xFX1BPSU5UX0FTX1dEVAlHRU5NQVNLKDIzLCAxNikKKyNk ZWZpbmUgUFdNX0FTUEVFRF9EVVRZX0NZQ0xFX0ZBTExJTkdfUE9JTlQJR0VOTUFTSygxNSwgOCkK KyNkZWZpbmUgUFdNX0FTUEVFRF9EVVRZX0NZQ0xFX1JJU0lOR19QT0lOVAlHRU5NQVNLKDcsIDAp CisKKy8qIFBXTSBmaXhlZCB2YWx1ZSAqLworI2RlZmluZSBQV01fQVNQRUVEX0ZJWEVEX1BFUklP RAkJCUZJRUxEX01BWChQV01fQVNQRUVEX0RVVFlfQ1lDTEVfUEVSSU9EKQorCitzdHJ1Y3QgYXNw ZWVkX3B3bV9kYXRhIHsKKwlzdHJ1Y3QgcHdtX2NoaXAgY2hpcDsKKwlzdHJ1Y3QgY2xrICpjbGs7 CisJc3RydWN0IHJlZ21hcCAqcmVnbWFwOworCXN0cnVjdCByZXNldF9jb250cm9sICpyZXNldDsK K307CisKK3N0YXRpYyBpbmxpbmUgc3RydWN0IGFzcGVlZF9wd21fZGF0YSAqCithc3BlZWRfcHdt X2NoaXBfdG9fZGF0YShzdHJ1Y3QgcHdtX2NoaXAgKmNoaXApCit7CisJcmV0dXJuIGNvbnRhaW5l cl9vZihjaGlwLCBzdHJ1Y3QgYXNwZWVkX3B3bV9kYXRhLCBjaGlwKTsKK30KKworc3RhdGljIHZv aWQgYXNwZWVkX3B3bV9nZXRfc3RhdGUoc3RydWN0IHB3bV9jaGlwICpjaGlwLCBzdHJ1Y3QgcHdt X2RldmljZSAqcHdtLAorCQkJCSBzdHJ1Y3QgcHdtX3N0YXRlICpzdGF0ZSkKK3sKKwlzdHJ1Y3Qg ZGV2aWNlICpkZXYgPSBjaGlwLT5kZXY7CisJc3RydWN0IGFzcGVlZF9wd21fZGF0YSAqcHJpdiA9 IGFzcGVlZF9wd21fY2hpcF90b19kYXRhKGNoaXApOworCXUzMiBod3B3bSA9IHB3bS0+aHdwd207 CisJYm9vbCBwb2xhcml0eSwJcGluX2VuLCBjbGtfZW47CisJdTMyIGR1dHlfcHQsIHZhbDsKKwl1 bnNpZ25lZCBsb25nIHJhdGU7CisJdTY0IGRpdl9oLCBkaXZfbCwgZHV0eV9jeWNsZV9wZXJpb2Qs IGRpdmlkZW5kOworCisJcmVnbWFwX3JlYWQocHJpdi0+cmVnbWFwLCBQV01fQVNQRUVEX0NUUkwo aHdwd20pLCAmdmFsKTsKKwlwb2xhcml0eSA9IEZJRUxEX0dFVChQV01fQVNQRUVEX0NUUkxfSU5W RVJTRSwgdmFsKTsKKwlwaW5fZW4gPSBGSUVMRF9HRVQoUFdNX0FTUEVFRF9DVFJMX1BJTl9FTkFC TEUsIHZhbCk7CisJY2xrX2VuID0gRklFTERfR0VUKFBXTV9BU1BFRURfQ1RSTF9DTEtfRU5BQkxF LCB2YWwpOworCWRpdl9oID0gRklFTERfR0VUKFBXTV9BU1BFRURfQ1RSTF9DTEtfRElWX0gsIHZh bCk7CisJZGl2X2wgPSBGSUVMRF9HRVQoUFdNX0FTUEVFRF9DVFJMX0NMS19ESVZfTCwgdmFsKTsK KwlyZWdtYXBfcmVhZChwcml2LT5yZWdtYXAsIFBXTV9BU1BFRURfRFVUWV9DWUNMRShod3B3bSks ICZ2YWwpOworCWR1dHlfcHQgPSBGSUVMRF9HRVQoUFdNX0FTUEVFRF9EVVRZX0NZQ0xFX0ZBTExJ TkdfUE9JTlQsIHZhbCk7CisJZHV0eV9jeWNsZV9wZXJpb2QgPSBGSUVMRF9HRVQoUFdNX0FTUEVF RF9EVVRZX0NZQ0xFX1BFUklPRCwgdmFsKTsKKworCXJhdGUgPSBjbGtfZ2V0X3JhdGUocHJpdi0+ Y2xrKTsKKworCS8qCisJICogVGhpcyBtdWx0aXBsaWNhdGlvbiBkb2Vzbid0IG92ZXJmbG93LCB0 aGUgdXBwZXIgYm91bmQgaXMKKwkgKiAxMDAwMDAwMDAwICogMjU2ICogMjU2IDw8IDE1ID0gMHgx ZGNkNjUwMDAwMDAwMDAwCisJICovCisJZGl2aWRlbmQgPSAodTY0KU5TRUNfUEVSX1NFQyAqIChk aXZfbCArIDEpICogKGR1dHlfY3ljbGVfcGVyaW9kICsgMSkKKwkJICAgICAgIDw8IGRpdl9oOwor CXN0YXRlLT5wZXJpb2QgPSBESVZfUk9VTkRfVVBfVUxMKGRpdmlkZW5kLCByYXRlKTsKKworCWlm IChjbGtfZW4gJiYgZHV0eV9wdCkgeworCQlkaXZpZGVuZCA9ICh1NjQpTlNFQ19QRVJfU0VDICog KGRpdl9sICsgMSkgKiBkdXR5X3B0CisJCQkJIDw8IGRpdl9oOworCQlzdGF0ZS0+ZHV0eV9jeWNs ZSA9IERJVl9ST1VORF9VUF9VTEwoZGl2aWRlbmQsIHJhdGUpOworCX0gZWxzZSB7CisJCXN0YXRl LT5kdXR5X2N5Y2xlID0gY2xrX2VuID8gc3RhdGUtPnBlcmlvZCA6IDA7CisJfQorCXN0YXRlLT5w b2xhcml0eSA9IHBvbGFyaXR5ID8gUFdNX1BPTEFSSVRZX0lOVkVSU0VEIDogUFdNX1BPTEFSSVRZ X05PUk1BTDsKKwlzdGF0ZS0+ZW5hYmxlZCA9IHBpbl9lbjsKKwlkZXZfZGJnKGRldiwgImdldCBw ZXJpb2Q6ICVsbGRucywgZHV0eV9jeWNsZTogJWxsZG5zIiwgc3RhdGUtPnBlcmlvZCwKKwkJc3Rh dGUtPmR1dHlfY3ljbGUpOworfQorCitzdGF0aWMgaW50IGFzcGVlZF9wd21fYXBwbHkoc3RydWN0 IHB3bV9jaGlwICpjaGlwLCBzdHJ1Y3QgcHdtX2RldmljZSAqcHdtLAorCQkJICAgIGNvbnN0IHN0 cnVjdCBwd21fc3RhdGUgKnN0YXRlKQoreworCXN0cnVjdCBkZXZpY2UgKmRldiA9IGNoaXAtPmRl djsKKwlzdHJ1Y3QgYXNwZWVkX3B3bV9kYXRhICpwcml2ID0gYXNwZWVkX3B3bV9jaGlwX3RvX2Rh dGEoY2hpcCk7CisJdTMyIGh3cHdtID0gcHdtLT5od3B3bSwgZHV0eV9wdDsKKwl1bnNpZ25lZCBs b25nIHJhdGU7CisJdTY0IGRpdl9oLCBkaXZfbCwgZGl2aXNvciwgZXhwZWN0X3BlcmlvZDsKKwli b29sIGNsa19lbjsKKworCXJhdGUgPSBjbGtfZ2V0X3JhdGUocHJpdi0+Y2xrKTsKKwlleHBlY3Rf cGVyaW9kID0gbWluKGRpdjY0X3U2NChVTExPTkdfTUFYLCAodTY0KXJhdGUpLCBzdGF0ZS0+cGVy aW9kKTsKKwlkZXZfZGJnKGRldiwgImV4cGVjdCBwZXJpb2Q6ICVsbGRucywgZHV0eV9jeWNsZTog JWxsZG5zIiwgZXhwZWN0X3BlcmlvZCwKKwkJc3RhdGUtPmR1dHlfY3ljbGUpOworCS8qCisJICog UGljayB0aGUgc21hbGxlc3QgdmFsdWUgZm9yIGRpdl9oIHNvIHRoYXQgZGl2X2wgY2FuIGJlIHRo ZSBiaWdnZXN0CisJICogd2hpY2ggcmVzdWx0cyBpbiBhIGZpbmVyIHJlc29sdXRpb24gbmVhciB0 aGUgdGFyZ2V0IHBlcmlvZCB2YWx1ZS4KKwkgKi8KKwlkaXZpc29yID0gKHU2NClOU0VDX1BFUl9T RUMgKiAoUFdNX0FTUEVFRF9GSVhFRF9QRVJJT0QgKyAxKSAqCisJCSAgKEZJRUxEX01BWChQV01f QVNQRUVEX0NUUkxfQ0xLX0RJVl9MKSArIDEpOworCWRpdl9oID0gb3JkZXJfYmFzZV8yKERJVjY0 X1U2NF9ST1VORF9VUChyYXRlICogZXhwZWN0X3BlcmlvZCwgZGl2aXNvcikpOworCWlmIChkaXZf aCA+IDB4ZikKKwkJZGl2X2ggPSAweGY7CisKKwlkaXZpc29yID0gKCh1NjQpTlNFQ19QRVJfU0VD ICogKFBXTV9BU1BFRURfRklYRURfUEVSSU9EICsgMSkpIDw8IGRpdl9oOworCWRpdl9sID0gZGl2 NjRfdTY0KHJhdGUgKiBleHBlY3RfcGVyaW9kLCBkaXZpc29yKTsKKworCWlmIChkaXZfbCA9PSAw KQorCQlyZXR1cm4gLUVSQU5HRTsKKworCWRpdl9sIC09IDE7CisKKwlpZiAoZGl2X2wgPiAyNTUp CisJCWRpdl9sID0gMjU1OworCisJZGV2X2RiZyhkZXYsICJjbGsgc291cmNlOiAlbGQgZGl2X2gg JWxsZCwgZGl2X2wgOiAlbGxkXG4iLCByYXRlLCBkaXZfaCwKKwkJZGl2X2wpOworCS8qIGR1dHlf cHQgPSBkdXR5X2N5Y2xlICogKFBFUklPRCArIDEpIC8gcGVyaW9kICovCisJZHV0eV9wdCA9IGRp djY0X3U2NChzdGF0ZS0+ZHV0eV9jeWNsZSAqIHJhdGUsCisJCQkgICAgKHU2NClOU0VDX1BFUl9T RUMgKiAoZGl2X2wgKyAxKSA8PCBkaXZfaCk7CisJZGV2X2RiZyhkZXYsICJkdXR5X2N5Y2xlID0g JWxsZCwgZHV0eV9wdCA9ICVkXG4iLCBzdGF0ZS0+ZHV0eV9jeWNsZSwKKwkJZHV0eV9wdCk7CisK KwkvKgorCSAqIEZpeGVkIERVVFlfQ1lDTEVfUEVSSU9EIHRvIGl0cyBtYXggdmFsdWUgdG8gZ2V0 IGEKKwkgKiBmaW5lLWdyYWluZWQgcmVzb2x1dGlvbiBmb3IgZHV0eV9jeWNsZSBhdCB0aGUgZXhw ZW5zZSBvZiBhCisJICogY29hcnNlciBwZXJpb2QgcmVzb2x1dGlvbi4KKwkgKi8KKwlyZWdtYXBf dXBkYXRlX2JpdHMocHJpdi0+cmVnbWFwLCBQV01fQVNQRUVEX0RVVFlfQ1lDTEUoaHdwd20pLAor CQkJICAgUFdNX0FTUEVFRF9EVVRZX0NZQ0xFX1BFUklPRCwKKwkJCSAgIEZJRUxEX1BSRVAoUFdN X0FTUEVFRF9EVVRZX0NZQ0xFX1BFUklPRCwKKwkJCQkgICAgICBQV01fQVNQRUVEX0ZJWEVEX1BF UklPRCkpOworCWlmIChkdXR5X3B0ID09IDApIHsKKwkJLyogZW1pdCBpbmFjdGl2ZSBsZXZlbCBh bmQgYXNzZXJ0IHRoZSBkdXR5IGNvdW50ZXIgcmVzZXQgKi8KKwkJY2xrX2VuID0gMDsKKwl9IGVs c2UgeworCQljbGtfZW4gPSAxOworCQlpZiAoZHV0eV9wdCA+PSAoUFdNX0FTUEVFRF9GSVhFRF9Q RVJJT0QgKyAxKSkKKwkJCWR1dHlfcHQgPSAwOworCQlyZWdtYXBfdXBkYXRlX2JpdHMocHJpdi0+ cmVnbWFwLCBQV01fQVNQRUVEX0RVVFlfQ1lDTEUoaHdwd20pLAorCQkJCSAgIFBXTV9BU1BFRURf RFVUWV9DWUNMRV9SSVNJTkdfUE9JTlQgfAorCQkJCQkgICBQV01fQVNQRUVEX0RVVFlfQ1lDTEVf RkFMTElOR19QT0lOVCwKKwkJCQkgICBGSUVMRF9QUkVQKFBXTV9BU1BFRURfRFVUWV9DWUNMRV9G QUxMSU5HX1BPSU5ULCBkdXR5X3B0KSk7CisJfQorCisJcmVnbWFwX3VwZGF0ZV9iaXRzKHByaXYt PnJlZ21hcCwgUFdNX0FTUEVFRF9DVFJMKGh3cHdtKSwKKwkJCSAgIFBXTV9BU1BFRURfQ1RSTF9D TEtfRElWX0ggfCBQV01fQVNQRUVEX0NUUkxfQ0xLX0RJVl9MIHwKKwkJCQkgICBQV01fQVNQRUVE X0NUUkxfUElOX0VOQUJMRSB8IFBXTV9BU1BFRURfQ1RSTF9DTEtfRU5BQkxFIHwKKwkJCQkgICBQ V01fQVNQRUVEX0NUUkxfSU5WRVJTRSwKKwkJCSAgIEZJRUxEX1BSRVAoUFdNX0FTUEVFRF9DVFJM X0NMS19ESVZfSCwgZGl2X2gpIHwKKwkJCQkgICBGSUVMRF9QUkVQKFBXTV9BU1BFRURfQ1RSTF9D TEtfRElWX0wsIGRpdl9sKSB8CisJCQkJICAgRklFTERfUFJFUChQV01fQVNQRUVEX0NUUkxfUElO X0VOQUJMRSwgc3RhdGUtPmVuYWJsZWQpIHwKKwkJCQkgICBGSUVMRF9QUkVQKFBXTV9BU1BFRURf Q1RSTF9DTEtfRU5BQkxFLCBjbGtfZW4pIHwKKwkJCQkgICBGSUVMRF9QUkVQKFBXTV9BU1BFRURf Q1RSTF9JTlZFUlNFLCBzdGF0ZS0+cG9sYXJpdHkpKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGlj IGNvbnN0IHN0cnVjdCBwd21fb3BzIGFzcGVlZF9wd21fb3BzID0geworCS5hcHBseSA9IGFzcGVl ZF9wd21fYXBwbHksCisJLmdldF9zdGF0ZSA9IGFzcGVlZF9wd21fZ2V0X3N0YXRlLAorCS5vd25l ciA9IFRISVNfTU9EVUxFLAorfTsKKworc3RhdGljIHZvaWQgYXNwZWVkX3B3bV9yZXNldF9hc3Nl cnQodm9pZCAqZGF0YSkKK3sKKwlzdHJ1Y3QgcmVzZXRfY29udHJvbCAqcnN0ID0gZGF0YTsKKwor CXJlc2V0X2NvbnRyb2xfYXNzZXJ0KHJzdCk7Cit9CisKK3N0YXRpYyB2b2lkIGFzcGVlZF9wd21f Y2hpcF9yZW1vdmUodm9pZCAqZGF0YSkKK3sKKwlzdHJ1Y3QgcHdtX2NoaXAgKmNoaXAgPSBkYXRh OworCisJcHdtY2hpcF9yZW1vdmUoY2hpcCk7Cit9CisKK3N0YXRpYyBpbnQgYXNwZWVkX3B3bV9w cm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXN0cnVjdCBkZXZpY2UgKmRl diA9ICZwZGV2LT5kZXY7CisJaW50IHJldDsKKwlzdHJ1Y3QgYXNwZWVkX3B3bV9kYXRhICpwcml2 OworCXN0cnVjdCBkZXZpY2Vfbm9kZSAqbnA7CisJc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGFy ZW50X2RldjsKKworCXByaXYgPSBkZXZtX2t6YWxsb2MoZGV2LCBzaXplb2YoKnByaXYpLCBHRlBf S0VSTkVMKTsKKwlpZiAoIXByaXYpCisJCXJldHVybiAtRU5PTUVNOworCisJbnAgPSBwZGV2LT5k ZXYucGFyZW50LT5vZl9ub2RlOworCWlmICghb2ZfZGV2aWNlX2lzX2NvbXBhdGlibGUobnAsICJh c3BlZWQsYXN0MjYwMC1wd20tdGFjaCIpKQorCQlyZXR1cm4gZGV2X2Vycl9wcm9iZShkZXYsIC1F Tk9ERVYsCisJCQkJICAgICAiVW5zdXBwb3J0ZWQgcHdtIGRldmljZSBiaW5kaW5nXG4iKTsKKwor CXByaXYtPnJlZ21hcCA9IHN5c2Nvbl9ub2RlX3RvX3JlZ21hcChucCk7CisJaWYgKElTX0VSUihw cml2LT5yZWdtYXApKQorCQlyZXR1cm4gZGV2X2Vycl9wcm9iZShkZXYsIFBUUl9FUlIocHJpdi0+ cmVnbWFwKSwKKwkJCQkgICAgICJDb3VsZG4ndCBnZXQgcmVnbWFwXG4iKTsKKworCXBhcmVudF9k ZXYgPSBvZl9maW5kX2RldmljZV9ieV9ub2RlKG5wKTsKKwlwcml2LT5jbGsgPSBkZXZtX2Nsa19n ZXRfZW5hYmxlZCgmcGFyZW50X2Rldi0+ZGV2LCBOVUxMKTsKKwlpZiAoSVNfRVJSKHByaXYtPmNs aykpCisJCXJldHVybiBkZXZfZXJyX3Byb2JlKGRldiwgUFRSX0VSUihwcml2LT5jbGspLAorCQkJ CSAgICAgIkNvdWxkbid0IGdldCBjbG9ja1xuIik7CisKKwlwcml2LT5yZXNldCA9IGRldm1fcmVz ZXRfY29udHJvbF9nZXRfc2hhcmVkKCZwYXJlbnRfZGV2LT5kZXYsIE5VTEwpOworCWlmIChJU19F UlIocHJpdi0+cmVzZXQpKQorCQlyZXR1cm4gZGV2X2Vycl9wcm9iZShkZXYsIFBUUl9FUlIocHJp di0+cmVzZXQpLAorCQkJCSAgICAgIkNvdWxkbid0IGdldCByZXNldCBjb250cm9sXG4iKTsKKwor CXJldCA9IHJlc2V0X2NvbnRyb2xfZGVhc3NlcnQocHJpdi0+cmVzZXQpOworCWlmIChyZXQpCisJ CXJldHVybiBkZXZfZXJyX3Byb2JlKGRldiwgcmV0LAorCQkJCSAgICAgIkNvdWxkbid0IGRlYXNz ZXJ0IHJlc2V0IGNvbnRyb2xcbiIpOworCisJcmV0ID0gZGV2bV9hZGRfYWN0aW9uX29yX3Jlc2V0 KGRldiwgYXNwZWVkX3B3bV9yZXNldF9hc3NlcnQsCisJCQkJICAgICAgIHByaXYtPnJlc2V0KTsK KwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJcHJpdi0+Y2hpcC5kZXYgPSBkZXY7CisJcHJp di0+Y2hpcC5vcHMgPSAmYXNwZWVkX3B3bV9vcHM7CisJcHJpdi0+Y2hpcC5ucHdtID0gUFdNX0FT UEVFRF9OUl9QV01TOworCisJcmV0ID0gcHdtY2hpcF9hZGQoJnByaXYtPmNoaXApOworCWlmIChy ZXQgPCAwKQorCQlyZXR1cm4gZGV2X2Vycl9wcm9iZShkZXYsIHJldCwgIkZhaWxlZCB0byBhZGQg UFdNIGNoaXBcbiIpOworCXJldCA9IGRldm1fYWRkX2FjdGlvbl9vcl9yZXNldChkZXYsIGFzcGVl ZF9wd21fY2hpcF9yZW1vdmUsCisJCQkJICAgICAgICZwcml2LT5jaGlwKTsKKwlpZiAocmV0KQor CQlyZXR1cm4gcmV0OworCXJldHVybiAwOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IG9mX2Rl dmljZV9pZCBvZl9wd21fbWF0Y2hfdGFibGVbXSA9IHsKKwl7CisJCS5jb21wYXRpYmxlID0gImFz cGVlZCxhc3QyNjAwLXB3bSIsCisJfSwKKwl7fSwKK307CitNT0RVTEVfREVWSUNFX1RBQkxFKG9m LCBvZl9wd21fbWF0Y2hfdGFibGUpOworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciBh c3BlZWRfcHdtX2RyaXZlciA9IHsKKwkucHJvYmUgPSBhc3BlZWRfcHdtX3Byb2JlLAorCS5kcml2 ZXIJPSB7CisJCS5uYW1lID0gImFzcGVlZC1wd20iLAorCQkub2ZfbWF0Y2hfdGFibGUgPSBvZl9w d21fbWF0Y2hfdGFibGUsCisJfSwKK307CisKK21vZHVsZV9wbGF0Zm9ybV9kcml2ZXIoYXNwZWVk X3B3bV9kcml2ZXIpOworCitNT0RVTEVfQVVUSE9SKCJCaWxseSBUc2FpIDxiaWxseV90c2FpQGFz cGVlZHRlY2guY29tPiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJBc3BlZWQgYXN0MjYwMCBQV00g ZGV2aWNlIGRyaXZlciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCB2MiIpOwotLSAKMi4yNS4xCgoK X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KbGludXgtYXJt LWtlcm5lbCBtYWlsaW5nIGxpc3QKbGludXgtYXJtLWtlcm5lbEBsaXN0cy5pbmZyYWRlYWQub3Jn Cmh0dHA6Ly9saXN0cy5pbmZyYWRlYWQub3JnL21haWxtYW4vbGlzdGluZm8vbGludXgtYXJtLWtl cm5lbAo=