From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from new2-smtp.messagingengine.com (new2-smtp.messagingengine.com [66.111.4.224]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 7A1743C30 for ; Sat, 31 Dec 2022 23:55:47 +0000 (UTC) Received: from compute6.internal (compute6.nyi.internal [10.202.2.47]) by mailnew.nyi.internal (Postfix) with ESMTP id A5DBE5818E9; Sat, 31 Dec 2022 18:55:46 -0500 (EST) Received: from mailfrontend1 ([10.202.2.162]) by compute6.internal (MEProxy); Sat, 31 Dec 2022 18:55:46 -0500 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=sholland.org; h= cc:cc:content-transfer-encoding:content-type:date:date:from:from :in-reply-to:in-reply-to:message-id:mime-version:references :reply-to:sender:subject:subject:to:to; s=fm3; t=1672530946; x= 1672538146; bh=7Wg6ivlkRA3pIYK6Ni6Jp9lhN0AnyA03J44uqUPbIXo=; b=a EVPByOAjFe8AoSUbxKPsKKCG6eSPN6dqxroYvYM3VSUc+A2BjnBBx/FJ53plZtHf NhH2NpBIeIm3tUOAVTT6e7Ci5P4xMnTyHTVOXv6f6qkJYmbaQyqh5Ul9FeWPv5y9 oOiuIYtXMDdxqmZ8yZqWNG0bEQ+iun5ZQGjKL4YNFvuz61GL9zgtZeE6QY1mYbfp 3mDeSkCf+wvmp+u/1Ttig9d5vVyO9qlyPbk+fXfDSHIwMzsU7NQ12qffFcUObR5z egPGNB4V7G3Vl+7o2Fo2IzIy5xw/aMlySiYn2bFHd0qvfNsh/1nI4TmLjnKDMtnh FVWVpi7gRe2HtoMDrAqhA== DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d= messagingengine.com; h=cc:cc:content-transfer-encoding :content-type:date:date:feedback-id:feedback-id:from:from :in-reply-to:in-reply-to:message-id:mime-version:references :reply-to:sender:subject:subject:to:to:x-me-proxy:x-me-proxy :x-me-sender:x-me-sender:x-sasl-enc; s=fm2; t=1672530946; x= 1672538146; bh=7Wg6ivlkRA3pIYK6Ni6Jp9lhN0AnyA03J44uqUPbIXo=; b=w twg+zwkPAI1VwdD9kBjE5GTQKOi40Nw7eA5o+knJCRATzOsh2jOSbV+bTz05jShi y7YJuZElQhVERzYCFcqP+jLW9vozMPtDdQiZlb23SajQuvqlK0+Byiz3bNsb9d6c YSOiUtkWen72C5Om77rNtpwpdp+IOYOzZ70VHivW/Wv2IVaeRVtiZ4HiSizzP7uu sQYn5WsJD0paRDavGi41icyfjYGKN3s/gzD02ZovniCi65IHRE44OojwT+6sNZw8 fMgu8K6rUBXWO8lP5LuWFcMxjRTkpk8RnCQNvXsnCL8Wa8Dm5HG3Pq7p0X/pamsp kyAM3LvWv54IqgsSc/MQA== X-ME-Sender: X-ME-Received: X-ME-Proxy-Cause: gggruggvucftvghtrhhoucdtuddrgedvhedrieelgddujecutefuodetggdotefrodftvf curfhrohhfihhlvgemucfhrghsthforghilhdpqfgfvfdpuffrtefokffrpgfnqfghnecu uegrihhlohhuthemuceftddtnecusecvtfgvtghiphhivghnthhsucdlqddutddtmdenuc fjughrpefhvfevufffkffojghfgggtgfesthekredtredtjeenucfhrhhomhepufgrmhhu vghlucfjohhllhgrnhguuceoshgrmhhuvghlsehshhholhhlrghnugdrohhrgheqnecugg ftrfgrthhtvghrnhepfeeuveeufeefleehlefhleeglefggfeikeffveetfeevjeeuieet uefgfeeiheelnecuvehluhhsthgvrhfuihiivgeptdenucfrrghrrghmpehmrghilhhfrh homhepshgrmhhuvghlsehshhholhhlrghnugdrohhrgh X-ME-Proxy: Feedback-ID: i0ad843c9:Fastmail Received: by mail.messagingengine.com (Postfix) with ESMTPA; Sat, 31 Dec 2022 18:55:45 -0500 (EST) From: Samuel Holland To: Lee Jones , Pavel Machek , linux-leds@vger.kernel.org, Chen-Yu Tsai , Jernej Skrabec Cc: Samuel Holland , Albert Ou , Conor Dooley , Guo Ren , Heiko Stuebner , Heiko Stuebner , Jisheng Zhang , Krzysztof Kozlowski , Palmer Dabbelt , Paul Walmsley , Philipp Zabel , Rob Herring , devicetree@vger.kernel.org, linux-arm-kernel@lists.infradead.org, linux-kernel@vger.kernel.org, linux-riscv@lists.infradead.org, linux-sunxi@lists.linux.dev Subject: [RESEND PATCH v7 2/5] leds: sun50i-a100: New driver for the A100 LED controller Date: Sat, 31 Dec 2022 17:55:37 -0600 Message-Id: <20221231235541.13568-3-samuel@sholland.org> X-Mailer: git-send-email 2.37.4 In-Reply-To: <20221231235541.13568-1-samuel@sholland.org> References: <20221231235541.13568-1-samuel@sholland.org> Precedence: bulk X-Mailing-List: linux-sunxi@lists.linux.dev List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Some Allwinner sunxi SoCs, starting with the A100, contain an LED controller designed to drive RGB LED pixels. Add a driver for it using the multicolor LED framework, and with LEDs defined in the device tree. Acked-by: Jernej Skrabec Signed-off-by: Samuel Holland --- Changes in v7: - Use DEFINE_SIMPLE_DEV_PM_OPS Changes in v5: - Rename the driver R329 -> A100, since that is the actual original implementation Changes in v4: - Depend on LEDS_CLASS_MULTICOLOR Changes in v3: - Added vendor prefix to timing/format properties - Renamed "format" property to "pixel-format" for clarity - Dropped "vled-supply" as it is unrelated to the controller hardware - Changed "writesl" to "iowrite32_rep" so the driver builds on hppa Changes in v2: - Renamed from sunxi-ledc to sun50i-r329-ledc - Added missing "static" to functions/globals as reported by 0day bot drivers/leds/Kconfig | 9 + drivers/leds/Makefile | 1 + drivers/leds/leds-sun50i-a100.c | 555 ++++++++++++++++++++++++++++++++ 3 files changed, 565 insertions(+) create mode 100644 drivers/leds/leds-sun50i-a100.c diff --git a/drivers/leds/Kconfig b/drivers/leds/Kconfig index 499d0f215a8b..4f4c515ed7d7 100644 --- a/drivers/leds/Kconfig +++ b/drivers/leds/Kconfig @@ -281,6 +281,15 @@ config LEDS_COBALT_RAQ help This option enables support for the Cobalt Raq series LEDs. +config LEDS_SUN50I_A100 + tristate "LED support for Allwinner A100 RGB LED controller" + depends on LEDS_CLASS_MULTICOLOR && OF + depends on ARCH_SUNXI || COMPILE_TEST + help + This option enables support for the RGB LED controller found + in some Allwinner sunxi SoCs, includeing A100, R329, and D1. + It uses a one-wire interface to control up to 1024 LEDs. + config LEDS_SUNFIRE tristate "LED support for SunFire servers." depends on LEDS_CLASS diff --git a/drivers/leds/Makefile b/drivers/leds/Makefile index 4fd2f92cd198..a6ee3f5cf7be 100644 --- a/drivers/leds/Makefile +++ b/drivers/leds/Makefile @@ -76,6 +76,7 @@ obj-$(CONFIG_LEDS_PWM) += leds-pwm.o obj-$(CONFIG_LEDS_REGULATOR) += leds-regulator.o obj-$(CONFIG_LEDS_S3C24XX) += leds-s3c24xx.o obj-$(CONFIG_LEDS_SC27XX_BLTC) += leds-sc27xx-bltc.o +obj-$(CONFIG_LEDS_SUN50I_A100) += leds-sun50i-a100.o obj-$(CONFIG_LEDS_SUNFIRE) += leds-sunfire.o obj-$(CONFIG_LEDS_SYSCON) += leds-syscon.o obj-$(CONFIG_LEDS_TCA6507) += leds-tca6507.o diff --git a/drivers/leds/leds-sun50i-a100.c b/drivers/leds/leds-sun50i-a100.c new file mode 100644 index 000000000000..30fa9be2cf2d --- /dev/null +++ b/drivers/leds/leds-sun50i-a100.c @@ -0,0 +1,555 @@ +// SPDX-License-Identifier: GPL-2.0 +// +// Copyright (c) 2021-2022 Samuel Holland +// +// Partly based on drivers/leds/leds-turris-omnia.c, which is: +// Copyright (c) 2020 by Marek BehĂșn +// + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#define LEDC_CTRL_REG 0x0000 +#define LEDC_CTRL_REG_DATA_LENGTH (0x1fff << 16) +#define LEDC_CTRL_REG_RGB_MODE (0x7 << 6) +#define LEDC_CTRL_REG_LEDC_EN BIT(0) +#define LEDC_T01_TIMING_CTRL_REG 0x0004 +#define LEDC_T01_TIMING_CTRL_REG_T1H (0x3f << 21) +#define LEDC_T01_TIMING_CTRL_REG_T1L (0x1f << 16) +#define LEDC_T01_TIMING_CTRL_REG_T0H (0x1f << 6) +#define LEDC_T01_TIMING_CTRL_REG_T0L (0x3f << 0) +#define LEDC_RESET_TIMING_CTRL_REG 0x000c +#define LEDC_RESET_TIMING_CTRL_REG_LED_NUM (0x3ff << 0) +#define LEDC_DATA_REG 0x0014 +#define LEDC_DMA_CTRL_REG 0x0018 +#define LEDC_DMA_CTRL_REG_FIFO_TRIG_LEVEL (0x1f << 0) +#define LEDC_INT_CTRL_REG 0x001c +#define LEDC_INT_CTRL_REG_GLOBAL_INT_EN BIT(5) +#define LEDC_INT_CTRL_REG_FIFO_CPUREQ_INT_EN BIT(1) +#define LEDC_INT_CTRL_REG_TRANS_FINISH_INT_EN BIT(0) +#define LEDC_INT_STS_REG 0x0020 +#define LEDC_INT_STS_REG_FIFO_CPUREQ_INT BIT(1) +#define LEDC_INT_STS_REG_TRANS_FINISH_INT BIT(0) + +#define LEDC_FIFO_DEPTH 32 +#define LEDC_MAX_LEDS 1024 + +#define LEDS_TO_BYTES(n) ((n) * sizeof(u32)) + +struct sun50i_a100_ledc_led { + struct led_classdev_mc mc_cdev; + struct mc_subled subled_info[3]; +}; + +#define to_ledc_led(mc) container_of(mc, struct sun50i_a100_ledc_led, mc_cdev) + +struct sun50i_a100_ledc_timing { + u32 t0h_ns; + u32 t0l_ns; + u32 t1h_ns; + u32 t1l_ns; + u32 treset_ns; +}; + +struct sun50i_a100_ledc { + struct device *dev; + void __iomem *base; + struct clk *bus_clk; + struct clk *mod_clk; + struct reset_control *reset; + + u32 *buffer; + struct dma_chan *dma_chan; + dma_addr_t dma_handle; + int pio_length; + int pio_offset; + + spinlock_t lock; + int next_length; + bool xfer_active; + + u32 format; + struct sun50i_a100_ledc_timing timing; + + int num_leds; + struct sun50i_a100_ledc_led leds[]; +}; + +static int sun50i_a100_ledc_dma_xfer(struct sun50i_a100_ledc *priv, int length) +{ + struct dma_async_tx_descriptor *desc; + dma_cookie_t cookie; + + desc = dmaengine_prep_slave_single(priv->dma_chan, priv->dma_handle, + LEDS_TO_BYTES(length), + DMA_MEM_TO_DEV, 0); + if (!desc) + return -ENOMEM; + + cookie = dmaengine_submit(desc); + if (dma_submit_error(cookie)) + return -EIO; + + dma_async_issue_pending(priv->dma_chan); + + return 0; +} + +static void sun50i_a100_ledc_pio_xfer(struct sun50i_a100_ledc *priv, int length) +{ + u32 burst, offset, val; + + if (length) { + /* New transfer (FIFO is empty). */ + offset = 0; + burst = min(length, LEDC_FIFO_DEPTH); + } else { + /* Existing transfer (FIFO is half-full). */ + length = priv->pio_length; + offset = priv->pio_offset; + burst = min(length, LEDC_FIFO_DEPTH / 2); + } + + iowrite32_rep(priv->base + LEDC_DATA_REG, priv->buffer + offset, burst); + + if (burst < length) { + priv->pio_length = length - burst; + priv->pio_offset = offset + burst; + + if (!offset) { + val = readl(priv->base + LEDC_INT_CTRL_REG); + val |= LEDC_INT_CTRL_REG_FIFO_CPUREQ_INT_EN; + writel(val, priv->base + LEDC_INT_CTRL_REG); + } + } else { + /* Disable the request IRQ once all data is written. */ + val = readl(priv->base + LEDC_INT_CTRL_REG); + val &= ~LEDC_INT_CTRL_REG_FIFO_CPUREQ_INT_EN; + writel(val, priv->base + LEDC_INT_CTRL_REG); + } +} + +static void sun50i_a100_ledc_start_xfer(struct sun50i_a100_ledc *priv, + int length) +{ + u32 val; + + dev_dbg(priv->dev, "Updating %d LEDs\n", length); + + val = readl(priv->base + LEDC_CTRL_REG); + val &= ~LEDC_CTRL_REG_DATA_LENGTH; + val |= length << 16 | LEDC_CTRL_REG_LEDC_EN; + writel(val, priv->base + LEDC_CTRL_REG); + + if (length > LEDC_FIFO_DEPTH) { + int ret = sun50i_a100_ledc_dma_xfer(priv, length); + + if (!ret) + return; + + dev_warn(priv->dev, "Failed to set up DMA: %d\n", ret); + } + + sun50i_a100_ledc_pio_xfer(priv, length); +} + +static irqreturn_t sun50i_a100_ledc_irq(int irq, void *dev_id) +{ + struct sun50i_a100_ledc *priv = dev_id; + u32 val; + + val = readl(priv->base + LEDC_INT_STS_REG); + + if (val & LEDC_INT_STS_REG_TRANS_FINISH_INT) { + int next_length; + + /* Start the next transfer if needed. */ + spin_lock(&priv->lock); + next_length = priv->next_length; + if (next_length) + priv->next_length = 0; + else + priv->xfer_active = false; + spin_unlock(&priv->lock); + + if (next_length) + sun50i_a100_ledc_start_xfer(priv, next_length); + } else if (val & LEDC_INT_STS_REG_FIFO_CPUREQ_INT) { + /* Continue the current transfer. */ + sun50i_a100_ledc_pio_xfer(priv, 0); + } + + writel(val, priv->base + LEDC_INT_STS_REG); + + return IRQ_HANDLED; +} + +static void sun50i_a100_ledc_brightness_set(struct led_classdev *cdev, + enum led_brightness brightness) +{ + struct sun50i_a100_ledc *priv = dev_get_drvdata(cdev->dev->parent); + struct led_classdev_mc *mc_cdev = lcdev_to_mccdev(cdev); + struct sun50i_a100_ledc_led *led = to_ledc_led(mc_cdev); + int addr = led - priv->leds; + unsigned long flags; + bool xfer_active; + int next_length; + + led_mc_calc_color_components(mc_cdev, brightness); + + priv->buffer[addr] = led->subled_info[0].brightness << 16 | + led->subled_info[1].brightness << 8 | + led->subled_info[2].brightness; + + dev_dbg(priv->dev, "LED %d -> #%06x\n", addr, priv->buffer[addr]); + + spin_lock_irqsave(&priv->lock, flags); + next_length = max(priv->next_length, addr + 1); + xfer_active = priv->xfer_active; + if (xfer_active) + priv->next_length = next_length; + else + priv->xfer_active = true; + spin_unlock_irqrestore(&priv->lock, flags); + + if (!xfer_active) + sun50i_a100_ledc_start_xfer(priv, next_length); +} + +static const char *const sun50i_a100_ledc_formats[] = { + "rgb", + "rbg", + "grb", + "gbr", + "brg", + "bgr", +}; + +static int sun50i_a100_ledc_parse_format(const struct device_node *np, + struct sun50i_a100_ledc *priv) +{ + const char *format = "grb"; + u32 i; + + of_property_read_string(np, "allwinner,pixel-format", &format); + + for (i = 0; i < ARRAY_SIZE(sun50i_a100_ledc_formats); ++i) { + if (!strcmp(format, sun50i_a100_ledc_formats[i])) { + priv->format = i; + return 0; + } + } + + dev_err(priv->dev, "Bad pixel format '%s'\n", format); + + return -EINVAL; +} + +static void sun50i_a100_ledc_set_format(struct sun50i_a100_ledc *priv) +{ + u32 val; + + val = readl(priv->base + LEDC_CTRL_REG); + val &= ~LEDC_CTRL_REG_RGB_MODE; + val |= priv->format << 6; + writel(val, priv->base + LEDC_CTRL_REG); +} + +static const struct sun50i_a100_ledc_timing sun50i_a100_ledc_default_timing = { + .t0h_ns = 336, + .t0l_ns = 840, + .t1h_ns = 882, + .t1l_ns = 294, + .treset_ns = 300000, +}; + +static int sun50i_a100_ledc_parse_timing(const struct device_node *np, + struct sun50i_a100_ledc *priv) +{ + struct sun50i_a100_ledc_timing *timing = &priv->timing; + + *timing = sun50i_a100_ledc_default_timing; + + of_property_read_u32(np, "allwinner,t0h-ns", &timing->t0h_ns); + of_property_read_u32(np, "allwinner,t0l-ns", &timing->t0l_ns); + of_property_read_u32(np, "allwinner,t1h-ns", &timing->t1h_ns); + of_property_read_u32(np, "allwinner,t1l-ns", &timing->t1l_ns); + of_property_read_u32(np, "allwinner,treset-ns", &timing->treset_ns); + + return 0; +} + +static void sun50i_a100_ledc_set_timing(struct sun50i_a100_ledc *priv) +{ + const struct sun50i_a100_ledc_timing *timing = &priv->timing; + unsigned long mod_freq = clk_get_rate(priv->mod_clk); + u32 cycle_ns = NSEC_PER_SEC / mod_freq; + u32 val; + + val = (timing->t1h_ns / cycle_ns) << 21 | + (timing->t1l_ns / cycle_ns) << 16 | + (timing->t0h_ns / cycle_ns) << 6 | + (timing->t0l_ns / cycle_ns); + writel(val, priv->base + LEDC_T01_TIMING_CTRL_REG); + + val = (timing->treset_ns / cycle_ns) << 16 | + (priv->num_leds - 1); + writel(val, priv->base + LEDC_RESET_TIMING_CTRL_REG); +} + +static int sun50i_a100_ledc_resume(struct device *dev) +{ + struct sun50i_a100_ledc *priv = dev_get_drvdata(dev); + u32 val; + int ret; + + ret = reset_control_deassert(priv->reset); + if (ret) + return ret; + + ret = clk_prepare_enable(priv->bus_clk); + if (ret) + goto err_assert_reset; + + ret = clk_prepare_enable(priv->mod_clk); + if (ret) + goto err_disable_bus_clk; + + sun50i_a100_ledc_set_format(priv); + sun50i_a100_ledc_set_timing(priv); + + /* The trigger level must be at least the burst length. */ + val = readl(priv->base + LEDC_DMA_CTRL_REG); + val &= ~LEDC_DMA_CTRL_REG_FIFO_TRIG_LEVEL; + val |= LEDC_FIFO_DEPTH / 2; + writel(val, priv->base + LEDC_DMA_CTRL_REG); + + val = LEDC_INT_CTRL_REG_GLOBAL_INT_EN | + LEDC_INT_CTRL_REG_TRANS_FINISH_INT_EN; + writel(val, priv->base + LEDC_INT_CTRL_REG); + + return 0; + +err_disable_bus_clk: + clk_disable_unprepare(priv->bus_clk); +err_assert_reset: + reset_control_assert(priv->reset); + + return ret; +} + +static int sun50i_a100_ledc_suspend(struct device *dev) +{ + struct sun50i_a100_ledc *priv = dev_get_drvdata(dev); + + clk_disable_unprepare(priv->mod_clk); + clk_disable_unprepare(priv->bus_clk); + reset_control_assert(priv->reset); + + return 0; +} + +static void sun50i_a100_ledc_dma_cleanup(void *data) +{ + struct sun50i_a100_ledc *priv = data; + struct device *dma_dev = dmaengine_get_dma_device(priv->dma_chan); + + if (priv->buffer) + dma_free_wc(dma_dev, LEDS_TO_BYTES(priv->num_leds), + priv->buffer, priv->dma_handle); + dma_release_channel(priv->dma_chan); +} + +static int sun50i_a100_ledc_probe(struct platform_device *pdev) +{ + const struct device_node *np = pdev->dev.of_node; + struct dma_slave_config dma_cfg = {}; + struct led_init_data init_data = {}; + struct device *dev = &pdev->dev; + struct device_node *child; + struct sun50i_a100_ledc *priv; + struct resource *mem; + int count, irq, ret; + + count = of_get_available_child_count(np); + if (!count) + return -ENODEV; + if (count > LEDC_MAX_LEDS) { + dev_err(dev, "Too many LEDs! (max is %d)\n", LEDC_MAX_LEDS); + return -EINVAL; + } + + priv = devm_kzalloc(dev, struct_size(priv, leds, count), GFP_KERNEL); + if (!priv) + return -ENOMEM; + + priv->dev = dev; + priv->num_leds = count; + spin_lock_init(&priv->lock); + dev_set_drvdata(dev, priv); + + ret = sun50i_a100_ledc_parse_format(np, priv); + if (ret) + return ret; + + ret = sun50i_a100_ledc_parse_timing(np, priv); + if (ret) + return ret; + + priv->base = devm_platform_get_and_ioremap_resource(pdev, 0, &mem); + if (IS_ERR(priv->base)) + return PTR_ERR(priv->base); + + priv->bus_clk = devm_clk_get(dev, "bus"); + if (IS_ERR(priv->bus_clk)) + return PTR_ERR(priv->bus_clk); + + priv->mod_clk = devm_clk_get(dev, "mod"); + if (IS_ERR(priv->mod_clk)) + return PTR_ERR(priv->mod_clk); + + priv->reset = devm_reset_control_get_exclusive(dev, NULL); + if (IS_ERR(priv->reset)) + return PTR_ERR(priv->reset); + + priv->dma_chan = dma_request_chan(dev, "tx"); + if (IS_ERR(priv->dma_chan)) + return PTR_ERR(priv->dma_chan); + + ret = devm_add_action_or_reset(dev, sun50i_a100_ledc_dma_cleanup, priv); + if (ret) + return ret; + + dma_cfg.dst_addr = mem->start + LEDC_DATA_REG; + dma_cfg.dst_addr_width = DMA_SLAVE_BUSWIDTH_4_BYTES; + dma_cfg.dst_maxburst = LEDC_FIFO_DEPTH / 2; + ret = dmaengine_slave_config(priv->dma_chan, &dma_cfg); + if (ret) + return ret; + + priv->buffer = dma_alloc_wc(dmaengine_get_dma_device(priv->dma_chan), + LEDS_TO_BYTES(priv->num_leds), + &priv->dma_handle, GFP_KERNEL); + if (!priv->buffer) + return -ENOMEM; + + irq = platform_get_irq(pdev, 0); + if (irq < 0) + return irq; + + ret = devm_request_irq(dev, irq, sun50i_a100_ledc_irq, + 0, dev_name(dev), priv); + if (ret) + return ret; + + ret = sun50i_a100_ledc_resume(dev); + if (ret) + return ret; + + for_each_available_child_of_node(np, child) { + struct sun50i_a100_ledc_led *led; + struct led_classdev *cdev; + u32 addr, color; + + ret = of_property_read_u32(child, "reg", &addr); + if (ret || addr >= count) { + dev_err(dev, "LED 'reg' values must be from 0 to %d\n", + priv->num_leds - 1); + ret = -EINVAL; + goto err_put_child; + } + + ret = of_property_read_u32(child, "color", &color); + if (ret || color != LED_COLOR_ID_RGB) { + dev_err(dev, "LED 'color' must be LED_COLOR_ID_RGB\n"); + ret = -EINVAL; + goto err_put_child; + } + + led = &priv->leds[addr]; + + led->subled_info[0].color_index = LED_COLOR_ID_RED; + led->subled_info[0].channel = 0; + led->subled_info[1].color_index = LED_COLOR_ID_GREEN; + led->subled_info[1].channel = 1; + led->subled_info[2].color_index = LED_COLOR_ID_BLUE; + led->subled_info[2].channel = 2; + + led->mc_cdev.num_colors = ARRAY_SIZE(led->subled_info); + led->mc_cdev.subled_info = led->subled_info; + + cdev = &led->mc_cdev.led_cdev; + cdev->max_brightness = U8_MAX; + cdev->brightness_set = sun50i_a100_ledc_brightness_set; + + init_data.fwnode = of_fwnode_handle(child); + + ret = devm_led_classdev_multicolor_register_ext(dev, + &led->mc_cdev, + &init_data); + if (ret) { + dev_err(dev, "Failed to register LED %u: %d\n", + addr, ret); + goto err_put_child; + } + } + + dev_info(dev, "Registered %d LEDs\n", priv->num_leds); + + return 0; + +err_put_child: + of_node_put(child); + sun50i_a100_ledc_suspend(&pdev->dev); + + return ret; +} + +static int sun50i_a100_ledc_remove(struct platform_device *pdev) +{ + sun50i_a100_ledc_suspend(&pdev->dev); + + return 0; +} + +static void sun50i_a100_ledc_shutdown(struct platform_device *pdev) +{ + sun50i_a100_ledc_suspend(&pdev->dev); +} + +static const struct of_device_id sun50i_a100_ledc_of_match[] = { + { .compatible = "allwinner,sun50i-a100-ledc" }, + {} +}; +MODULE_DEVICE_TABLE(of, sun50i_a100_ledc_of_match); + +static DEFINE_SIMPLE_DEV_PM_OPS(sun50i_a100_ledc_pm, + sun50i_a100_ledc_suspend, + sun50i_a100_ledc_resume); + +static struct platform_driver sun50i_a100_ledc_driver = { + .probe = sun50i_a100_ledc_probe, + .remove = sun50i_a100_ledc_remove, + .shutdown = sun50i_a100_ledc_shutdown, + .driver = { + .name = "sun50i-a100-ledc", + .of_match_table = sun50i_a100_ledc_of_match, + .pm = pm_ptr(&sun50i_a100_ledc_pm), + }, +}; +module_platform_driver(sun50i_a100_ledc_driver); + +MODULE_AUTHOR("Samuel Holland "); +MODULE_DESCRIPTION("Allwinner A100 LED controller driver"); +MODULE_LICENSE("GPL"); -- 2.37.4 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 40CF5C4332F for ; Sun, 1 Jan 2023 00:07:33 +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=LmOahA3paPANN6fY+/6LdJMuf6QTpkQWOGoKMO7FLYU=; b=WH4BGdHVV4Fbza 4gtcXtMVwdanKDr0vzO4jLFPda+8QcaR7LCFWBN6voMJPIw3XebfiKpAlMJFf4xD1Nc7YX7A1Kjya W8nzZSHG0gQJBra8poALSenmV5JK14RlImNYqH287dVjnnh6ic/ZyBq9Pt3evG39RTeepp2A071lL Cjm4E8d+cc45ORP5K618sprZrwjmAz5JetFh839Oa36LAgwUKWcxUNxPFfjjYZbg3kwZ/yJ7DevT9 RC2JO6N19KdcPv6teFP1F4GW3503Y5qcHy2VTvvjnYCAfP392QkKAcgo8E0Hw87m8IHbDFjnqf1iN zAxaoC7KzGzMA4hKCEHA==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.94.2 #2 (Red Hat Linux)) id 1pBlrQ-00BlNA-Gj; Sun, 01 Jan 2023 00:05:57 +0000 Received: from new2-smtp.messagingengine.com ([66.111.4.224]) by bombadil.infradead.org with esmtps (Exim 4.94.2 #2 (Red Hat Linux)) id 1pBlhb-00Bfuz-H3; Sat, 31 Dec 2022 23:55:51 +0000 Received: from compute6.internal (compute6.nyi.internal [10.202.2.47]) by mailnew.nyi.internal (Postfix) with ESMTP id A5DBE5818E9; Sat, 31 Dec 2022 18:55:46 -0500 (EST) Received: from mailfrontend1 ([10.202.2.162]) by compute6.internal (MEProxy); Sat, 31 Dec 2022 18:55:46 -0500 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=sholland.org; h= cc:cc:content-transfer-encoding:content-type:date:date:from:from :in-reply-to:in-reply-to:message-id:mime-version:references :reply-to:sender:subject:subject:to:to; s=fm3; t=1672530946; x= 1672538146; bh=7Wg6ivlkRA3pIYK6Ni6Jp9lhN0AnyA03J44uqUPbIXo=; b=a EVPByOAjFe8AoSUbxKPsKKCG6eSPN6dqxroYvYM3VSUc+A2BjnBBx/FJ53plZtHf NhH2NpBIeIm3tUOAVTT6e7Ci5P4xMnTyHTVOXv6f6qkJYmbaQyqh5Ul9FeWPv5y9 oOiuIYtXMDdxqmZ8yZqWNG0bEQ+iun5ZQGjKL4YNFvuz61GL9zgtZeE6QY1mYbfp 3mDeSkCf+wvmp+u/1Ttig9d5vVyO9qlyPbk+fXfDSHIwMzsU7NQ12qffFcUObR5z egPGNB4V7G3Vl+7o2Fo2IzIy5xw/aMlySiYn2bFHd0qvfNsh/1nI4TmLjnKDMtnh FVWVpi7gRe2HtoMDrAqhA== DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d= messagingengine.com; h=cc:cc:content-transfer-encoding :content-type:date:date:feedback-id:feedback-id:from:from :in-reply-to:in-reply-to:message-id:mime-version:references :reply-to:sender:subject:subject:to:to:x-me-proxy:x-me-proxy :x-me-sender:x-me-sender:x-sasl-enc; s=fm2; t=1672530946; x= 1672538146; bh=7Wg6ivlkRA3pIYK6Ni6Jp9lhN0AnyA03J44uqUPbIXo=; b=w twg+zwkPAI1VwdD9kBjE5GTQKOi40Nw7eA5o+knJCRATzOsh2jOSbV+bTz05jShi y7YJuZElQhVERzYCFcqP+jLW9vozMPtDdQiZlb23SajQuvqlK0+Byiz3bNsb9d6c YSOiUtkWen72C5Om77rNtpwpdp+IOYOzZ70VHivW/Wv2IVaeRVtiZ4HiSizzP7uu sQYn5WsJD0paRDavGi41icyfjYGKN3s/gzD02ZovniCi65IHRE44OojwT+6sNZw8 fMgu8K6rUBXWO8lP5LuWFcMxjRTkpk8RnCQNvXsnCL8Wa8Dm5HG3Pq7p0X/pamsp kyAM3LvWv54IqgsSc/MQA== X-ME-Sender: X-ME-Received: X-ME-Proxy-Cause: gggruggvucftvghtrhhoucdtuddrgedvhedrieelgddujecutefuodetggdotefrodftvf curfhrohhfihhlvgemucfhrghsthforghilhdpqfgfvfdpuffrtefokffrpgfnqfghnecu uegrihhlohhuthemuceftddtnecusecvtfgvtghiphhivghnthhsucdlqddutddtmdenuc fjughrpefhvfevufffkffojghfgggtgfesthekredtredtjeenucfhrhhomhepufgrmhhu vghlucfjohhllhgrnhguuceoshgrmhhuvghlsehshhholhhlrghnugdrohhrgheqnecugg ftrfgrthhtvghrnhepfeeuveeufeefleehlefhleeglefggfeikeffveetfeevjeeuieet uefgfeeiheelnecuvehluhhsthgvrhfuihiivgeptdenucfrrghrrghmpehmrghilhhfrh homhepshgrmhhuvghlsehshhholhhlrghnugdrohhrgh X-ME-Proxy: Feedback-ID: i0ad843c9:Fastmail Received: by mail.messagingengine.com (Postfix) with ESMTPA; Sat, 31 Dec 2022 18:55:45 -0500 (EST) From: Samuel Holland To: Lee Jones , Pavel Machek , linux-leds@vger.kernel.org, Chen-Yu Tsai , Jernej Skrabec Cc: Samuel Holland , Albert Ou , Conor Dooley , Guo Ren , Heiko Stuebner , Heiko Stuebner , Jisheng Zhang , Krzysztof Kozlowski , Palmer Dabbelt , Paul Walmsley , Philipp Zabel , Rob Herring , devicetree@vger.kernel.org, linux-arm-kernel@lists.infradead.org, linux-kernel@vger.kernel.org, linux-riscv@lists.infradead.org, linux-sunxi@lists.linux.dev Subject: [RESEND PATCH v7 2/5] leds: sun50i-a100: New driver for the A100 LED controller Date: Sat, 31 Dec 2022 17:55:37 -0600 Message-Id: <20221231235541.13568-3-samuel@sholland.org> X-Mailer: git-send-email 2.37.4 In-Reply-To: <20221231235541.13568-1-samuel@sholland.org> References: <20221231235541.13568-1-samuel@sholland.org> MIME-Version: 1.0 X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20221231_155548_045737_404A9A4A X-CRM114-Status: GOOD ( 25.52 ) 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 U29tZSBBbGx3aW5uZXIgc3VueGkgU29Dcywgc3RhcnRpbmcgd2l0aCB0aGUgQTEwMCwgY29udGFp biBhbiBMRUQKY29udHJvbGxlciBkZXNpZ25lZCB0byBkcml2ZSBSR0IgTEVEIHBpeGVscy4gQWRk IGEgZHJpdmVyIGZvciBpdCB1c2luZwp0aGUgbXVsdGljb2xvciBMRUQgZnJhbWV3b3JrLCBhbmQg d2l0aCBMRURzIGRlZmluZWQgaW4gdGhlIGRldmljZSB0cmVlLgoKQWNrZWQtYnk6IEplcm5laiBT a3JhYmVjIDxqZXJuZWouc2tyYWJlY0BnbWFpbC5jb20+ClNpZ25lZC1vZmYtYnk6IFNhbXVlbCBI b2xsYW5kIDxzYW11ZWxAc2hvbGxhbmQub3JnPgotLS0KCkNoYW5nZXMgaW4gdjc6CiAtIFVzZSBE RUZJTkVfU0lNUExFX0RFVl9QTV9PUFMKCkNoYW5nZXMgaW4gdjU6CiAtIFJlbmFtZSB0aGUgZHJp dmVyIFIzMjkgLT4gQTEwMCwgc2luY2UgdGhhdCBpcyB0aGUgYWN0dWFsIG9yaWdpbmFsCiAgIGlt cGxlbWVudGF0aW9uCgpDaGFuZ2VzIGluIHY0OgogLSBEZXBlbmQgb24gTEVEU19DTEFTU19NVUxU SUNPTE9SCgpDaGFuZ2VzIGluIHYzOgogLSBBZGRlZCB2ZW5kb3IgcHJlZml4IHRvIHRpbWluZy9m b3JtYXQgcHJvcGVydGllcwogLSBSZW5hbWVkICJmb3JtYXQiIHByb3BlcnR5IHRvICJwaXhlbC1m b3JtYXQiIGZvciBjbGFyaXR5CiAtIERyb3BwZWQgInZsZWQtc3VwcGx5IiBhcyBpdCBpcyB1bnJl bGF0ZWQgdG8gdGhlIGNvbnRyb2xsZXIgaGFyZHdhcmUKIC0gQ2hhbmdlZCAid3JpdGVzbCIgdG8g Imlvd3JpdGUzMl9yZXAiIHNvIHRoZSBkcml2ZXIgYnVpbGRzIG9uIGhwcGEKCkNoYW5nZXMgaW4g djI6CiAtIFJlbmFtZWQgZnJvbSBzdW54aS1sZWRjIHRvIHN1bjUwaS1yMzI5LWxlZGMKIC0gQWRk ZWQgbWlzc2luZyAic3RhdGljIiB0byBmdW5jdGlvbnMvZ2xvYmFscyBhcyByZXBvcnRlZCBieSAw ZGF5IGJvdAoKIGRyaXZlcnMvbGVkcy9LY29uZmlnICAgICAgICAgICAgfCAgIDkgKwogZHJpdmVy cy9sZWRzL01ha2VmaWxlICAgICAgICAgICB8ICAgMSArCiBkcml2ZXJzL2xlZHMvbGVkcy1zdW41 MGktYTEwMC5jIHwgNTU1ICsrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrCiAzIGZpbGVz IGNoYW5nZWQsIDU2NSBpbnNlcnRpb25zKCspCiBjcmVhdGUgbW9kZSAxMDA2NDQgZHJpdmVycy9s ZWRzL2xlZHMtc3VuNTBpLWExMDAuYwoKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbGVkcy9LY29uZmln IGIvZHJpdmVycy9sZWRzL0tjb25maWcKaW5kZXggNDk5ZDBmMjE1YThiLi40ZjRjNTE1ZWQ3ZDcg MTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbGVkcy9LY29uZmlnCisrKyBiL2RyaXZlcnMvbGVkcy9LY29u ZmlnCkBAIC0yODEsNiArMjgxLDE1IEBAIGNvbmZpZyBMRURTX0NPQkFMVF9SQVEKIAloZWxwCiAJ ICBUaGlzIG9wdGlvbiBlbmFibGVzIHN1cHBvcnQgZm9yIHRoZSBDb2JhbHQgUmFxIHNlcmllcyBM RURzLgogCitjb25maWcgTEVEU19TVU41MElfQTEwMAorCXRyaXN0YXRlICJMRUQgc3VwcG9ydCBm b3IgQWxsd2lubmVyIEExMDAgUkdCIExFRCBjb250cm9sbGVyIgorCWRlcGVuZHMgb24gTEVEU19D TEFTU19NVUxUSUNPTE9SICYmIE9GCisJZGVwZW5kcyBvbiBBUkNIX1NVTlhJIHx8IENPTVBJTEVf VEVTVAorCWhlbHAKKwkgIFRoaXMgb3B0aW9uIGVuYWJsZXMgc3VwcG9ydCBmb3IgdGhlIFJHQiBM RUQgY29udHJvbGxlciBmb3VuZAorCSAgaW4gc29tZSBBbGx3aW5uZXIgc3VueGkgU29DcywgaW5j bHVkZWluZyBBMTAwLCBSMzI5LCBhbmQgRDEuCisJICBJdCB1c2VzIGEgb25lLXdpcmUgaW50ZXJm YWNlIHRvIGNvbnRyb2wgdXAgdG8gMTAyNCBMRURzLgorCiBjb25maWcgTEVEU19TVU5GSVJFCiAJ dHJpc3RhdGUgIkxFRCBzdXBwb3J0IGZvciBTdW5GaXJlIHNlcnZlcnMuIgogCWRlcGVuZHMgb24g TEVEU19DTEFTUwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9sZWRzL01ha2VmaWxlIGIvZHJpdmVycy9s ZWRzL01ha2VmaWxlCmluZGV4IDRmZDJmOTJjZDE5OC4uYTZlZTNmNWNmN2JlIDEwMDY0NAotLS0g YS9kcml2ZXJzL2xlZHMvTWFrZWZpbGUKKysrIGIvZHJpdmVycy9sZWRzL01ha2VmaWxlCkBAIC03 Niw2ICs3Niw3IEBAIG9iai0kKENPTkZJR19MRURTX1BXTSkJCQkrPSBsZWRzLXB3bS5vCiBvYmot JChDT05GSUdfTEVEU19SRUdVTEFUT1IpCQkrPSBsZWRzLXJlZ3VsYXRvci5vCiBvYmotJChDT05G SUdfTEVEU19TM0MyNFhYKQkJKz0gbGVkcy1zM2MyNHh4Lm8KIG9iai0kKENPTkZJR19MRURTX1ND MjdYWF9CTFRDKQkJKz0gbGVkcy1zYzI3eHgtYmx0Yy5vCitvYmotJChDT05GSUdfTEVEU19TVU41 MElfQTEwMCkJCSs9IGxlZHMtc3VuNTBpLWExMDAubwogb2JqLSQoQ09ORklHX0xFRFNfU1VORklS RSkJCSs9IGxlZHMtc3VuZmlyZS5vCiBvYmotJChDT05GSUdfTEVEU19TWVNDT04pCQkrPSBsZWRz LXN5c2Nvbi5vCiBvYmotJChDT05GSUdfTEVEU19UQ0E2NTA3KQkJKz0gbGVkcy10Y2E2NTA3Lm8K ZGlmZiAtLWdpdCBhL2RyaXZlcnMvbGVkcy9sZWRzLXN1bjUwaS1hMTAwLmMgYi9kcml2ZXJzL2xl ZHMvbGVkcy1zdW41MGktYTEwMC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAw MDAwMC4uMzBmYTliZTJjZjJkCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9sZWRzL2xlZHMt c3VuNTBpLWExMDAuYwpAQCAtMCwwICsxLDU1NSBAQAorLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZp ZXI6IEdQTC0yLjAKKy8vCisvLyBDb3B5cmlnaHQgKGMpIDIwMjEtMjAyMiBTYW11ZWwgSG9sbGFu ZCA8c2FtdWVsQHNob2xsYW5kLm9yZz4KKy8vCisvLyBQYXJ0bHkgYmFzZWQgb24gZHJpdmVycy9s ZWRzL2xlZHMtdHVycmlzLW9tbmlhLmMsIHdoaWNoIGlzOgorLy8gICAgIENvcHlyaWdodCAoYykg MjAyMCBieSBNYXJlayBCZWjDum4gPGthYmVsQGtlcm5lbC5vcmc+CisvLworCisjaW5jbHVkZSA8 bGludXgvY2xrLmg+CisjaW5jbHVkZSA8bGludXgvZG1hLW1hcHBpbmcuaD4KKyNpbmNsdWRlIDxs aW51eC9kbWFlbmdpbmUuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRl IDxsaW51eC9pby5oPgorI2luY2x1ZGUgPGxpbnV4L2xlZC1jbGFzcy1tdWx0aWNvbG9yLmg+Cisj aW5jbHVkZSA8bGludXgvbGVkcy5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1 ZGUgPGxpbnV4L29mLmg+CisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisjaW5j bHVkZSA8bGludXgvcG0uaD4KKyNpbmNsdWRlIDxsaW51eC9yZXNldC5oPgorI2luY2x1ZGUgPGxp bnV4L3NwaW5sb2NrLmg+CisKKyNkZWZpbmUgTEVEQ19DVFJMX1JFRwkJCTB4MDAwMAorI2RlZmlu ZSBMRURDX0NUUkxfUkVHX0RBVEFfTEVOR1RICQkoMHgxZmZmIDw8IDE2KQorI2RlZmluZSBMRURD X0NUUkxfUkVHX1JHQl9NT0RFCQkJKDB4NyA8PCA2KQorI2RlZmluZSBMRURDX0NUUkxfUkVHX0xF RENfRU4JCQlCSVQoMCkKKyNkZWZpbmUgTEVEQ19UMDFfVElNSU5HX0NUUkxfUkVHCTB4MDAwNAor I2RlZmluZSBMRURDX1QwMV9USU1JTkdfQ1RSTF9SRUdfVDFICQkoMHgzZiA8PCAyMSkKKyNkZWZp bmUgTEVEQ19UMDFfVElNSU5HX0NUUkxfUkVHX1QxTAkJKDB4MWYgPDwgMTYpCisjZGVmaW5lIExF RENfVDAxX1RJTUlOR19DVFJMX1JFR19UMEgJCSgweDFmIDw8IDYpCisjZGVmaW5lIExFRENfVDAx X1RJTUlOR19DVFJMX1JFR19UMEwJCSgweDNmIDw8IDApCisjZGVmaW5lIExFRENfUkVTRVRfVElN SU5HX0NUUkxfUkVHCTB4MDAwYworI2RlZmluZSBMRURDX1JFU0VUX1RJTUlOR19DVFJMX1JFR19M RURfTlVNCSgweDNmZiA8PCAwKQorI2RlZmluZSBMRURDX0RBVEFfUkVHCQkJMHgwMDE0CisjZGVm aW5lIExFRENfRE1BX0NUUkxfUkVHCQkweDAwMTgKKyNkZWZpbmUgTEVEQ19ETUFfQ1RSTF9SRUdf RklGT19UUklHX0xFVkVMCSgweDFmIDw8IDApCisjZGVmaW5lIExFRENfSU5UX0NUUkxfUkVHCQkw eDAwMWMKKyNkZWZpbmUgTEVEQ19JTlRfQ1RSTF9SRUdfR0xPQkFMX0lOVF9FTgkJQklUKDUpCisj ZGVmaW5lIExFRENfSU5UX0NUUkxfUkVHX0ZJRk9fQ1BVUkVRX0lOVF9FTglCSVQoMSkKKyNkZWZp bmUgTEVEQ19JTlRfQ1RSTF9SRUdfVFJBTlNfRklOSVNIX0lOVF9FTglCSVQoMCkKKyNkZWZpbmUg TEVEQ19JTlRfU1RTX1JFRwkJMHgwMDIwCisjZGVmaW5lIExFRENfSU5UX1NUU19SRUdfRklGT19D UFVSRVFfSU5UCUJJVCgxKQorI2RlZmluZSBMRURDX0lOVF9TVFNfUkVHX1RSQU5TX0ZJTklTSF9J TlQJQklUKDApCisKKyNkZWZpbmUgTEVEQ19GSUZPX0RFUFRICQkJMzIKKyNkZWZpbmUgTEVEQ19N QVhfTEVEUwkJCTEwMjQKKworI2RlZmluZSBMRURTX1RPX0JZVEVTKG4pCQkoKG4pICogc2l6ZW9m KHUzMikpCisKK3N0cnVjdCBzdW41MGlfYTEwMF9sZWRjX2xlZCB7CisJc3RydWN0IGxlZF9jbGFz c2Rldl9tYyBtY19jZGV2OworCXN0cnVjdCBtY19zdWJsZWQgc3VibGVkX2luZm9bM107Cit9Owor CisjZGVmaW5lIHRvX2xlZGNfbGVkKG1jKSBjb250YWluZXJfb2YobWMsIHN0cnVjdCBzdW41MGlf YTEwMF9sZWRjX2xlZCwgbWNfY2RldikKKworc3RydWN0IHN1bjUwaV9hMTAwX2xlZGNfdGltaW5n IHsKKwl1MzIgdDBoX25zOworCXUzMiB0MGxfbnM7CisJdTMyIHQxaF9uczsKKwl1MzIgdDFsX25z OworCXUzMiB0cmVzZXRfbnM7Cit9OworCitzdHJ1Y3Qgc3VuNTBpX2ExMDBfbGVkYyB7CisJc3Ry dWN0IGRldmljZSAqZGV2OworCXZvaWQgX19pb21lbSAqYmFzZTsKKwlzdHJ1Y3QgY2xrICpidXNf Y2xrOworCXN0cnVjdCBjbGsgKm1vZF9jbGs7CisJc3RydWN0IHJlc2V0X2NvbnRyb2wgKnJlc2V0 OworCisJdTMyICpidWZmZXI7CisJc3RydWN0IGRtYV9jaGFuICpkbWFfY2hhbjsKKwlkbWFfYWRk cl90IGRtYV9oYW5kbGU7CisJaW50IHBpb19sZW5ndGg7CisJaW50IHBpb19vZmZzZXQ7CisKKwlz cGlubG9ja190IGxvY2s7CisJaW50IG5leHRfbGVuZ3RoOworCWJvb2wgeGZlcl9hY3RpdmU7CisK Kwl1MzIgZm9ybWF0OworCXN0cnVjdCBzdW41MGlfYTEwMF9sZWRjX3RpbWluZyB0aW1pbmc7CisK KwlpbnQgbnVtX2xlZHM7CisJc3RydWN0IHN1bjUwaV9hMTAwX2xlZGNfbGVkIGxlZHNbXTsKK307 CisKK3N0YXRpYyBpbnQgc3VuNTBpX2ExMDBfbGVkY19kbWFfeGZlcihzdHJ1Y3Qgc3VuNTBpX2Ex MDBfbGVkYyAqcHJpdiwgaW50IGxlbmd0aCkKK3sKKwlzdHJ1Y3QgZG1hX2FzeW5jX3R4X2Rlc2Ny aXB0b3IgKmRlc2M7CisJZG1hX2Nvb2tpZV90IGNvb2tpZTsKKworCWRlc2MgPSBkbWFlbmdpbmVf cHJlcF9zbGF2ZV9zaW5nbGUocHJpdi0+ZG1hX2NoYW4sIHByaXYtPmRtYV9oYW5kbGUsCisJCQkJ CSAgIExFRFNfVE9fQllURVMobGVuZ3RoKSwKKwkJCQkJICAgRE1BX01FTV9UT19ERVYsIDApOwor CWlmICghZGVzYykKKwkJcmV0dXJuIC1FTk9NRU07CisKKwljb29raWUgPSBkbWFlbmdpbmVfc3Vi bWl0KGRlc2MpOworCWlmIChkbWFfc3VibWl0X2Vycm9yKGNvb2tpZSkpCisJCXJldHVybiAtRUlP OworCisJZG1hX2FzeW5jX2lzc3VlX3BlbmRpbmcocHJpdi0+ZG1hX2NoYW4pOworCisJcmV0dXJu IDA7Cit9CisKK3N0YXRpYyB2b2lkIHN1bjUwaV9hMTAwX2xlZGNfcGlvX3hmZXIoc3RydWN0IHN1 bjUwaV9hMTAwX2xlZGMgKnByaXYsIGludCBsZW5ndGgpCit7CisJdTMyIGJ1cnN0LCBvZmZzZXQs IHZhbDsKKworCWlmIChsZW5ndGgpIHsKKwkJLyogTmV3IHRyYW5zZmVyIChGSUZPIGlzIGVtcHR5 KS4gKi8KKwkJb2Zmc2V0ID0gMDsKKwkJYnVyc3QgID0gbWluKGxlbmd0aCwgTEVEQ19GSUZPX0RF UFRIKTsKKwl9IGVsc2UgeworCQkvKiBFeGlzdGluZyB0cmFuc2ZlciAoRklGTyBpcyBoYWxmLWZ1 bGwpLiAqLworCQlsZW5ndGggPSBwcml2LT5waW9fbGVuZ3RoOworCQlvZmZzZXQgPSBwcml2LT5w aW9fb2Zmc2V0OworCQlidXJzdCAgPSBtaW4obGVuZ3RoLCBMRURDX0ZJRk9fREVQVEggLyAyKTsK Kwl9CisKKwlpb3dyaXRlMzJfcmVwKHByaXYtPmJhc2UgKyBMRURDX0RBVEFfUkVHLCBwcml2LT5i dWZmZXIgKyBvZmZzZXQsIGJ1cnN0KTsKKworCWlmIChidXJzdCA8IGxlbmd0aCkgeworCQlwcml2 LT5waW9fbGVuZ3RoID0gbGVuZ3RoIC0gYnVyc3Q7CisJCXByaXYtPnBpb19vZmZzZXQgPSBvZmZz ZXQgKyBidXJzdDsKKworCQlpZiAoIW9mZnNldCkgeworCQkJdmFsID0gcmVhZGwocHJpdi0+YmFz ZSArIExFRENfSU5UX0NUUkxfUkVHKTsKKwkJCXZhbCB8PSBMRURDX0lOVF9DVFJMX1JFR19GSUZP X0NQVVJFUV9JTlRfRU47CisJCQl3cml0ZWwodmFsLCBwcml2LT5iYXNlICsgTEVEQ19JTlRfQ1RS TF9SRUcpOworCQl9CisJfSBlbHNlIHsKKwkJLyogRGlzYWJsZSB0aGUgcmVxdWVzdCBJUlEgb25j ZSBhbGwgZGF0YSBpcyB3cml0dGVuLiAqLworCQl2YWwgPSByZWFkbChwcml2LT5iYXNlICsgTEVE Q19JTlRfQ1RSTF9SRUcpOworCQl2YWwgJj0gfkxFRENfSU5UX0NUUkxfUkVHX0ZJRk9fQ1BVUkVR X0lOVF9FTjsKKwkJd3JpdGVsKHZhbCwgcHJpdi0+YmFzZSArIExFRENfSU5UX0NUUkxfUkVHKTsK Kwl9Cit9CisKK3N0YXRpYyB2b2lkIHN1bjUwaV9hMTAwX2xlZGNfc3RhcnRfeGZlcihzdHJ1Y3Qg c3VuNTBpX2ExMDBfbGVkYyAqcHJpdiwKKwkJCQkJaW50IGxlbmd0aCkKK3sKKwl1MzIgdmFsOwor CisJZGV2X2RiZyhwcml2LT5kZXYsICJVcGRhdGluZyAlZCBMRURzXG4iLCBsZW5ndGgpOworCisJ dmFsID0gcmVhZGwocHJpdi0+YmFzZSArIExFRENfQ1RSTF9SRUcpOworCXZhbCAmPSB+TEVEQ19D VFJMX1JFR19EQVRBX0xFTkdUSDsKKwl2YWwgfD0gbGVuZ3RoIDw8IDE2IHwgTEVEQ19DVFJMX1JF R19MRURDX0VOOworCXdyaXRlbCh2YWwsIHByaXYtPmJhc2UgKyBMRURDX0NUUkxfUkVHKTsKKwor CWlmIChsZW5ndGggPiBMRURDX0ZJRk9fREVQVEgpIHsKKwkJaW50IHJldCA9IHN1bjUwaV9hMTAw X2xlZGNfZG1hX3hmZXIocHJpdiwgbGVuZ3RoKTsKKworCQlpZiAoIXJldCkKKwkJCXJldHVybjsK KworCQlkZXZfd2Fybihwcml2LT5kZXYsICJGYWlsZWQgdG8gc2V0IHVwIERNQTogJWRcbiIsIHJl dCk7CisJfQorCisJc3VuNTBpX2ExMDBfbGVkY19waW9feGZlcihwcml2LCBsZW5ndGgpOworfQor CitzdGF0aWMgaXJxcmV0dXJuX3Qgc3VuNTBpX2ExMDBfbGVkY19pcnEoaW50IGlycSwgdm9pZCAq ZGV2X2lkKQoreworCXN0cnVjdCBzdW41MGlfYTEwMF9sZWRjICpwcml2ID0gZGV2X2lkOworCXUz MiB2YWw7CisKKwl2YWwgPSByZWFkbChwcml2LT5iYXNlICsgTEVEQ19JTlRfU1RTX1JFRyk7CisK KwlpZiAodmFsICYgTEVEQ19JTlRfU1RTX1JFR19UUkFOU19GSU5JU0hfSU5UKSB7CisJCWludCBu ZXh0X2xlbmd0aDsKKworCQkvKiBTdGFydCB0aGUgbmV4dCB0cmFuc2ZlciBpZiBuZWVkZWQuICov CisJCXNwaW5fbG9jaygmcHJpdi0+bG9jayk7CisJCW5leHRfbGVuZ3RoID0gcHJpdi0+bmV4dF9s ZW5ndGg7CisJCWlmIChuZXh0X2xlbmd0aCkKKwkJCXByaXYtPm5leHRfbGVuZ3RoID0gMDsKKwkJ ZWxzZQorCQkJcHJpdi0+eGZlcl9hY3RpdmUgPSBmYWxzZTsKKwkJc3Bpbl91bmxvY2soJnByaXYt PmxvY2spOworCisJCWlmIChuZXh0X2xlbmd0aCkKKwkJCXN1bjUwaV9hMTAwX2xlZGNfc3RhcnRf eGZlcihwcml2LCBuZXh0X2xlbmd0aCk7CisJfSBlbHNlIGlmICh2YWwgJiBMRURDX0lOVF9TVFNf UkVHX0ZJRk9fQ1BVUkVRX0lOVCkgeworCQkvKiBDb250aW51ZSB0aGUgY3VycmVudCB0cmFuc2Zl ci4gKi8KKwkJc3VuNTBpX2ExMDBfbGVkY19waW9feGZlcihwcml2LCAwKTsKKwl9CisKKwl3cml0 ZWwodmFsLCBwcml2LT5iYXNlICsgTEVEQ19JTlRfU1RTX1JFRyk7CisKKwlyZXR1cm4gSVJRX0hB TkRMRUQ7Cit9CisKK3N0YXRpYyB2b2lkIHN1bjUwaV9hMTAwX2xlZGNfYnJpZ2h0bmVzc19zZXQo c3RydWN0IGxlZF9jbGFzc2RldiAqY2RldiwKKwkJCQkJICAgIGVudW0gbGVkX2JyaWdodG5lc3Mg YnJpZ2h0bmVzcykKK3sKKwlzdHJ1Y3Qgc3VuNTBpX2ExMDBfbGVkYyAqcHJpdiA9IGRldl9nZXRf ZHJ2ZGF0YShjZGV2LT5kZXYtPnBhcmVudCk7CisJc3RydWN0IGxlZF9jbGFzc2Rldl9tYyAqbWNf Y2RldiA9IGxjZGV2X3RvX21jY2RldihjZGV2KTsKKwlzdHJ1Y3Qgc3VuNTBpX2ExMDBfbGVkY19s ZWQgKmxlZCA9IHRvX2xlZGNfbGVkKG1jX2NkZXYpOworCWludCBhZGRyID0gbGVkIC0gcHJpdi0+ bGVkczsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWJvb2wgeGZlcl9hY3RpdmU7CisJaW50IG5l eHRfbGVuZ3RoOworCisJbGVkX21jX2NhbGNfY29sb3JfY29tcG9uZW50cyhtY19jZGV2LCBicmln aHRuZXNzKTsKKworCXByaXYtPmJ1ZmZlclthZGRyXSA9IGxlZC0+c3VibGVkX2luZm9bMF0uYnJp Z2h0bmVzcyA8PCAxNiB8CisJCQkgICAgIGxlZC0+c3VibGVkX2luZm9bMV0uYnJpZ2h0bmVzcyA8 PCAgOCB8CisJCQkgICAgIGxlZC0+c3VibGVkX2luZm9bMl0uYnJpZ2h0bmVzczsKKworCWRldl9k YmcocHJpdi0+ZGV2LCAiTEVEICVkIC0+ICMlMDZ4XG4iLCBhZGRyLCBwcml2LT5idWZmZXJbYWRk cl0pOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnByaXYtPmxvY2ssIGZsYWdzKTsKKwluZXh0X2xl bmd0aCA9IG1heChwcml2LT5uZXh0X2xlbmd0aCwgYWRkciArIDEpOworCXhmZXJfYWN0aXZlID0g cHJpdi0+eGZlcl9hY3RpdmU7CisJaWYgKHhmZXJfYWN0aXZlKQorCQlwcml2LT5uZXh0X2xlbmd0 aCA9IG5leHRfbGVuZ3RoOworCWVsc2UKKwkJcHJpdi0+eGZlcl9hY3RpdmUgPSB0cnVlOworCXNw aW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXYtPmxvY2ssIGZsYWdzKTsKKworCWlmICgheGZlcl9h Y3RpdmUpCisJCXN1bjUwaV9hMTAwX2xlZGNfc3RhcnRfeGZlcihwcml2LCBuZXh0X2xlbmd0aCk7 Cit9CisKK3N0YXRpYyBjb25zdCBjaGFyICpjb25zdCBzdW41MGlfYTEwMF9sZWRjX2Zvcm1hdHNb XSA9IHsKKwkicmdiIiwKKwkicmJnIiwKKwkiZ3JiIiwKKwkiZ2JyIiwKKwkiYnJnIiwKKwkiYmdy IiwKK307CisKK3N0YXRpYyBpbnQgc3VuNTBpX2ExMDBfbGVkY19wYXJzZV9mb3JtYXQoY29uc3Qg c3RydWN0IGRldmljZV9ub2RlICpucCwKKwkJCQkJIHN0cnVjdCBzdW41MGlfYTEwMF9sZWRjICpw cml2KQoreworCWNvbnN0IGNoYXIgKmZvcm1hdCA9ICJncmIiOworCXUzMiBpOworCisJb2ZfcHJv cGVydHlfcmVhZF9zdHJpbmcobnAsICJhbGx3aW5uZXIscGl4ZWwtZm9ybWF0IiwgJmZvcm1hdCk7 CisKKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShzdW41MGlfYTEwMF9sZWRjX2Zvcm1hdHMp OyArK2kpIHsKKwkJaWYgKCFzdHJjbXAoZm9ybWF0LCBzdW41MGlfYTEwMF9sZWRjX2Zvcm1hdHNb aV0pKSB7CisJCQlwcml2LT5mb3JtYXQgPSBpOworCQkJcmV0dXJuIDA7CisJCX0KKwl9CisKKwlk ZXZfZXJyKHByaXYtPmRldiwgIkJhZCBwaXhlbCBmb3JtYXQgJyVzJ1xuIiwgZm9ybWF0KTsKKwor CXJldHVybiAtRUlOVkFMOworfQorCitzdGF0aWMgdm9pZCBzdW41MGlfYTEwMF9sZWRjX3NldF9m b3JtYXQoc3RydWN0IHN1bjUwaV9hMTAwX2xlZGMgKnByaXYpCit7CisJdTMyIHZhbDsKKworCXZh bCA9IHJlYWRsKHByaXYtPmJhc2UgKyBMRURDX0NUUkxfUkVHKTsKKwl2YWwgJj0gfkxFRENfQ1RS TF9SRUdfUkdCX01PREU7CisJdmFsIHw9IHByaXYtPmZvcm1hdCA8PCA2OworCXdyaXRlbCh2YWws IHByaXYtPmJhc2UgKyBMRURDX0NUUkxfUkVHKTsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBz dW41MGlfYTEwMF9sZWRjX3RpbWluZyBzdW41MGlfYTEwMF9sZWRjX2RlZmF1bHRfdGltaW5nID0g eworCS50MGhfbnMgPSAzMzYsCisJLnQwbF9ucyA9IDg0MCwKKwkudDFoX25zID0gODgyLAorCS50 MWxfbnMgPSAyOTQsCisJLnRyZXNldF9ucyA9IDMwMDAwMCwKK307CisKK3N0YXRpYyBpbnQgc3Vu NTBpX2ExMDBfbGVkY19wYXJzZV90aW1pbmcoY29uc3Qgc3RydWN0IGRldmljZV9ub2RlICpucCwK KwkJCQkJIHN0cnVjdCBzdW41MGlfYTEwMF9sZWRjICpwcml2KQoreworCXN0cnVjdCBzdW41MGlf YTEwMF9sZWRjX3RpbWluZyAqdGltaW5nID0gJnByaXYtPnRpbWluZzsKKworCSp0aW1pbmcgPSBz dW41MGlfYTEwMF9sZWRjX2RlZmF1bHRfdGltaW5nOworCisJb2ZfcHJvcGVydHlfcmVhZF91MzIo bnAsICJhbGx3aW5uZXIsdDBoLW5zIiwgJnRpbWluZy0+dDBoX25zKTsKKwlvZl9wcm9wZXJ0eV9y ZWFkX3UzMihucCwgImFsbHdpbm5lcix0MGwtbnMiLCAmdGltaW5nLT50MGxfbnMpOworCW9mX3By b3BlcnR5X3JlYWRfdTMyKG5wLCAiYWxsd2lubmVyLHQxaC1ucyIsICZ0aW1pbmctPnQxaF9ucyk7 CisJb2ZfcHJvcGVydHlfcmVhZF91MzIobnAsICJhbGx3aW5uZXIsdDFsLW5zIiwgJnRpbWluZy0+ dDFsX25zKTsKKwlvZl9wcm9wZXJ0eV9yZWFkX3UzMihucCwgImFsbHdpbm5lcix0cmVzZXQtbnMi LCAmdGltaW5nLT50cmVzZXRfbnMpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHN1 bjUwaV9hMTAwX2xlZGNfc2V0X3RpbWluZyhzdHJ1Y3Qgc3VuNTBpX2ExMDBfbGVkYyAqcHJpdikK K3sKKwljb25zdCBzdHJ1Y3Qgc3VuNTBpX2ExMDBfbGVkY190aW1pbmcgKnRpbWluZyA9ICZwcml2 LT50aW1pbmc7CisJdW5zaWduZWQgbG9uZyBtb2RfZnJlcSA9IGNsa19nZXRfcmF0ZShwcml2LT5t b2RfY2xrKTsKKwl1MzIgY3ljbGVfbnMgPSBOU0VDX1BFUl9TRUMgLyBtb2RfZnJlcTsKKwl1MzIg dmFsOworCisJdmFsID0gKHRpbWluZy0+dDFoX25zIC8gY3ljbGVfbnMpIDw8IDIxIHwKKwkgICAg ICAodGltaW5nLT50MWxfbnMgLyBjeWNsZV9ucykgPDwgMTYgfAorCSAgICAgICh0aW1pbmctPnQw aF9ucyAvIGN5Y2xlX25zKSA8PCAgNiB8CisJICAgICAgKHRpbWluZy0+dDBsX25zIC8gY3ljbGVf bnMpOworCXdyaXRlbCh2YWwsIHByaXYtPmJhc2UgKyBMRURDX1QwMV9USU1JTkdfQ1RSTF9SRUcp OworCisJdmFsID0gKHRpbWluZy0+dHJlc2V0X25zIC8gY3ljbGVfbnMpIDw8IDE2IHwKKwkgICAg ICAocHJpdi0+bnVtX2xlZHMgLSAxKTsKKwl3cml0ZWwodmFsLCBwcml2LT5iYXNlICsgTEVEQ19S RVNFVF9USU1JTkdfQ1RSTF9SRUcpOworfQorCitzdGF0aWMgaW50IHN1bjUwaV9hMTAwX2xlZGNf cmVzdW1lKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3Qgc3VuNTBpX2ExMDBfbGVkYyAq cHJpdiA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXUzMiB2YWw7CisJaW50IHJldDsKKworCXJl dCA9IHJlc2V0X2NvbnRyb2xfZGVhc3NlcnQocHJpdi0+cmVzZXQpOworCWlmIChyZXQpCisJCXJl dHVybiByZXQ7CisKKwlyZXQgPSBjbGtfcHJlcGFyZV9lbmFibGUocHJpdi0+YnVzX2Nsayk7CisJ aWYgKHJldCkKKwkJZ290byBlcnJfYXNzZXJ0X3Jlc2V0OworCisJcmV0ID0gY2xrX3ByZXBhcmVf ZW5hYmxlKHByaXYtPm1vZF9jbGspOworCWlmIChyZXQpCisJCWdvdG8gZXJyX2Rpc2FibGVfYnVz X2NsazsKKworCXN1bjUwaV9hMTAwX2xlZGNfc2V0X2Zvcm1hdChwcml2KTsKKwlzdW41MGlfYTEw MF9sZWRjX3NldF90aW1pbmcocHJpdik7CisKKwkvKiBUaGUgdHJpZ2dlciBsZXZlbCBtdXN0IGJl IGF0IGxlYXN0IHRoZSBidXJzdCBsZW5ndGguICovCisJdmFsID0gcmVhZGwocHJpdi0+YmFzZSAr IExFRENfRE1BX0NUUkxfUkVHKTsKKwl2YWwgJj0gfkxFRENfRE1BX0NUUkxfUkVHX0ZJRk9fVFJJ R19MRVZFTDsKKwl2YWwgfD0gTEVEQ19GSUZPX0RFUFRIIC8gMjsKKwl3cml0ZWwodmFsLCBwcml2 LT5iYXNlICsgTEVEQ19ETUFfQ1RSTF9SRUcpOworCisJdmFsID0gTEVEQ19JTlRfQ1RSTF9SRUdf R0xPQkFMX0lOVF9FTiB8CisJICAgICAgTEVEQ19JTlRfQ1RSTF9SRUdfVFJBTlNfRklOSVNIX0lO VF9FTjsKKwl3cml0ZWwodmFsLCBwcml2LT5iYXNlICsgTEVEQ19JTlRfQ1RSTF9SRUcpOworCisJ cmV0dXJuIDA7CisKK2Vycl9kaXNhYmxlX2J1c19jbGs6CisJY2xrX2Rpc2FibGVfdW5wcmVwYXJl KHByaXYtPmJ1c19jbGspOworZXJyX2Fzc2VydF9yZXNldDoKKwlyZXNldF9jb250cm9sX2Fzc2Vy dChwcml2LT5yZXNldCk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IHN1bjUwaV9h MTAwX2xlZGNfc3VzcGVuZChzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHN1bjUwaV9h MTAwX2xlZGMgKnByaXYgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKworCWNsa19kaXNhYmxlX3Vu cHJlcGFyZShwcml2LT5tb2RfY2xrKTsKKwljbGtfZGlzYWJsZV91bnByZXBhcmUocHJpdi0+YnVz X2Nsayk7CisJcmVzZXRfY29udHJvbF9hc3NlcnQocHJpdi0+cmVzZXQpOworCisJcmV0dXJuIDA7 Cit9CisKK3N0YXRpYyB2b2lkIHN1bjUwaV9hMTAwX2xlZGNfZG1hX2NsZWFudXAodm9pZCAqZGF0 YSkKK3sKKwlzdHJ1Y3Qgc3VuNTBpX2ExMDBfbGVkYyAqcHJpdiA9IGRhdGE7CisJc3RydWN0IGRl dmljZSAqZG1hX2RldiA9IGRtYWVuZ2luZV9nZXRfZG1hX2RldmljZShwcml2LT5kbWFfY2hhbik7 CisKKwlpZiAocHJpdi0+YnVmZmVyKQorCQlkbWFfZnJlZV93YyhkbWFfZGV2LCBMRURTX1RPX0JZ VEVTKHByaXYtPm51bV9sZWRzKSwKKwkJCSAgICBwcml2LT5idWZmZXIsIHByaXYtPmRtYV9oYW5k bGUpOworCWRtYV9yZWxlYXNlX2NoYW5uZWwocHJpdi0+ZG1hX2NoYW4pOworfQorCitzdGF0aWMg aW50IHN1bjUwaV9hMTAwX2xlZGNfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikK K3sKKwljb25zdCBzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wID0gcGRldi0+ZGV2Lm9mX25vZGU7CisJ c3RydWN0IGRtYV9zbGF2ZV9jb25maWcgZG1hX2NmZyA9IHt9OworCXN0cnVjdCBsZWRfaW5pdF9k YXRhIGluaXRfZGF0YSA9IHt9OworCXN0cnVjdCBkZXZpY2UgKmRldiA9ICZwZGV2LT5kZXY7CisJ c3RydWN0IGRldmljZV9ub2RlICpjaGlsZDsKKwlzdHJ1Y3Qgc3VuNTBpX2ExMDBfbGVkYyAqcHJp djsKKwlzdHJ1Y3QgcmVzb3VyY2UgKm1lbTsKKwlpbnQgY291bnQsIGlycSwgcmV0OworCisJY291 bnQgPSBvZl9nZXRfYXZhaWxhYmxlX2NoaWxkX2NvdW50KG5wKTsKKwlpZiAoIWNvdW50KQorCQly ZXR1cm4gLUVOT0RFVjsKKwlpZiAoY291bnQgPiBMRURDX01BWF9MRURTKSB7CisJCWRldl9lcnIo ZGV2LCAiVG9vIG1hbnkgTEVEcyEgKG1heCBpcyAlZClcbiIsIExFRENfTUFYX0xFRFMpOworCQly ZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlwcml2ID0gZGV2bV9remFsbG9jKGRldiwgc3RydWN0X3Np emUocHJpdiwgbGVkcywgY291bnQpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXByaXYpCisJCXJldHVy biAtRU5PTUVNOworCisJcHJpdi0+ZGV2ID0gZGV2OworCXByaXYtPm51bV9sZWRzID0gY291bnQ7 CisJc3Bpbl9sb2NrX2luaXQoJnByaXYtPmxvY2spOworCWRldl9zZXRfZHJ2ZGF0YShkZXYsIHBy aXYpOworCisJcmV0ID0gc3VuNTBpX2ExMDBfbGVkY19wYXJzZV9mb3JtYXQobnAsIHByaXYpOwor CWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwlyZXQgPSBzdW41MGlfYTEwMF9sZWRjX3BhcnNl X3RpbWluZyhucCwgcHJpdik7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCXByaXYtPmJh c2UgPSBkZXZtX3BsYXRmb3JtX2dldF9hbmRfaW9yZW1hcF9yZXNvdXJjZShwZGV2LCAwLCAmbWVt KTsKKwlpZiAoSVNfRVJSKHByaXYtPmJhc2UpKQorCQlyZXR1cm4gUFRSX0VSUihwcml2LT5iYXNl KTsKKworCXByaXYtPmJ1c19jbGsgPSBkZXZtX2Nsa19nZXQoZGV2LCAiYnVzIik7CisJaWYgKElT X0VSUihwcml2LT5idXNfY2xrKSkKKwkJcmV0dXJuIFBUUl9FUlIocHJpdi0+YnVzX2Nsayk7CisK Kwlwcml2LT5tb2RfY2xrID0gZGV2bV9jbGtfZ2V0KGRldiwgIm1vZCIpOworCWlmIChJU19FUlIo cHJpdi0+bW9kX2NsaykpCisJCXJldHVybiBQVFJfRVJSKHByaXYtPm1vZF9jbGspOworCisJcHJp di0+cmVzZXQgPSBkZXZtX3Jlc2V0X2NvbnRyb2xfZ2V0X2V4Y2x1c2l2ZShkZXYsIE5VTEwpOwor CWlmIChJU19FUlIocHJpdi0+cmVzZXQpKQorCQlyZXR1cm4gUFRSX0VSUihwcml2LT5yZXNldCk7 CisKKwlwcml2LT5kbWFfY2hhbiA9IGRtYV9yZXF1ZXN0X2NoYW4oZGV2LCAidHgiKTsKKwlpZiAo SVNfRVJSKHByaXYtPmRtYV9jaGFuKSkKKwkJcmV0dXJuIFBUUl9FUlIocHJpdi0+ZG1hX2NoYW4p OworCisJcmV0ID0gZGV2bV9hZGRfYWN0aW9uX29yX3Jlc2V0KGRldiwgc3VuNTBpX2ExMDBfbGVk Y19kbWFfY2xlYW51cCwgcHJpdik7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCWRtYV9j ZmcuZHN0X2FkZHIJPSBtZW0tPnN0YXJ0ICsgTEVEQ19EQVRBX1JFRzsKKwlkbWFfY2ZnLmRzdF9h ZGRyX3dpZHRoCT0gRE1BX1NMQVZFX0JVU1dJRFRIXzRfQllURVM7CisJZG1hX2NmZy5kc3RfbWF4 YnVyc3QJPSBMRURDX0ZJRk9fREVQVEggLyAyOworCXJldCA9IGRtYWVuZ2luZV9zbGF2ZV9jb25m aWcocHJpdi0+ZG1hX2NoYW4sICZkbWFfY2ZnKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0Owor CisJcHJpdi0+YnVmZmVyID0gZG1hX2FsbG9jX3djKGRtYWVuZ2luZV9nZXRfZG1hX2RldmljZShw cml2LT5kbWFfY2hhbiksCisJCQkJICAgIExFRFNfVE9fQllURVMocHJpdi0+bnVtX2xlZHMpLAor CQkJCSAgICAmcHJpdi0+ZG1hX2hhbmRsZSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFwcml2LT5idWZm ZXIpCisJCXJldHVybiAtRU5PTUVNOworCisJaXJxID0gcGxhdGZvcm1fZ2V0X2lycShwZGV2LCAw KTsKKwlpZiAoaXJxIDwgMCkKKwkJcmV0dXJuIGlycTsKKworCXJldCA9IGRldm1fcmVxdWVzdF9p cnEoZGV2LCBpcnEsIHN1bjUwaV9hMTAwX2xlZGNfaXJxLAorCQkJICAgICAgIDAsIGRldl9uYW1l KGRldiksIHByaXYpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwlyZXQgPSBzdW41MGlf YTEwMF9sZWRjX3Jlc3VtZShkZXYpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwlmb3Jf ZWFjaF9hdmFpbGFibGVfY2hpbGRfb2Zfbm9kZShucCwgY2hpbGQpIHsKKwkJc3RydWN0IHN1bjUw aV9hMTAwX2xlZGNfbGVkICpsZWQ7CisJCXN0cnVjdCBsZWRfY2xhc3NkZXYgKmNkZXY7CisJCXUz MiBhZGRyLCBjb2xvcjsKKworCQlyZXQgPSBvZl9wcm9wZXJ0eV9yZWFkX3UzMihjaGlsZCwgInJl ZyIsICZhZGRyKTsKKwkJaWYgKHJldCB8fCBhZGRyID49IGNvdW50KSB7CisJCQlkZXZfZXJyKGRl diwgIkxFRCAncmVnJyB2YWx1ZXMgbXVzdCBiZSBmcm9tIDAgdG8gJWRcbiIsCisJCQkJcHJpdi0+ bnVtX2xlZHMgLSAxKTsKKwkJCXJldCA9IC1FSU5WQUw7CisJCQlnb3RvIGVycl9wdXRfY2hpbGQ7 CisJCX0KKworCQlyZXQgPSBvZl9wcm9wZXJ0eV9yZWFkX3UzMihjaGlsZCwgImNvbG9yIiwgJmNv bG9yKTsKKwkJaWYgKHJldCB8fCBjb2xvciAhPSBMRURfQ09MT1JfSURfUkdCKSB7CisJCQlkZXZf ZXJyKGRldiwgIkxFRCAnY29sb3InIG11c3QgYmUgTEVEX0NPTE9SX0lEX1JHQlxuIik7CisJCQly ZXQgPSAtRUlOVkFMOworCQkJZ290byBlcnJfcHV0X2NoaWxkOworCQl9CisKKwkJbGVkID0gJnBy aXYtPmxlZHNbYWRkcl07CisKKwkJbGVkLT5zdWJsZWRfaW5mb1swXS5jb2xvcl9pbmRleCA9IExF RF9DT0xPUl9JRF9SRUQ7CisJCWxlZC0+c3VibGVkX2luZm9bMF0uY2hhbm5lbCA9IDA7CisJCWxl ZC0+c3VibGVkX2luZm9bMV0uY29sb3JfaW5kZXggPSBMRURfQ09MT1JfSURfR1JFRU47CisJCWxl ZC0+c3VibGVkX2luZm9bMV0uY2hhbm5lbCA9IDE7CisJCWxlZC0+c3VibGVkX2luZm9bMl0uY29s b3JfaW5kZXggPSBMRURfQ09MT1JfSURfQkxVRTsKKwkJbGVkLT5zdWJsZWRfaW5mb1syXS5jaGFu bmVsID0gMjsKKworCQlsZWQtPm1jX2NkZXYubnVtX2NvbG9ycyA9IEFSUkFZX1NJWkUobGVkLT5z dWJsZWRfaW5mbyk7CisJCWxlZC0+bWNfY2Rldi5zdWJsZWRfaW5mbyA9IGxlZC0+c3VibGVkX2lu Zm87CisKKwkJY2RldiA9ICZsZWQtPm1jX2NkZXYubGVkX2NkZXY7CisJCWNkZXYtPm1heF9icmln aHRuZXNzID0gVThfTUFYOworCQljZGV2LT5icmlnaHRuZXNzX3NldCA9IHN1bjUwaV9hMTAwX2xl ZGNfYnJpZ2h0bmVzc19zZXQ7CisKKwkJaW5pdF9kYXRhLmZ3bm9kZSA9IG9mX2Z3bm9kZV9oYW5k bGUoY2hpbGQpOworCisJCXJldCA9IGRldm1fbGVkX2NsYXNzZGV2X211bHRpY29sb3JfcmVnaXN0 ZXJfZXh0KGRldiwKKwkJCQkJCQkJJmxlZC0+bWNfY2RldiwKKwkJCQkJCQkJJmluaXRfZGF0YSk7 CisJCWlmIChyZXQpIHsKKwkJCWRldl9lcnIoZGV2LCAiRmFpbGVkIHRvIHJlZ2lzdGVyIExFRCAl dTogJWRcbiIsCisJCQkJYWRkciwgcmV0KTsKKwkJCWdvdG8gZXJyX3B1dF9jaGlsZDsKKwkJfQor CX0KKworCWRldl9pbmZvKGRldiwgIlJlZ2lzdGVyZWQgJWQgTEVEc1xuIiwgcHJpdi0+bnVtX2xl ZHMpOworCisJcmV0dXJuIDA7CisKK2Vycl9wdXRfY2hpbGQ6CisJb2Zfbm9kZV9wdXQoY2hpbGQp OworCXN1bjUwaV9hMTAwX2xlZGNfc3VzcGVuZCgmcGRldi0+ZGV2KTsKKworCXJldHVybiByZXQ7 Cit9CisKK3N0YXRpYyBpbnQgc3VuNTBpX2ExMDBfbGVkY19yZW1vdmUoc3RydWN0IHBsYXRmb3Jt X2RldmljZSAqcGRldikKK3sKKwlzdW41MGlfYTEwMF9sZWRjX3N1c3BlbmQoJnBkZXYtPmRldik7 CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgc3VuNTBpX2ExMDBfbGVkY19zaHV0ZG93 bihzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXN1bjUwaV9hMTAwX2xlZGNfc3Vz cGVuZCgmcGRldi0+ZGV2KTsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQg c3VuNTBpX2ExMDBfbGVkY19vZl9tYXRjaFtdID0geworCXsgLmNvbXBhdGlibGUgPSAiYWxsd2lu bmVyLHN1bjUwaS1hMTAwLWxlZGMiIH0sCisJe30KK307CitNT0RVTEVfREVWSUNFX1RBQkxFKG9m LCBzdW41MGlfYTEwMF9sZWRjX29mX21hdGNoKTsKKworc3RhdGljIERFRklORV9TSU1QTEVfREVW X1BNX09QUyhzdW41MGlfYTEwMF9sZWRjX3BtLAorCQkJCXN1bjUwaV9hMTAwX2xlZGNfc3VzcGVu ZCwKKwkJCQlzdW41MGlfYTEwMF9sZWRjX3Jlc3VtZSk7CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZv cm1fZHJpdmVyIHN1bjUwaV9hMTAwX2xlZGNfZHJpdmVyID0geworCS5wcm9iZQkJPSBzdW41MGlf YTEwMF9sZWRjX3Byb2JlLAorCS5yZW1vdmUJCT0gc3VuNTBpX2ExMDBfbGVkY19yZW1vdmUsCisJ LnNodXRkb3duCT0gc3VuNTBpX2ExMDBfbGVkY19zaHV0ZG93biwKKwkuZHJpdmVyCQk9IHsKKwkJ Lm5hbWUJCT0gInN1bjUwaS1hMTAwLWxlZGMiLAorCQkub2ZfbWF0Y2hfdGFibGUJPSBzdW41MGlf YTEwMF9sZWRjX29mX21hdGNoLAorCQkucG0JCT0gcG1fcHRyKCZzdW41MGlfYTEwMF9sZWRjX3Bt KSwKKwl9LAorfTsKK21vZHVsZV9wbGF0Zm9ybV9kcml2ZXIoc3VuNTBpX2ExMDBfbGVkY19kcml2 ZXIpOworCitNT0RVTEVfQVVUSE9SKCJTYW11ZWwgSG9sbGFuZCA8c2FtdWVsQHNob2xsYW5kLm9y Zz4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiQWxsd2lubmVyIEExMDAgTEVEIGNvbnRyb2xsZXIg ZHJpdmVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7Ci0tIAoyLjM3LjQKCgpfX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwpsaW51eC1hcm0ta2VybmVsIG1h aWxpbmcgbGlzdApsaW51eC1hcm0ta2VybmVsQGxpc3RzLmluZnJhZGVhZC5vcmcKaHR0cDovL2xp c3RzLmluZnJhZGVhZC5vcmcvbWFpbG1hbi9saXN0aW5mby9saW51eC1hcm0ta2VybmVsCg== 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 51A4FC4332F for ; Sun, 1 Jan 2023 00:11:46 +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=f+FNh3WSFenKIAcKyq47XFYNbZ5wdAcpqkO3zGwjgyk=; b=CLBTVMgoiU1VxE QlbS3EBYTeiN3jiibvk5x1+D2Ey6wotvATkEWKzEpwnM+YLQonavR8EHij8AekoTwmS5FQK5fwtzV RsBFttcx//wjuktDUgHcKEs/4tJ4Kz/PDVhry3WVPz+71Pnd8bMhplLJtvg3O7LVBkewSQcFOl2t1 iEeFdSzfm4Y70ops5JE1mBHiI/jGxCq1QpSlxwp4wfTHNbZgO9Pyx/Gfv+zbiFXuN9rWPt+kSLQkv 5aGXOqT/BcaD0r/G56nVYRNqqXTPyKgp96bYMjjFn5xaxoZhrl4zKS84gk2x13+CcwiuPCx29F1LX 9/pKJXsVl+sXZG61e4bA==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.94.2 #2 (Red Hat Linux)) id 1pBlws-00BoQj-IV; Sun, 01 Jan 2023 00:11:35 +0000 Received: from new2-smtp.messagingengine.com ([66.111.4.224]) by bombadil.infradead.org with esmtps (Exim 4.94.2 #2 (Red Hat Linux)) id 1pBlhb-00Bfuz-H3; Sat, 31 Dec 2022 23:55:51 +0000 Received: from compute6.internal (compute6.nyi.internal [10.202.2.47]) by mailnew.nyi.internal (Postfix) with ESMTP id A5DBE5818E9; Sat, 31 Dec 2022 18:55:46 -0500 (EST) Received: from mailfrontend1 ([10.202.2.162]) by compute6.internal (MEProxy); Sat, 31 Dec 2022 18:55:46 -0500 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=sholland.org; h= cc:cc:content-transfer-encoding:content-type:date:date:from:from :in-reply-to:in-reply-to:message-id:mime-version:references :reply-to:sender:subject:subject:to:to; s=fm3; t=1672530946; x= 1672538146; bh=7Wg6ivlkRA3pIYK6Ni6Jp9lhN0AnyA03J44uqUPbIXo=; b=a EVPByOAjFe8AoSUbxKPsKKCG6eSPN6dqxroYvYM3VSUc+A2BjnBBx/FJ53plZtHf NhH2NpBIeIm3tUOAVTT6e7Ci5P4xMnTyHTVOXv6f6qkJYmbaQyqh5Ul9FeWPv5y9 oOiuIYtXMDdxqmZ8yZqWNG0bEQ+iun5ZQGjKL4YNFvuz61GL9zgtZeE6QY1mYbfp 3mDeSkCf+wvmp+u/1Ttig9d5vVyO9qlyPbk+fXfDSHIwMzsU7NQ12qffFcUObR5z egPGNB4V7G3Vl+7o2Fo2IzIy5xw/aMlySiYn2bFHd0qvfNsh/1nI4TmLjnKDMtnh FVWVpi7gRe2HtoMDrAqhA== DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d= messagingengine.com; h=cc:cc:content-transfer-encoding :content-type:date:date:feedback-id:feedback-id:from:from :in-reply-to:in-reply-to:message-id:mime-version:references :reply-to:sender:subject:subject:to:to:x-me-proxy:x-me-proxy :x-me-sender:x-me-sender:x-sasl-enc; s=fm2; t=1672530946; x= 1672538146; bh=7Wg6ivlkRA3pIYK6Ni6Jp9lhN0AnyA03J44uqUPbIXo=; b=w twg+zwkPAI1VwdD9kBjE5GTQKOi40Nw7eA5o+knJCRATzOsh2jOSbV+bTz05jShi y7YJuZElQhVERzYCFcqP+jLW9vozMPtDdQiZlb23SajQuvqlK0+Byiz3bNsb9d6c YSOiUtkWen72C5Om77rNtpwpdp+IOYOzZ70VHivW/Wv2IVaeRVtiZ4HiSizzP7uu sQYn5WsJD0paRDavGi41icyfjYGKN3s/gzD02ZovniCi65IHRE44OojwT+6sNZw8 fMgu8K6rUBXWO8lP5LuWFcMxjRTkpk8RnCQNvXsnCL8Wa8Dm5HG3Pq7p0X/pamsp kyAM3LvWv54IqgsSc/MQA== X-ME-Sender: X-ME-Received: X-ME-Proxy-Cause: gggruggvucftvghtrhhoucdtuddrgedvhedrieelgddujecutefuodetggdotefrodftvf curfhrohhfihhlvgemucfhrghsthforghilhdpqfgfvfdpuffrtefokffrpgfnqfghnecu uegrihhlohhuthemuceftddtnecusecvtfgvtghiphhivghnthhsucdlqddutddtmdenuc fjughrpefhvfevufffkffojghfgggtgfesthekredtredtjeenucfhrhhomhepufgrmhhu vghlucfjohhllhgrnhguuceoshgrmhhuvghlsehshhholhhlrghnugdrohhrgheqnecugg ftrfgrthhtvghrnhepfeeuveeufeefleehlefhleeglefggfeikeffveetfeevjeeuieet uefgfeeiheelnecuvehluhhsthgvrhfuihiivgeptdenucfrrghrrghmpehmrghilhhfrh homhepshgrmhhuvghlsehshhholhhlrghnugdrohhrgh X-ME-Proxy: Feedback-ID: i0ad843c9:Fastmail Received: by mail.messagingengine.com (Postfix) with ESMTPA; Sat, 31 Dec 2022 18:55:45 -0500 (EST) From: Samuel Holland To: Lee Jones , Pavel Machek , linux-leds@vger.kernel.org, Chen-Yu Tsai , Jernej Skrabec Cc: Samuel Holland , Albert Ou , Conor Dooley , Guo Ren , Heiko Stuebner , Heiko Stuebner , Jisheng Zhang , Krzysztof Kozlowski , Palmer Dabbelt , Paul Walmsley , Philipp Zabel , Rob Herring , devicetree@vger.kernel.org, linux-arm-kernel@lists.infradead.org, linux-kernel@vger.kernel.org, linux-riscv@lists.infradead.org, linux-sunxi@lists.linux.dev Subject: [RESEND PATCH v7 2/5] leds: sun50i-a100: New driver for the A100 LED controller Date: Sat, 31 Dec 2022 17:55:37 -0600 Message-Id: <20221231235541.13568-3-samuel@sholland.org> X-Mailer: git-send-email 2.37.4 In-Reply-To: <20221231235541.13568-1-samuel@sholland.org> References: <20221231235541.13568-1-samuel@sholland.org> MIME-Version: 1.0 X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20221231_155548_045737_404A9A4A X-CRM114-Status: GOOD ( 25.52 ) X-BeenThere: linux-riscv@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-riscv" Errors-To: linux-riscv-bounces+linux-riscv=archiver.kernel.org@lists.infradead.org U29tZSBBbGx3aW5uZXIgc3VueGkgU29Dcywgc3RhcnRpbmcgd2l0aCB0aGUgQTEwMCwgY29udGFp biBhbiBMRUQKY29udHJvbGxlciBkZXNpZ25lZCB0byBkcml2ZSBSR0IgTEVEIHBpeGVscy4gQWRk IGEgZHJpdmVyIGZvciBpdCB1c2luZwp0aGUgbXVsdGljb2xvciBMRUQgZnJhbWV3b3JrLCBhbmQg d2l0aCBMRURzIGRlZmluZWQgaW4gdGhlIGRldmljZSB0cmVlLgoKQWNrZWQtYnk6IEplcm5laiBT a3JhYmVjIDxqZXJuZWouc2tyYWJlY0BnbWFpbC5jb20+ClNpZ25lZC1vZmYtYnk6IFNhbXVlbCBI b2xsYW5kIDxzYW11ZWxAc2hvbGxhbmQub3JnPgotLS0KCkNoYW5nZXMgaW4gdjc6CiAtIFVzZSBE RUZJTkVfU0lNUExFX0RFVl9QTV9PUFMKCkNoYW5nZXMgaW4gdjU6CiAtIFJlbmFtZSB0aGUgZHJp dmVyIFIzMjkgLT4gQTEwMCwgc2luY2UgdGhhdCBpcyB0aGUgYWN0dWFsIG9yaWdpbmFsCiAgIGlt cGxlbWVudGF0aW9uCgpDaGFuZ2VzIGluIHY0OgogLSBEZXBlbmQgb24gTEVEU19DTEFTU19NVUxU SUNPTE9SCgpDaGFuZ2VzIGluIHYzOgogLSBBZGRlZCB2ZW5kb3IgcHJlZml4IHRvIHRpbWluZy9m b3JtYXQgcHJvcGVydGllcwogLSBSZW5hbWVkICJmb3JtYXQiIHByb3BlcnR5IHRvICJwaXhlbC1m b3JtYXQiIGZvciBjbGFyaXR5CiAtIERyb3BwZWQgInZsZWQtc3VwcGx5IiBhcyBpdCBpcyB1bnJl bGF0ZWQgdG8gdGhlIGNvbnRyb2xsZXIgaGFyZHdhcmUKIC0gQ2hhbmdlZCAid3JpdGVzbCIgdG8g Imlvd3JpdGUzMl9yZXAiIHNvIHRoZSBkcml2ZXIgYnVpbGRzIG9uIGhwcGEKCkNoYW5nZXMgaW4g djI6CiAtIFJlbmFtZWQgZnJvbSBzdW54aS1sZWRjIHRvIHN1bjUwaS1yMzI5LWxlZGMKIC0gQWRk ZWQgbWlzc2luZyAic3RhdGljIiB0byBmdW5jdGlvbnMvZ2xvYmFscyBhcyByZXBvcnRlZCBieSAw ZGF5IGJvdAoKIGRyaXZlcnMvbGVkcy9LY29uZmlnICAgICAgICAgICAgfCAgIDkgKwogZHJpdmVy cy9sZWRzL01ha2VmaWxlICAgICAgICAgICB8ICAgMSArCiBkcml2ZXJzL2xlZHMvbGVkcy1zdW41 MGktYTEwMC5jIHwgNTU1ICsrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrCiAzIGZpbGVz IGNoYW5nZWQsIDU2NSBpbnNlcnRpb25zKCspCiBjcmVhdGUgbW9kZSAxMDA2NDQgZHJpdmVycy9s ZWRzL2xlZHMtc3VuNTBpLWExMDAuYwoKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbGVkcy9LY29uZmln IGIvZHJpdmVycy9sZWRzL0tjb25maWcKaW5kZXggNDk5ZDBmMjE1YThiLi40ZjRjNTE1ZWQ3ZDcg MTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbGVkcy9LY29uZmlnCisrKyBiL2RyaXZlcnMvbGVkcy9LY29u ZmlnCkBAIC0yODEsNiArMjgxLDE1IEBAIGNvbmZpZyBMRURTX0NPQkFMVF9SQVEKIAloZWxwCiAJ ICBUaGlzIG9wdGlvbiBlbmFibGVzIHN1cHBvcnQgZm9yIHRoZSBDb2JhbHQgUmFxIHNlcmllcyBM RURzLgogCitjb25maWcgTEVEU19TVU41MElfQTEwMAorCXRyaXN0YXRlICJMRUQgc3VwcG9ydCBm b3IgQWxsd2lubmVyIEExMDAgUkdCIExFRCBjb250cm9sbGVyIgorCWRlcGVuZHMgb24gTEVEU19D TEFTU19NVUxUSUNPTE9SICYmIE9GCisJZGVwZW5kcyBvbiBBUkNIX1NVTlhJIHx8IENPTVBJTEVf VEVTVAorCWhlbHAKKwkgIFRoaXMgb3B0aW9uIGVuYWJsZXMgc3VwcG9ydCBmb3IgdGhlIFJHQiBM RUQgY29udHJvbGxlciBmb3VuZAorCSAgaW4gc29tZSBBbGx3aW5uZXIgc3VueGkgU29DcywgaW5j bHVkZWluZyBBMTAwLCBSMzI5LCBhbmQgRDEuCisJICBJdCB1c2VzIGEgb25lLXdpcmUgaW50ZXJm YWNlIHRvIGNvbnRyb2wgdXAgdG8gMTAyNCBMRURzLgorCiBjb25maWcgTEVEU19TVU5GSVJFCiAJ dHJpc3RhdGUgIkxFRCBzdXBwb3J0IGZvciBTdW5GaXJlIHNlcnZlcnMuIgogCWRlcGVuZHMgb24g TEVEU19DTEFTUwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9sZWRzL01ha2VmaWxlIGIvZHJpdmVycy9s ZWRzL01ha2VmaWxlCmluZGV4IDRmZDJmOTJjZDE5OC4uYTZlZTNmNWNmN2JlIDEwMDY0NAotLS0g YS9kcml2ZXJzL2xlZHMvTWFrZWZpbGUKKysrIGIvZHJpdmVycy9sZWRzL01ha2VmaWxlCkBAIC03 Niw2ICs3Niw3IEBAIG9iai0kKENPTkZJR19MRURTX1BXTSkJCQkrPSBsZWRzLXB3bS5vCiBvYmot JChDT05GSUdfTEVEU19SRUdVTEFUT1IpCQkrPSBsZWRzLXJlZ3VsYXRvci5vCiBvYmotJChDT05G SUdfTEVEU19TM0MyNFhYKQkJKz0gbGVkcy1zM2MyNHh4Lm8KIG9iai0kKENPTkZJR19MRURTX1ND MjdYWF9CTFRDKQkJKz0gbGVkcy1zYzI3eHgtYmx0Yy5vCitvYmotJChDT05GSUdfTEVEU19TVU41 MElfQTEwMCkJCSs9IGxlZHMtc3VuNTBpLWExMDAubwogb2JqLSQoQ09ORklHX0xFRFNfU1VORklS RSkJCSs9IGxlZHMtc3VuZmlyZS5vCiBvYmotJChDT05GSUdfTEVEU19TWVNDT04pCQkrPSBsZWRz LXN5c2Nvbi5vCiBvYmotJChDT05GSUdfTEVEU19UQ0E2NTA3KQkJKz0gbGVkcy10Y2E2NTA3Lm8K ZGlmZiAtLWdpdCBhL2RyaXZlcnMvbGVkcy9sZWRzLXN1bjUwaS1hMTAwLmMgYi9kcml2ZXJzL2xl ZHMvbGVkcy1zdW41MGktYTEwMC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAw MDAwMC4uMzBmYTliZTJjZjJkCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9sZWRzL2xlZHMt c3VuNTBpLWExMDAuYwpAQCAtMCwwICsxLDU1NSBAQAorLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZp ZXI6IEdQTC0yLjAKKy8vCisvLyBDb3B5cmlnaHQgKGMpIDIwMjEtMjAyMiBTYW11ZWwgSG9sbGFu ZCA8c2FtdWVsQHNob2xsYW5kLm9yZz4KKy8vCisvLyBQYXJ0bHkgYmFzZWQgb24gZHJpdmVycy9s ZWRzL2xlZHMtdHVycmlzLW9tbmlhLmMsIHdoaWNoIGlzOgorLy8gICAgIENvcHlyaWdodCAoYykg MjAyMCBieSBNYXJlayBCZWjDum4gPGthYmVsQGtlcm5lbC5vcmc+CisvLworCisjaW5jbHVkZSA8 bGludXgvY2xrLmg+CisjaW5jbHVkZSA8bGludXgvZG1hLW1hcHBpbmcuaD4KKyNpbmNsdWRlIDxs aW51eC9kbWFlbmdpbmUuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRl IDxsaW51eC9pby5oPgorI2luY2x1ZGUgPGxpbnV4L2xlZC1jbGFzcy1tdWx0aWNvbG9yLmg+Cisj aW5jbHVkZSA8bGludXgvbGVkcy5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1 ZGUgPGxpbnV4L29mLmg+CisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisjaW5j bHVkZSA8bGludXgvcG0uaD4KKyNpbmNsdWRlIDxsaW51eC9yZXNldC5oPgorI2luY2x1ZGUgPGxp bnV4L3NwaW5sb2NrLmg+CisKKyNkZWZpbmUgTEVEQ19DVFJMX1JFRwkJCTB4MDAwMAorI2RlZmlu ZSBMRURDX0NUUkxfUkVHX0RBVEFfTEVOR1RICQkoMHgxZmZmIDw8IDE2KQorI2RlZmluZSBMRURD X0NUUkxfUkVHX1JHQl9NT0RFCQkJKDB4NyA8PCA2KQorI2RlZmluZSBMRURDX0NUUkxfUkVHX0xF RENfRU4JCQlCSVQoMCkKKyNkZWZpbmUgTEVEQ19UMDFfVElNSU5HX0NUUkxfUkVHCTB4MDAwNAor I2RlZmluZSBMRURDX1QwMV9USU1JTkdfQ1RSTF9SRUdfVDFICQkoMHgzZiA8PCAyMSkKKyNkZWZp bmUgTEVEQ19UMDFfVElNSU5HX0NUUkxfUkVHX1QxTAkJKDB4MWYgPDwgMTYpCisjZGVmaW5lIExF RENfVDAxX1RJTUlOR19DVFJMX1JFR19UMEgJCSgweDFmIDw8IDYpCisjZGVmaW5lIExFRENfVDAx X1RJTUlOR19DVFJMX1JFR19UMEwJCSgweDNmIDw8IDApCisjZGVmaW5lIExFRENfUkVTRVRfVElN SU5HX0NUUkxfUkVHCTB4MDAwYworI2RlZmluZSBMRURDX1JFU0VUX1RJTUlOR19DVFJMX1JFR19M RURfTlVNCSgweDNmZiA8PCAwKQorI2RlZmluZSBMRURDX0RBVEFfUkVHCQkJMHgwMDE0CisjZGVm aW5lIExFRENfRE1BX0NUUkxfUkVHCQkweDAwMTgKKyNkZWZpbmUgTEVEQ19ETUFfQ1RSTF9SRUdf RklGT19UUklHX0xFVkVMCSgweDFmIDw8IDApCisjZGVmaW5lIExFRENfSU5UX0NUUkxfUkVHCQkw eDAwMWMKKyNkZWZpbmUgTEVEQ19JTlRfQ1RSTF9SRUdfR0xPQkFMX0lOVF9FTgkJQklUKDUpCisj ZGVmaW5lIExFRENfSU5UX0NUUkxfUkVHX0ZJRk9fQ1BVUkVRX0lOVF9FTglCSVQoMSkKKyNkZWZp bmUgTEVEQ19JTlRfQ1RSTF9SRUdfVFJBTlNfRklOSVNIX0lOVF9FTglCSVQoMCkKKyNkZWZpbmUg TEVEQ19JTlRfU1RTX1JFRwkJMHgwMDIwCisjZGVmaW5lIExFRENfSU5UX1NUU19SRUdfRklGT19D UFVSRVFfSU5UCUJJVCgxKQorI2RlZmluZSBMRURDX0lOVF9TVFNfUkVHX1RSQU5TX0ZJTklTSF9J TlQJQklUKDApCisKKyNkZWZpbmUgTEVEQ19GSUZPX0RFUFRICQkJMzIKKyNkZWZpbmUgTEVEQ19N QVhfTEVEUwkJCTEwMjQKKworI2RlZmluZSBMRURTX1RPX0JZVEVTKG4pCQkoKG4pICogc2l6ZW9m KHUzMikpCisKK3N0cnVjdCBzdW41MGlfYTEwMF9sZWRjX2xlZCB7CisJc3RydWN0IGxlZF9jbGFz c2Rldl9tYyBtY19jZGV2OworCXN0cnVjdCBtY19zdWJsZWQgc3VibGVkX2luZm9bM107Cit9Owor CisjZGVmaW5lIHRvX2xlZGNfbGVkKG1jKSBjb250YWluZXJfb2YobWMsIHN0cnVjdCBzdW41MGlf YTEwMF9sZWRjX2xlZCwgbWNfY2RldikKKworc3RydWN0IHN1bjUwaV9hMTAwX2xlZGNfdGltaW5n IHsKKwl1MzIgdDBoX25zOworCXUzMiB0MGxfbnM7CisJdTMyIHQxaF9uczsKKwl1MzIgdDFsX25z OworCXUzMiB0cmVzZXRfbnM7Cit9OworCitzdHJ1Y3Qgc3VuNTBpX2ExMDBfbGVkYyB7CisJc3Ry dWN0IGRldmljZSAqZGV2OworCXZvaWQgX19pb21lbSAqYmFzZTsKKwlzdHJ1Y3QgY2xrICpidXNf Y2xrOworCXN0cnVjdCBjbGsgKm1vZF9jbGs7CisJc3RydWN0IHJlc2V0X2NvbnRyb2wgKnJlc2V0 OworCisJdTMyICpidWZmZXI7CisJc3RydWN0IGRtYV9jaGFuICpkbWFfY2hhbjsKKwlkbWFfYWRk cl90IGRtYV9oYW5kbGU7CisJaW50IHBpb19sZW5ndGg7CisJaW50IHBpb19vZmZzZXQ7CisKKwlz cGlubG9ja190IGxvY2s7CisJaW50IG5leHRfbGVuZ3RoOworCWJvb2wgeGZlcl9hY3RpdmU7CisK Kwl1MzIgZm9ybWF0OworCXN0cnVjdCBzdW41MGlfYTEwMF9sZWRjX3RpbWluZyB0aW1pbmc7CisK KwlpbnQgbnVtX2xlZHM7CisJc3RydWN0IHN1bjUwaV9hMTAwX2xlZGNfbGVkIGxlZHNbXTsKK307 CisKK3N0YXRpYyBpbnQgc3VuNTBpX2ExMDBfbGVkY19kbWFfeGZlcihzdHJ1Y3Qgc3VuNTBpX2Ex MDBfbGVkYyAqcHJpdiwgaW50IGxlbmd0aCkKK3sKKwlzdHJ1Y3QgZG1hX2FzeW5jX3R4X2Rlc2Ny aXB0b3IgKmRlc2M7CisJZG1hX2Nvb2tpZV90IGNvb2tpZTsKKworCWRlc2MgPSBkbWFlbmdpbmVf cHJlcF9zbGF2ZV9zaW5nbGUocHJpdi0+ZG1hX2NoYW4sIHByaXYtPmRtYV9oYW5kbGUsCisJCQkJ CSAgIExFRFNfVE9fQllURVMobGVuZ3RoKSwKKwkJCQkJICAgRE1BX01FTV9UT19ERVYsIDApOwor CWlmICghZGVzYykKKwkJcmV0dXJuIC1FTk9NRU07CisKKwljb29raWUgPSBkbWFlbmdpbmVfc3Vi bWl0KGRlc2MpOworCWlmIChkbWFfc3VibWl0X2Vycm9yKGNvb2tpZSkpCisJCXJldHVybiAtRUlP OworCisJZG1hX2FzeW5jX2lzc3VlX3BlbmRpbmcocHJpdi0+ZG1hX2NoYW4pOworCisJcmV0dXJu IDA7Cit9CisKK3N0YXRpYyB2b2lkIHN1bjUwaV9hMTAwX2xlZGNfcGlvX3hmZXIoc3RydWN0IHN1 bjUwaV9hMTAwX2xlZGMgKnByaXYsIGludCBsZW5ndGgpCit7CisJdTMyIGJ1cnN0LCBvZmZzZXQs IHZhbDsKKworCWlmIChsZW5ndGgpIHsKKwkJLyogTmV3IHRyYW5zZmVyIChGSUZPIGlzIGVtcHR5 KS4gKi8KKwkJb2Zmc2V0ID0gMDsKKwkJYnVyc3QgID0gbWluKGxlbmd0aCwgTEVEQ19GSUZPX0RF UFRIKTsKKwl9IGVsc2UgeworCQkvKiBFeGlzdGluZyB0cmFuc2ZlciAoRklGTyBpcyBoYWxmLWZ1 bGwpLiAqLworCQlsZW5ndGggPSBwcml2LT5waW9fbGVuZ3RoOworCQlvZmZzZXQgPSBwcml2LT5w aW9fb2Zmc2V0OworCQlidXJzdCAgPSBtaW4obGVuZ3RoLCBMRURDX0ZJRk9fREVQVEggLyAyKTsK Kwl9CisKKwlpb3dyaXRlMzJfcmVwKHByaXYtPmJhc2UgKyBMRURDX0RBVEFfUkVHLCBwcml2LT5i dWZmZXIgKyBvZmZzZXQsIGJ1cnN0KTsKKworCWlmIChidXJzdCA8IGxlbmd0aCkgeworCQlwcml2 LT5waW9fbGVuZ3RoID0gbGVuZ3RoIC0gYnVyc3Q7CisJCXByaXYtPnBpb19vZmZzZXQgPSBvZmZz ZXQgKyBidXJzdDsKKworCQlpZiAoIW9mZnNldCkgeworCQkJdmFsID0gcmVhZGwocHJpdi0+YmFz ZSArIExFRENfSU5UX0NUUkxfUkVHKTsKKwkJCXZhbCB8PSBMRURDX0lOVF9DVFJMX1JFR19GSUZP X0NQVVJFUV9JTlRfRU47CisJCQl3cml0ZWwodmFsLCBwcml2LT5iYXNlICsgTEVEQ19JTlRfQ1RS TF9SRUcpOworCQl9CisJfSBlbHNlIHsKKwkJLyogRGlzYWJsZSB0aGUgcmVxdWVzdCBJUlEgb25j ZSBhbGwgZGF0YSBpcyB3cml0dGVuLiAqLworCQl2YWwgPSByZWFkbChwcml2LT5iYXNlICsgTEVE Q19JTlRfQ1RSTF9SRUcpOworCQl2YWwgJj0gfkxFRENfSU5UX0NUUkxfUkVHX0ZJRk9fQ1BVUkVR X0lOVF9FTjsKKwkJd3JpdGVsKHZhbCwgcHJpdi0+YmFzZSArIExFRENfSU5UX0NUUkxfUkVHKTsK Kwl9Cit9CisKK3N0YXRpYyB2b2lkIHN1bjUwaV9hMTAwX2xlZGNfc3RhcnRfeGZlcihzdHJ1Y3Qg c3VuNTBpX2ExMDBfbGVkYyAqcHJpdiwKKwkJCQkJaW50IGxlbmd0aCkKK3sKKwl1MzIgdmFsOwor CisJZGV2X2RiZyhwcml2LT5kZXYsICJVcGRhdGluZyAlZCBMRURzXG4iLCBsZW5ndGgpOworCisJ dmFsID0gcmVhZGwocHJpdi0+YmFzZSArIExFRENfQ1RSTF9SRUcpOworCXZhbCAmPSB+TEVEQ19D VFJMX1JFR19EQVRBX0xFTkdUSDsKKwl2YWwgfD0gbGVuZ3RoIDw8IDE2IHwgTEVEQ19DVFJMX1JF R19MRURDX0VOOworCXdyaXRlbCh2YWwsIHByaXYtPmJhc2UgKyBMRURDX0NUUkxfUkVHKTsKKwor CWlmIChsZW5ndGggPiBMRURDX0ZJRk9fREVQVEgpIHsKKwkJaW50IHJldCA9IHN1bjUwaV9hMTAw X2xlZGNfZG1hX3hmZXIocHJpdiwgbGVuZ3RoKTsKKworCQlpZiAoIXJldCkKKwkJCXJldHVybjsK KworCQlkZXZfd2Fybihwcml2LT5kZXYsICJGYWlsZWQgdG8gc2V0IHVwIERNQTogJWRcbiIsIHJl dCk7CisJfQorCisJc3VuNTBpX2ExMDBfbGVkY19waW9feGZlcihwcml2LCBsZW5ndGgpOworfQor CitzdGF0aWMgaXJxcmV0dXJuX3Qgc3VuNTBpX2ExMDBfbGVkY19pcnEoaW50IGlycSwgdm9pZCAq ZGV2X2lkKQoreworCXN0cnVjdCBzdW41MGlfYTEwMF9sZWRjICpwcml2ID0gZGV2X2lkOworCXUz MiB2YWw7CisKKwl2YWwgPSByZWFkbChwcml2LT5iYXNlICsgTEVEQ19JTlRfU1RTX1JFRyk7CisK KwlpZiAodmFsICYgTEVEQ19JTlRfU1RTX1JFR19UUkFOU19GSU5JU0hfSU5UKSB7CisJCWludCBu ZXh0X2xlbmd0aDsKKworCQkvKiBTdGFydCB0aGUgbmV4dCB0cmFuc2ZlciBpZiBuZWVkZWQuICov CisJCXNwaW5fbG9jaygmcHJpdi0+bG9jayk7CisJCW5leHRfbGVuZ3RoID0gcHJpdi0+bmV4dF9s ZW5ndGg7CisJCWlmIChuZXh0X2xlbmd0aCkKKwkJCXByaXYtPm5leHRfbGVuZ3RoID0gMDsKKwkJ ZWxzZQorCQkJcHJpdi0+eGZlcl9hY3RpdmUgPSBmYWxzZTsKKwkJc3Bpbl91bmxvY2soJnByaXYt PmxvY2spOworCisJCWlmIChuZXh0X2xlbmd0aCkKKwkJCXN1bjUwaV9hMTAwX2xlZGNfc3RhcnRf eGZlcihwcml2LCBuZXh0X2xlbmd0aCk7CisJfSBlbHNlIGlmICh2YWwgJiBMRURDX0lOVF9TVFNf UkVHX0ZJRk9fQ1BVUkVRX0lOVCkgeworCQkvKiBDb250aW51ZSB0aGUgY3VycmVudCB0cmFuc2Zl ci4gKi8KKwkJc3VuNTBpX2ExMDBfbGVkY19waW9feGZlcihwcml2LCAwKTsKKwl9CisKKwl3cml0 ZWwodmFsLCBwcml2LT5iYXNlICsgTEVEQ19JTlRfU1RTX1JFRyk7CisKKwlyZXR1cm4gSVJRX0hB TkRMRUQ7Cit9CisKK3N0YXRpYyB2b2lkIHN1bjUwaV9hMTAwX2xlZGNfYnJpZ2h0bmVzc19zZXQo c3RydWN0IGxlZF9jbGFzc2RldiAqY2RldiwKKwkJCQkJICAgIGVudW0gbGVkX2JyaWdodG5lc3Mg YnJpZ2h0bmVzcykKK3sKKwlzdHJ1Y3Qgc3VuNTBpX2ExMDBfbGVkYyAqcHJpdiA9IGRldl9nZXRf ZHJ2ZGF0YShjZGV2LT5kZXYtPnBhcmVudCk7CisJc3RydWN0IGxlZF9jbGFzc2Rldl9tYyAqbWNf Y2RldiA9IGxjZGV2X3RvX21jY2RldihjZGV2KTsKKwlzdHJ1Y3Qgc3VuNTBpX2ExMDBfbGVkY19s ZWQgKmxlZCA9IHRvX2xlZGNfbGVkKG1jX2NkZXYpOworCWludCBhZGRyID0gbGVkIC0gcHJpdi0+ bGVkczsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWJvb2wgeGZlcl9hY3RpdmU7CisJaW50IG5l eHRfbGVuZ3RoOworCisJbGVkX21jX2NhbGNfY29sb3JfY29tcG9uZW50cyhtY19jZGV2LCBicmln aHRuZXNzKTsKKworCXByaXYtPmJ1ZmZlclthZGRyXSA9IGxlZC0+c3VibGVkX2luZm9bMF0uYnJp Z2h0bmVzcyA8PCAxNiB8CisJCQkgICAgIGxlZC0+c3VibGVkX2luZm9bMV0uYnJpZ2h0bmVzcyA8 PCAgOCB8CisJCQkgICAgIGxlZC0+c3VibGVkX2luZm9bMl0uYnJpZ2h0bmVzczsKKworCWRldl9k YmcocHJpdi0+ZGV2LCAiTEVEICVkIC0+ICMlMDZ4XG4iLCBhZGRyLCBwcml2LT5idWZmZXJbYWRk cl0pOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnByaXYtPmxvY2ssIGZsYWdzKTsKKwluZXh0X2xl bmd0aCA9IG1heChwcml2LT5uZXh0X2xlbmd0aCwgYWRkciArIDEpOworCXhmZXJfYWN0aXZlID0g cHJpdi0+eGZlcl9hY3RpdmU7CisJaWYgKHhmZXJfYWN0aXZlKQorCQlwcml2LT5uZXh0X2xlbmd0 aCA9IG5leHRfbGVuZ3RoOworCWVsc2UKKwkJcHJpdi0+eGZlcl9hY3RpdmUgPSB0cnVlOworCXNw aW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXYtPmxvY2ssIGZsYWdzKTsKKworCWlmICgheGZlcl9h Y3RpdmUpCisJCXN1bjUwaV9hMTAwX2xlZGNfc3RhcnRfeGZlcihwcml2LCBuZXh0X2xlbmd0aCk7 Cit9CisKK3N0YXRpYyBjb25zdCBjaGFyICpjb25zdCBzdW41MGlfYTEwMF9sZWRjX2Zvcm1hdHNb XSA9IHsKKwkicmdiIiwKKwkicmJnIiwKKwkiZ3JiIiwKKwkiZ2JyIiwKKwkiYnJnIiwKKwkiYmdy IiwKK307CisKK3N0YXRpYyBpbnQgc3VuNTBpX2ExMDBfbGVkY19wYXJzZV9mb3JtYXQoY29uc3Qg c3RydWN0IGRldmljZV9ub2RlICpucCwKKwkJCQkJIHN0cnVjdCBzdW41MGlfYTEwMF9sZWRjICpw cml2KQoreworCWNvbnN0IGNoYXIgKmZvcm1hdCA9ICJncmIiOworCXUzMiBpOworCisJb2ZfcHJv cGVydHlfcmVhZF9zdHJpbmcobnAsICJhbGx3aW5uZXIscGl4ZWwtZm9ybWF0IiwgJmZvcm1hdCk7 CisKKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShzdW41MGlfYTEwMF9sZWRjX2Zvcm1hdHMp OyArK2kpIHsKKwkJaWYgKCFzdHJjbXAoZm9ybWF0LCBzdW41MGlfYTEwMF9sZWRjX2Zvcm1hdHNb aV0pKSB7CisJCQlwcml2LT5mb3JtYXQgPSBpOworCQkJcmV0dXJuIDA7CisJCX0KKwl9CisKKwlk ZXZfZXJyKHByaXYtPmRldiwgIkJhZCBwaXhlbCBmb3JtYXQgJyVzJ1xuIiwgZm9ybWF0KTsKKwor CXJldHVybiAtRUlOVkFMOworfQorCitzdGF0aWMgdm9pZCBzdW41MGlfYTEwMF9sZWRjX3NldF9m b3JtYXQoc3RydWN0IHN1bjUwaV9hMTAwX2xlZGMgKnByaXYpCit7CisJdTMyIHZhbDsKKworCXZh bCA9IHJlYWRsKHByaXYtPmJhc2UgKyBMRURDX0NUUkxfUkVHKTsKKwl2YWwgJj0gfkxFRENfQ1RS TF9SRUdfUkdCX01PREU7CisJdmFsIHw9IHByaXYtPmZvcm1hdCA8PCA2OworCXdyaXRlbCh2YWws IHByaXYtPmJhc2UgKyBMRURDX0NUUkxfUkVHKTsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBz dW41MGlfYTEwMF9sZWRjX3RpbWluZyBzdW41MGlfYTEwMF9sZWRjX2RlZmF1bHRfdGltaW5nID0g eworCS50MGhfbnMgPSAzMzYsCisJLnQwbF9ucyA9IDg0MCwKKwkudDFoX25zID0gODgyLAorCS50 MWxfbnMgPSAyOTQsCisJLnRyZXNldF9ucyA9IDMwMDAwMCwKK307CisKK3N0YXRpYyBpbnQgc3Vu NTBpX2ExMDBfbGVkY19wYXJzZV90aW1pbmcoY29uc3Qgc3RydWN0IGRldmljZV9ub2RlICpucCwK KwkJCQkJIHN0cnVjdCBzdW41MGlfYTEwMF9sZWRjICpwcml2KQoreworCXN0cnVjdCBzdW41MGlf YTEwMF9sZWRjX3RpbWluZyAqdGltaW5nID0gJnByaXYtPnRpbWluZzsKKworCSp0aW1pbmcgPSBz dW41MGlfYTEwMF9sZWRjX2RlZmF1bHRfdGltaW5nOworCisJb2ZfcHJvcGVydHlfcmVhZF91MzIo bnAsICJhbGx3aW5uZXIsdDBoLW5zIiwgJnRpbWluZy0+dDBoX25zKTsKKwlvZl9wcm9wZXJ0eV9y ZWFkX3UzMihucCwgImFsbHdpbm5lcix0MGwtbnMiLCAmdGltaW5nLT50MGxfbnMpOworCW9mX3By b3BlcnR5X3JlYWRfdTMyKG5wLCAiYWxsd2lubmVyLHQxaC1ucyIsICZ0aW1pbmctPnQxaF9ucyk7 CisJb2ZfcHJvcGVydHlfcmVhZF91MzIobnAsICJhbGx3aW5uZXIsdDFsLW5zIiwgJnRpbWluZy0+ dDFsX25zKTsKKwlvZl9wcm9wZXJ0eV9yZWFkX3UzMihucCwgImFsbHdpbm5lcix0cmVzZXQtbnMi LCAmdGltaW5nLT50cmVzZXRfbnMpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHN1 bjUwaV9hMTAwX2xlZGNfc2V0X3RpbWluZyhzdHJ1Y3Qgc3VuNTBpX2ExMDBfbGVkYyAqcHJpdikK K3sKKwljb25zdCBzdHJ1Y3Qgc3VuNTBpX2ExMDBfbGVkY190aW1pbmcgKnRpbWluZyA9ICZwcml2 LT50aW1pbmc7CisJdW5zaWduZWQgbG9uZyBtb2RfZnJlcSA9IGNsa19nZXRfcmF0ZShwcml2LT5t b2RfY2xrKTsKKwl1MzIgY3ljbGVfbnMgPSBOU0VDX1BFUl9TRUMgLyBtb2RfZnJlcTsKKwl1MzIg dmFsOworCisJdmFsID0gKHRpbWluZy0+dDFoX25zIC8gY3ljbGVfbnMpIDw8IDIxIHwKKwkgICAg ICAodGltaW5nLT50MWxfbnMgLyBjeWNsZV9ucykgPDwgMTYgfAorCSAgICAgICh0aW1pbmctPnQw aF9ucyAvIGN5Y2xlX25zKSA8PCAgNiB8CisJICAgICAgKHRpbWluZy0+dDBsX25zIC8gY3ljbGVf bnMpOworCXdyaXRlbCh2YWwsIHByaXYtPmJhc2UgKyBMRURDX1QwMV9USU1JTkdfQ1RSTF9SRUcp OworCisJdmFsID0gKHRpbWluZy0+dHJlc2V0X25zIC8gY3ljbGVfbnMpIDw8IDE2IHwKKwkgICAg ICAocHJpdi0+bnVtX2xlZHMgLSAxKTsKKwl3cml0ZWwodmFsLCBwcml2LT5iYXNlICsgTEVEQ19S RVNFVF9USU1JTkdfQ1RSTF9SRUcpOworfQorCitzdGF0aWMgaW50IHN1bjUwaV9hMTAwX2xlZGNf cmVzdW1lKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3Qgc3VuNTBpX2ExMDBfbGVkYyAq cHJpdiA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXUzMiB2YWw7CisJaW50IHJldDsKKworCXJl dCA9IHJlc2V0X2NvbnRyb2xfZGVhc3NlcnQocHJpdi0+cmVzZXQpOworCWlmIChyZXQpCisJCXJl dHVybiByZXQ7CisKKwlyZXQgPSBjbGtfcHJlcGFyZV9lbmFibGUocHJpdi0+YnVzX2Nsayk7CisJ aWYgKHJldCkKKwkJZ290byBlcnJfYXNzZXJ0X3Jlc2V0OworCisJcmV0ID0gY2xrX3ByZXBhcmVf ZW5hYmxlKHByaXYtPm1vZF9jbGspOworCWlmIChyZXQpCisJCWdvdG8gZXJyX2Rpc2FibGVfYnVz X2NsazsKKworCXN1bjUwaV9hMTAwX2xlZGNfc2V0X2Zvcm1hdChwcml2KTsKKwlzdW41MGlfYTEw MF9sZWRjX3NldF90aW1pbmcocHJpdik7CisKKwkvKiBUaGUgdHJpZ2dlciBsZXZlbCBtdXN0IGJl IGF0IGxlYXN0IHRoZSBidXJzdCBsZW5ndGguICovCisJdmFsID0gcmVhZGwocHJpdi0+YmFzZSAr IExFRENfRE1BX0NUUkxfUkVHKTsKKwl2YWwgJj0gfkxFRENfRE1BX0NUUkxfUkVHX0ZJRk9fVFJJ R19MRVZFTDsKKwl2YWwgfD0gTEVEQ19GSUZPX0RFUFRIIC8gMjsKKwl3cml0ZWwodmFsLCBwcml2 LT5iYXNlICsgTEVEQ19ETUFfQ1RSTF9SRUcpOworCisJdmFsID0gTEVEQ19JTlRfQ1RSTF9SRUdf R0xPQkFMX0lOVF9FTiB8CisJICAgICAgTEVEQ19JTlRfQ1RSTF9SRUdfVFJBTlNfRklOSVNIX0lO VF9FTjsKKwl3cml0ZWwodmFsLCBwcml2LT5iYXNlICsgTEVEQ19JTlRfQ1RSTF9SRUcpOworCisJ cmV0dXJuIDA7CisKK2Vycl9kaXNhYmxlX2J1c19jbGs6CisJY2xrX2Rpc2FibGVfdW5wcmVwYXJl KHByaXYtPmJ1c19jbGspOworZXJyX2Fzc2VydF9yZXNldDoKKwlyZXNldF9jb250cm9sX2Fzc2Vy dChwcml2LT5yZXNldCk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IHN1bjUwaV9h MTAwX2xlZGNfc3VzcGVuZChzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHN1bjUwaV9h MTAwX2xlZGMgKnByaXYgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKworCWNsa19kaXNhYmxlX3Vu cHJlcGFyZShwcml2LT5tb2RfY2xrKTsKKwljbGtfZGlzYWJsZV91bnByZXBhcmUocHJpdi0+YnVz X2Nsayk7CisJcmVzZXRfY29udHJvbF9hc3NlcnQocHJpdi0+cmVzZXQpOworCisJcmV0dXJuIDA7 Cit9CisKK3N0YXRpYyB2b2lkIHN1bjUwaV9hMTAwX2xlZGNfZG1hX2NsZWFudXAodm9pZCAqZGF0 YSkKK3sKKwlzdHJ1Y3Qgc3VuNTBpX2ExMDBfbGVkYyAqcHJpdiA9IGRhdGE7CisJc3RydWN0IGRl dmljZSAqZG1hX2RldiA9IGRtYWVuZ2luZV9nZXRfZG1hX2RldmljZShwcml2LT5kbWFfY2hhbik7 CisKKwlpZiAocHJpdi0+YnVmZmVyKQorCQlkbWFfZnJlZV93YyhkbWFfZGV2LCBMRURTX1RPX0JZ VEVTKHByaXYtPm51bV9sZWRzKSwKKwkJCSAgICBwcml2LT5idWZmZXIsIHByaXYtPmRtYV9oYW5k bGUpOworCWRtYV9yZWxlYXNlX2NoYW5uZWwocHJpdi0+ZG1hX2NoYW4pOworfQorCitzdGF0aWMg aW50IHN1bjUwaV9hMTAwX2xlZGNfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikK K3sKKwljb25zdCBzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wID0gcGRldi0+ZGV2Lm9mX25vZGU7CisJ c3RydWN0IGRtYV9zbGF2ZV9jb25maWcgZG1hX2NmZyA9IHt9OworCXN0cnVjdCBsZWRfaW5pdF9k YXRhIGluaXRfZGF0YSA9IHt9OworCXN0cnVjdCBkZXZpY2UgKmRldiA9ICZwZGV2LT5kZXY7CisJ c3RydWN0IGRldmljZV9ub2RlICpjaGlsZDsKKwlzdHJ1Y3Qgc3VuNTBpX2ExMDBfbGVkYyAqcHJp djsKKwlzdHJ1Y3QgcmVzb3VyY2UgKm1lbTsKKwlpbnQgY291bnQsIGlycSwgcmV0OworCisJY291 bnQgPSBvZl9nZXRfYXZhaWxhYmxlX2NoaWxkX2NvdW50KG5wKTsKKwlpZiAoIWNvdW50KQorCQly ZXR1cm4gLUVOT0RFVjsKKwlpZiAoY291bnQgPiBMRURDX01BWF9MRURTKSB7CisJCWRldl9lcnIo ZGV2LCAiVG9vIG1hbnkgTEVEcyEgKG1heCBpcyAlZClcbiIsIExFRENfTUFYX0xFRFMpOworCQly ZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlwcml2ID0gZGV2bV9remFsbG9jKGRldiwgc3RydWN0X3Np emUocHJpdiwgbGVkcywgY291bnQpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXByaXYpCisJCXJldHVy biAtRU5PTUVNOworCisJcHJpdi0+ZGV2ID0gZGV2OworCXByaXYtPm51bV9sZWRzID0gY291bnQ7 CisJc3Bpbl9sb2NrX2luaXQoJnByaXYtPmxvY2spOworCWRldl9zZXRfZHJ2ZGF0YShkZXYsIHBy aXYpOworCisJcmV0ID0gc3VuNTBpX2ExMDBfbGVkY19wYXJzZV9mb3JtYXQobnAsIHByaXYpOwor CWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwlyZXQgPSBzdW41MGlfYTEwMF9sZWRjX3BhcnNl X3RpbWluZyhucCwgcHJpdik7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCXByaXYtPmJh c2UgPSBkZXZtX3BsYXRmb3JtX2dldF9hbmRfaW9yZW1hcF9yZXNvdXJjZShwZGV2LCAwLCAmbWVt KTsKKwlpZiAoSVNfRVJSKHByaXYtPmJhc2UpKQorCQlyZXR1cm4gUFRSX0VSUihwcml2LT5iYXNl KTsKKworCXByaXYtPmJ1c19jbGsgPSBkZXZtX2Nsa19nZXQoZGV2LCAiYnVzIik7CisJaWYgKElT X0VSUihwcml2LT5idXNfY2xrKSkKKwkJcmV0dXJuIFBUUl9FUlIocHJpdi0+YnVzX2Nsayk7CisK Kwlwcml2LT5tb2RfY2xrID0gZGV2bV9jbGtfZ2V0KGRldiwgIm1vZCIpOworCWlmIChJU19FUlIo cHJpdi0+bW9kX2NsaykpCisJCXJldHVybiBQVFJfRVJSKHByaXYtPm1vZF9jbGspOworCisJcHJp di0+cmVzZXQgPSBkZXZtX3Jlc2V0X2NvbnRyb2xfZ2V0X2V4Y2x1c2l2ZShkZXYsIE5VTEwpOwor CWlmIChJU19FUlIocHJpdi0+cmVzZXQpKQorCQlyZXR1cm4gUFRSX0VSUihwcml2LT5yZXNldCk7 CisKKwlwcml2LT5kbWFfY2hhbiA9IGRtYV9yZXF1ZXN0X2NoYW4oZGV2LCAidHgiKTsKKwlpZiAo SVNfRVJSKHByaXYtPmRtYV9jaGFuKSkKKwkJcmV0dXJuIFBUUl9FUlIocHJpdi0+ZG1hX2NoYW4p OworCisJcmV0ID0gZGV2bV9hZGRfYWN0aW9uX29yX3Jlc2V0KGRldiwgc3VuNTBpX2ExMDBfbGVk Y19kbWFfY2xlYW51cCwgcHJpdik7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCWRtYV9j ZmcuZHN0X2FkZHIJPSBtZW0tPnN0YXJ0ICsgTEVEQ19EQVRBX1JFRzsKKwlkbWFfY2ZnLmRzdF9h ZGRyX3dpZHRoCT0gRE1BX1NMQVZFX0JVU1dJRFRIXzRfQllURVM7CisJZG1hX2NmZy5kc3RfbWF4 YnVyc3QJPSBMRURDX0ZJRk9fREVQVEggLyAyOworCXJldCA9IGRtYWVuZ2luZV9zbGF2ZV9jb25m aWcocHJpdi0+ZG1hX2NoYW4sICZkbWFfY2ZnKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0Owor CisJcHJpdi0+YnVmZmVyID0gZG1hX2FsbG9jX3djKGRtYWVuZ2luZV9nZXRfZG1hX2RldmljZShw cml2LT5kbWFfY2hhbiksCisJCQkJICAgIExFRFNfVE9fQllURVMocHJpdi0+bnVtX2xlZHMpLAor CQkJCSAgICAmcHJpdi0+ZG1hX2hhbmRsZSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFwcml2LT5idWZm ZXIpCisJCXJldHVybiAtRU5PTUVNOworCisJaXJxID0gcGxhdGZvcm1fZ2V0X2lycShwZGV2LCAw KTsKKwlpZiAoaXJxIDwgMCkKKwkJcmV0dXJuIGlycTsKKworCXJldCA9IGRldm1fcmVxdWVzdF9p cnEoZGV2LCBpcnEsIHN1bjUwaV9hMTAwX2xlZGNfaXJxLAorCQkJICAgICAgIDAsIGRldl9uYW1l KGRldiksIHByaXYpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwlyZXQgPSBzdW41MGlf YTEwMF9sZWRjX3Jlc3VtZShkZXYpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwlmb3Jf ZWFjaF9hdmFpbGFibGVfY2hpbGRfb2Zfbm9kZShucCwgY2hpbGQpIHsKKwkJc3RydWN0IHN1bjUw aV9hMTAwX2xlZGNfbGVkICpsZWQ7CisJCXN0cnVjdCBsZWRfY2xhc3NkZXYgKmNkZXY7CisJCXUz MiBhZGRyLCBjb2xvcjsKKworCQlyZXQgPSBvZl9wcm9wZXJ0eV9yZWFkX3UzMihjaGlsZCwgInJl ZyIsICZhZGRyKTsKKwkJaWYgKHJldCB8fCBhZGRyID49IGNvdW50KSB7CisJCQlkZXZfZXJyKGRl diwgIkxFRCAncmVnJyB2YWx1ZXMgbXVzdCBiZSBmcm9tIDAgdG8gJWRcbiIsCisJCQkJcHJpdi0+ bnVtX2xlZHMgLSAxKTsKKwkJCXJldCA9IC1FSU5WQUw7CisJCQlnb3RvIGVycl9wdXRfY2hpbGQ7 CisJCX0KKworCQlyZXQgPSBvZl9wcm9wZXJ0eV9yZWFkX3UzMihjaGlsZCwgImNvbG9yIiwgJmNv bG9yKTsKKwkJaWYgKHJldCB8fCBjb2xvciAhPSBMRURfQ09MT1JfSURfUkdCKSB7CisJCQlkZXZf ZXJyKGRldiwgIkxFRCAnY29sb3InIG11c3QgYmUgTEVEX0NPTE9SX0lEX1JHQlxuIik7CisJCQly ZXQgPSAtRUlOVkFMOworCQkJZ290byBlcnJfcHV0X2NoaWxkOworCQl9CisKKwkJbGVkID0gJnBy aXYtPmxlZHNbYWRkcl07CisKKwkJbGVkLT5zdWJsZWRfaW5mb1swXS5jb2xvcl9pbmRleCA9IExF RF9DT0xPUl9JRF9SRUQ7CisJCWxlZC0+c3VibGVkX2luZm9bMF0uY2hhbm5lbCA9IDA7CisJCWxl ZC0+c3VibGVkX2luZm9bMV0uY29sb3JfaW5kZXggPSBMRURfQ09MT1JfSURfR1JFRU47CisJCWxl ZC0+c3VibGVkX2luZm9bMV0uY2hhbm5lbCA9IDE7CisJCWxlZC0+c3VibGVkX2luZm9bMl0uY29s b3JfaW5kZXggPSBMRURfQ09MT1JfSURfQkxVRTsKKwkJbGVkLT5zdWJsZWRfaW5mb1syXS5jaGFu bmVsID0gMjsKKworCQlsZWQtPm1jX2NkZXYubnVtX2NvbG9ycyA9IEFSUkFZX1NJWkUobGVkLT5z dWJsZWRfaW5mbyk7CisJCWxlZC0+bWNfY2Rldi5zdWJsZWRfaW5mbyA9IGxlZC0+c3VibGVkX2lu Zm87CisKKwkJY2RldiA9ICZsZWQtPm1jX2NkZXYubGVkX2NkZXY7CisJCWNkZXYtPm1heF9icmln aHRuZXNzID0gVThfTUFYOworCQljZGV2LT5icmlnaHRuZXNzX3NldCA9IHN1bjUwaV9hMTAwX2xl ZGNfYnJpZ2h0bmVzc19zZXQ7CisKKwkJaW5pdF9kYXRhLmZ3bm9kZSA9IG9mX2Z3bm9kZV9oYW5k bGUoY2hpbGQpOworCisJCXJldCA9IGRldm1fbGVkX2NsYXNzZGV2X211bHRpY29sb3JfcmVnaXN0 ZXJfZXh0KGRldiwKKwkJCQkJCQkJJmxlZC0+bWNfY2RldiwKKwkJCQkJCQkJJmluaXRfZGF0YSk7 CisJCWlmIChyZXQpIHsKKwkJCWRldl9lcnIoZGV2LCAiRmFpbGVkIHRvIHJlZ2lzdGVyIExFRCAl dTogJWRcbiIsCisJCQkJYWRkciwgcmV0KTsKKwkJCWdvdG8gZXJyX3B1dF9jaGlsZDsKKwkJfQor CX0KKworCWRldl9pbmZvKGRldiwgIlJlZ2lzdGVyZWQgJWQgTEVEc1xuIiwgcHJpdi0+bnVtX2xl ZHMpOworCisJcmV0dXJuIDA7CisKK2Vycl9wdXRfY2hpbGQ6CisJb2Zfbm9kZV9wdXQoY2hpbGQp OworCXN1bjUwaV9hMTAwX2xlZGNfc3VzcGVuZCgmcGRldi0+ZGV2KTsKKworCXJldHVybiByZXQ7 Cit9CisKK3N0YXRpYyBpbnQgc3VuNTBpX2ExMDBfbGVkY19yZW1vdmUoc3RydWN0IHBsYXRmb3Jt X2RldmljZSAqcGRldikKK3sKKwlzdW41MGlfYTEwMF9sZWRjX3N1c3BlbmQoJnBkZXYtPmRldik7 CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgc3VuNTBpX2ExMDBfbGVkY19zaHV0ZG93 bihzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXN1bjUwaV9hMTAwX2xlZGNfc3Vz cGVuZCgmcGRldi0+ZGV2KTsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQg c3VuNTBpX2ExMDBfbGVkY19vZl9tYXRjaFtdID0geworCXsgLmNvbXBhdGlibGUgPSAiYWxsd2lu bmVyLHN1bjUwaS1hMTAwLWxlZGMiIH0sCisJe30KK307CitNT0RVTEVfREVWSUNFX1RBQkxFKG9m LCBzdW41MGlfYTEwMF9sZWRjX29mX21hdGNoKTsKKworc3RhdGljIERFRklORV9TSU1QTEVfREVW X1BNX09QUyhzdW41MGlfYTEwMF9sZWRjX3BtLAorCQkJCXN1bjUwaV9hMTAwX2xlZGNfc3VzcGVu ZCwKKwkJCQlzdW41MGlfYTEwMF9sZWRjX3Jlc3VtZSk7CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZv cm1fZHJpdmVyIHN1bjUwaV9hMTAwX2xlZGNfZHJpdmVyID0geworCS5wcm9iZQkJPSBzdW41MGlf YTEwMF9sZWRjX3Byb2JlLAorCS5yZW1vdmUJCT0gc3VuNTBpX2ExMDBfbGVkY19yZW1vdmUsCisJ LnNodXRkb3duCT0gc3VuNTBpX2ExMDBfbGVkY19zaHV0ZG93biwKKwkuZHJpdmVyCQk9IHsKKwkJ Lm5hbWUJCT0gInN1bjUwaS1hMTAwLWxlZGMiLAorCQkub2ZfbWF0Y2hfdGFibGUJPSBzdW41MGlf YTEwMF9sZWRjX29mX21hdGNoLAorCQkucG0JCT0gcG1fcHRyKCZzdW41MGlfYTEwMF9sZWRjX3Bt KSwKKwl9LAorfTsKK21vZHVsZV9wbGF0Zm9ybV9kcml2ZXIoc3VuNTBpX2ExMDBfbGVkY19kcml2 ZXIpOworCitNT0RVTEVfQVVUSE9SKCJTYW11ZWwgSG9sbGFuZCA8c2FtdWVsQHNob2xsYW5kLm9y Zz4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiQWxsd2lubmVyIEExMDAgTEVEIGNvbnRyb2xsZXIg ZHJpdmVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7Ci0tIAoyLjM3LjQKCgpfX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwpsaW51eC1yaXNjdiBtYWlsaW5n IGxpc3QKbGludXgtcmlzY3ZAbGlzdHMuaW5mcmFkZWFkLm9yZwpodHRwOi8vbGlzdHMuaW5mcmFk ZWFkLm9yZy9tYWlsbWFuL2xpc3RpbmZvL2xpbnV4LXJpc2N2Cg==