From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (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 F05D33229 for ; Wed, 1 Mar 2023 14:27:50 +0000 (UTC) Received: by smtp.kernel.org (Postfix) with ESMTPSA id 9CCEBC433EF; Wed, 1 Mar 2023 14:27:46 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1677680870; bh=ttkMVI2PgJT17F1GCf+MRcAKRGAwKJrx7jI40ihN05o=; h=Date:From:To:Cc:Subject:References:In-Reply-To:From; b=d2Eh3J6sfKwwi+WAWoVaAFhsN38gHZH07XDoPgXzPsuGEwqEg14yOzgvna30/tEC4 6/QfYCilKghH7PGoL8ICi716UfLENTfBsfDJ2x9psBEf3q9hVpCuoAfaiD9IWPI44+ vzQGI+ef+EqBhWcWkwnH10yhXzPscC3PZEUO73q2u7J55MH6ZaZmSpd625ZqQ6hKX5 Q/4Wssrw9ER2RbZ9axhRhW2bdea7xHbFHFpxhuKMG/GN6cncW1w16en99vtiShaV7r TGhDA7Qi43oH3toVKY6dMYXeorpfhd2RDZOAnc4m9eOJKDHdi9YPp2ch3/0PBQaRPS P3A38sdKFtwhg== Date: Wed, 1 Mar 2023 14:27:43 +0000 From: Lee Jones To: Samuel Holland Cc: Pavel Machek , linux-leds@vger.kernel.org, Chen-Yu Tsai , Jernej Skrabec , 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: Re: [RESEND PATCH v7 2/5] leds: sun50i-a100: New driver for the A100 LED controller Message-ID: References: <20221231235541.13568-1-samuel@sholland.org> <20221231235541.13568-3-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-Disposition: inline Content-Transfer-Encoding: 8bit In-Reply-To: Pavel, I see that you are active now - could you please prioritise this one. On Mon, 09 Jan 2023, Lee Jones wrote: > One more for Pavel until I can build my LEDs specific knowledge sufficiently. > > On Sat, 31 Dec 2022, Samuel Holland wrote: > > > 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 > > > > -- > Lee Jones [李琼斯] -- Lee Jones [李琼斯] 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 E91FDC6FA9D for ; Wed, 1 Mar 2023 14:28:17 +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:In-Reply-To:MIME-Version:References: Message-ID:Subject:Cc:To:From:Date:Reply-To:Content-ID:Content-Description: Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID: List-Owner; bh=/FpYc7x8h3kO2KsR8JeSTU52BbVZ0/P9FdDDA8+wWM8=; b=Qvz/bUgk2TF97h hk3yVR8SBDUvz4vWQxOYTyLJBw3jhXPxEKevJzp4i6lWzkoGxFGZBjdOqd587CtLQRBOd9mRYzAJs SybzqfBGMyr7PUXdNkqtUb6lDSQrhgqUdWTVltxB2T6kjZo19Lat1xiK537tuKoERbdN7ioVnrA+T MKQzOoNH9rp1qe2q81CG7WFFHfXXIiSJFyqDq9+aG0y5soVbJFixTYGWkeAdjTxLjl22gVOjn2a9O QOyeZ1413Gu6YpEbG186+cVX/8Pr02hm8VrX/XYOWyrNS6TSVWVE22+x4sR0G9sJpkpZAMbwLEm81 UBblSUzfCkK3Tpj2zRIQ==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.94.2 #2 (Red Hat Linux)) id 1pXNRB-00GRqQ-0L; Wed, 01 Mar 2023 14:28:09 +0000 Received: from sin.source.kernel.org ([145.40.73.55]) by bombadil.infradead.org with esmtps (Exim 4.94.2 #2 (Red Hat Linux)) id 1pXNQz-00GRoa-6U; Wed, 01 Mar 2023 14:28:00 +0000 Received: from smtp.kernel.org (relay.kernel.org [52.25.139.140]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by sin.source.kernel.org (Postfix) with ESMTPS id 627A3CE1D27; Wed, 1 Mar 2023 14:27:52 +0000 (UTC) Received: by smtp.kernel.org (Postfix) with ESMTPSA id 9CCEBC433EF; Wed, 1 Mar 2023 14:27:46 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1677680870; bh=ttkMVI2PgJT17F1GCf+MRcAKRGAwKJrx7jI40ihN05o=; h=Date:From:To:Cc:Subject:References:In-Reply-To:From; b=d2Eh3J6sfKwwi+WAWoVaAFhsN38gHZH07XDoPgXzPsuGEwqEg14yOzgvna30/tEC4 6/QfYCilKghH7PGoL8ICi716UfLENTfBsfDJ2x9psBEf3q9hVpCuoAfaiD9IWPI44+ vzQGI+ef+EqBhWcWkwnH10yhXzPscC3PZEUO73q2u7J55MH6ZaZmSpd625ZqQ6hKX5 Q/4Wssrw9ER2RbZ9axhRhW2bdea7xHbFHFpxhuKMG/GN6cncW1w16en99vtiShaV7r TGhDA7Qi43oH3toVKY6dMYXeorpfhd2RDZOAnc4m9eOJKDHdi9YPp2ch3/0PBQaRPS P3A38sdKFtwhg== Date: Wed, 1 Mar 2023 14:27:43 +0000 From: Lee Jones To: Samuel Holland Cc: Pavel Machek , linux-leds@vger.kernel.org, Chen-Yu Tsai , Jernej Skrabec , 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: Re: [RESEND PATCH v7 2/5] leds: sun50i-a100: New driver for the A100 LED controller Message-ID: References: <20221231235541.13568-1-samuel@sholland.org> <20221231235541.13568-3-samuel@sholland.org> MIME-Version: 1.0 Content-Disposition: inline In-Reply-To: X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20230301_062757_643694_7B4C4551 X-CRM114-Status: GOOD ( 40.05 ) 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 UGF2ZWwsCgpJIHNlZSB0aGF0IHlvdSBhcmUgYWN0aXZlIG5vdyAtIGNvdWxkIHlvdSBwbGVhc2Ug cHJpb3JpdGlzZSB0aGlzIG9uZS4KCk9uIE1vbiwgMDkgSmFuIDIwMjMsIExlZSBKb25lcyB3cm90 ZToKCj4gT25lIG1vcmUgZm9yIFBhdmVsIHVudGlsIEkgY2FuIGJ1aWxkIG15IExFRHMgc3BlY2lm aWMga25vd2xlZGdlIHN1ZmZpY2llbnRseS4KPiAKPiBPbiBTYXQsIDMxIERlYyAyMDIyLCBTYW11 ZWwgSG9sbGFuZCB3cm90ZToKPiAKPiA+IFNvbWUgQWxsd2lubmVyIHN1bnhpIFNvQ3MsIHN0YXJ0 aW5nIHdpdGggdGhlIEExMDAsIGNvbnRhaW4gYW4gTEVECj4gPiBjb250cm9sbGVyIGRlc2lnbmVk IHRvIGRyaXZlIFJHQiBMRUQgcGl4ZWxzLiBBZGQgYSBkcml2ZXIgZm9yIGl0IHVzaW5nCj4gPiB0 aGUgbXVsdGljb2xvciBMRUQgZnJhbWV3b3JrLCBhbmQgd2l0aCBMRURzIGRlZmluZWQgaW4gdGhl IGRldmljZSB0cmVlLgo+ID4gCj4gPiBBY2tlZC1ieTogSmVybmVqIFNrcmFiZWMgPGplcm5lai5z a3JhYmVjQGdtYWlsLmNvbT4KPiA+IFNpZ25lZC1vZmYtYnk6IFNhbXVlbCBIb2xsYW5kIDxzYW11 ZWxAc2hvbGxhbmQub3JnPgo+ID4gLS0tCj4gPiAKPiA+IENoYW5nZXMgaW4gdjc6Cj4gPiAgLSBV c2UgREVGSU5FX1NJTVBMRV9ERVZfUE1fT1BTCj4gPiAKPiA+IENoYW5nZXMgaW4gdjU6Cj4gPiAg LSBSZW5hbWUgdGhlIGRyaXZlciBSMzI5IC0+IEExMDAsIHNpbmNlIHRoYXQgaXMgdGhlIGFjdHVh bCBvcmlnaW5hbAo+ID4gICAgaW1wbGVtZW50YXRpb24KPiA+IAo+ID4gQ2hhbmdlcyBpbiB2NDoK PiA+ICAtIERlcGVuZCBvbiBMRURTX0NMQVNTX01VTFRJQ09MT1IKPiA+IAo+ID4gQ2hhbmdlcyBp biB2MzoKPiA+ICAtIEFkZGVkIHZlbmRvciBwcmVmaXggdG8gdGltaW5nL2Zvcm1hdCBwcm9wZXJ0 aWVzCj4gPiAgLSBSZW5hbWVkICJmb3JtYXQiIHByb3BlcnR5IHRvICJwaXhlbC1mb3JtYXQiIGZv ciBjbGFyaXR5Cj4gPiAgLSBEcm9wcGVkICJ2bGVkLXN1cHBseSIgYXMgaXQgaXMgdW5yZWxhdGVk IHRvIHRoZSBjb250cm9sbGVyIGhhcmR3YXJlCj4gPiAgLSBDaGFuZ2VkICJ3cml0ZXNsIiB0byAi aW93cml0ZTMyX3JlcCIgc28gdGhlIGRyaXZlciBidWlsZHMgb24gaHBwYQo+ID4gCj4gPiBDaGFu Z2VzIGluIHYyOgo+ID4gIC0gUmVuYW1lZCBmcm9tIHN1bnhpLWxlZGMgdG8gc3VuNTBpLXIzMjkt bGVkYwo+ID4gIC0gQWRkZWQgbWlzc2luZyAic3RhdGljIiB0byBmdW5jdGlvbnMvZ2xvYmFscyBh cyByZXBvcnRlZCBieSAwZGF5IGJvdAo+ID4gCj4gPiAgZHJpdmVycy9sZWRzL0tjb25maWcgICAg ICAgICAgICB8ICAgOSArCj4gPiAgZHJpdmVycy9sZWRzL01ha2VmaWxlICAgICAgICAgICB8ICAg MSArCj4gPiAgZHJpdmVycy9sZWRzL2xlZHMtc3VuNTBpLWExMDAuYyB8IDU1NSArKysrKysrKysr KysrKysrKysrKysrKysrKysrKysrKwo+ID4gIDMgZmlsZXMgY2hhbmdlZCwgNTY1IGluc2VydGlv bnMoKykKPiA+ICBjcmVhdGUgbW9kZSAxMDA2NDQgZHJpdmVycy9sZWRzL2xlZHMtc3VuNTBpLWEx MDAuYwo+ID4gCj4gPiBkaWZmIC0tZ2l0IGEvZHJpdmVycy9sZWRzL0tjb25maWcgYi9kcml2ZXJz L2xlZHMvS2NvbmZpZwo+ID4gaW5kZXggNDk5ZDBmMjE1YThiLi40ZjRjNTE1ZWQ3ZDcgMTAwNjQ0 Cj4gPiAtLS0gYS9kcml2ZXJzL2xlZHMvS2NvbmZpZwo+ID4gKysrIGIvZHJpdmVycy9sZWRzL0tj b25maWcKPiA+IEBAIC0yODEsNiArMjgxLDE1IEBAIGNvbmZpZyBMRURTX0NPQkFMVF9SQVEKPiA+ ICAJaGVscAo+ID4gIAkgIFRoaXMgb3B0aW9uIGVuYWJsZXMgc3VwcG9ydCBmb3IgdGhlIENvYmFs dCBSYXEgc2VyaWVzIExFRHMuCj4gPiAgCj4gPiArY29uZmlnIExFRFNfU1VONTBJX0ExMDAKPiA+ ICsJdHJpc3RhdGUgIkxFRCBzdXBwb3J0IGZvciBBbGx3aW5uZXIgQTEwMCBSR0IgTEVEIGNvbnRy b2xsZXIiCj4gPiArCWRlcGVuZHMgb24gTEVEU19DTEFTU19NVUxUSUNPTE9SICYmIE9GCj4gPiAr CWRlcGVuZHMgb24gQVJDSF9TVU5YSSB8fCBDT01QSUxFX1RFU1QKPiA+ICsJaGVscAo+ID4gKwkg IFRoaXMgb3B0aW9uIGVuYWJsZXMgc3VwcG9ydCBmb3IgdGhlIFJHQiBMRUQgY29udHJvbGxlciBm b3VuZAo+ID4gKwkgIGluIHNvbWUgQWxsd2lubmVyIHN1bnhpIFNvQ3MsIGluY2x1ZGVpbmcgQTEw MCwgUjMyOSwgYW5kIEQxLgo+ID4gKwkgIEl0IHVzZXMgYSBvbmUtd2lyZSBpbnRlcmZhY2UgdG8g Y29udHJvbCB1cCB0byAxMDI0IExFRHMuCj4gPiArCj4gPiAgY29uZmlnIExFRFNfU1VORklSRQo+ ID4gIAl0cmlzdGF0ZSAiTEVEIHN1cHBvcnQgZm9yIFN1bkZpcmUgc2VydmVycy4iCj4gPiAgCWRl cGVuZHMgb24gTEVEU19DTEFTUwo+ID4gZGlmZiAtLWdpdCBhL2RyaXZlcnMvbGVkcy9NYWtlZmls ZSBiL2RyaXZlcnMvbGVkcy9NYWtlZmlsZQo+ID4gaW5kZXggNGZkMmY5MmNkMTk4Li5hNmVlM2Y1 Y2Y3YmUgMTAwNjQ0Cj4gPiAtLS0gYS9kcml2ZXJzL2xlZHMvTWFrZWZpbGUKPiA+ICsrKyBiL2Ry aXZlcnMvbGVkcy9NYWtlZmlsZQo+ID4gQEAgLTc2LDYgKzc2LDcgQEAgb2JqLSQoQ09ORklHX0xF RFNfUFdNKQkJCSs9IGxlZHMtcHdtLm8KPiA+ICBvYmotJChDT05GSUdfTEVEU19SRUdVTEFUT1Ip CQkrPSBsZWRzLXJlZ3VsYXRvci5vCj4gPiAgb2JqLSQoQ09ORklHX0xFRFNfUzNDMjRYWCkJCSs9 IGxlZHMtczNjMjR4eC5vCj4gPiAgb2JqLSQoQ09ORklHX0xFRFNfU0MyN1hYX0JMVEMpCQkrPSBs ZWRzLXNjMjd4eC1ibHRjLm8KPiA+ICtvYmotJChDT05GSUdfTEVEU19TVU41MElfQTEwMCkJCSs9 IGxlZHMtc3VuNTBpLWExMDAubwo+ID4gIG9iai0kKENPTkZJR19MRURTX1NVTkZJUkUpCQkrPSBs ZWRzLXN1bmZpcmUubwo+ID4gIG9iai0kKENPTkZJR19MRURTX1NZU0NPTikJCSs9IGxlZHMtc3lz Y29uLm8KPiA+ICBvYmotJChDT05GSUdfTEVEU19UQ0E2NTA3KQkJKz0gbGVkcy10Y2E2NTA3Lm8K PiA+IGRpZmYgLS1naXQgYS9kcml2ZXJzL2xlZHMvbGVkcy1zdW41MGktYTEwMC5jIGIvZHJpdmVy cy9sZWRzL2xlZHMtc3VuNTBpLWExMDAuYwo+ID4gbmV3IGZpbGUgbW9kZSAxMDA2NDQKPiA+IGlu ZGV4IDAwMDAwMDAwMDAwMC4uMzBmYTliZTJjZjJkCj4gPiAtLS0gL2Rldi9udWxsCj4gPiArKysg Yi9kcml2ZXJzL2xlZHMvbGVkcy1zdW41MGktYTEwMC5jCj4gPiBAQCAtMCwwICsxLDU1NSBAQAo+ ID4gKy8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wCj4gPiArLy8KPiA+ICsvLyBD b3B5cmlnaHQgKGMpIDIwMjEtMjAyMiBTYW11ZWwgSG9sbGFuZCA8c2FtdWVsQHNob2xsYW5kLm9y Zz4KPiA+ICsvLwo+ID4gKy8vIFBhcnRseSBiYXNlZCBvbiBkcml2ZXJzL2xlZHMvbGVkcy10dXJy aXMtb21uaWEuYywgd2hpY2ggaXM6Cj4gPiArLy8gICAgIENvcHlyaWdodCAoYykgMjAyMCBieSBN YXJlayBCZWjDum4gPGthYmVsQGtlcm5lbC5vcmc+Cj4gPiArLy8KPiA+ICsKPiA+ICsjaW5jbHVk ZSA8bGludXgvY2xrLmg+Cj4gPiArI2luY2x1ZGUgPGxpbnV4L2RtYS1tYXBwaW5nLmg+Cj4gPiAr I2luY2x1ZGUgPGxpbnV4L2RtYWVuZ2luZS5oPgo+ID4gKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1 cHQuaD4KPiA+ICsjaW5jbHVkZSA8bGludXgvaW8uaD4KPiA+ICsjaW5jbHVkZSA8bGludXgvbGVk LWNsYXNzLW11bHRpY29sb3IuaD4KPiA+ICsjaW5jbHVkZSA8bGludXgvbGVkcy5oPgo+ID4gKyNp bmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KPiA+ICsjaW5jbHVkZSA8bGludXgvb2YuaD4KPiA+ICsj aW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+Cj4gPiArI2luY2x1ZGUgPGxpbnV4L3Bt Lmg+Cj4gPiArI2luY2x1ZGUgPGxpbnV4L3Jlc2V0Lmg+Cj4gPiArI2luY2x1ZGUgPGxpbnV4L3Nw aW5sb2NrLmg+Cj4gPiArCj4gPiArI2RlZmluZSBMRURDX0NUUkxfUkVHCQkJMHgwMDAwCj4gPiAr I2RlZmluZSBMRURDX0NUUkxfUkVHX0RBVEFfTEVOR1RICQkoMHgxZmZmIDw8IDE2KQo+ID4gKyNk ZWZpbmUgTEVEQ19DVFJMX1JFR19SR0JfTU9ERQkJCSgweDcgPDwgNikKPiA+ICsjZGVmaW5lIExF RENfQ1RSTF9SRUdfTEVEQ19FTgkJCUJJVCgwKQo+ID4gKyNkZWZpbmUgTEVEQ19UMDFfVElNSU5H X0NUUkxfUkVHCTB4MDAwNAo+ID4gKyNkZWZpbmUgTEVEQ19UMDFfVElNSU5HX0NUUkxfUkVHX1Qx SAkJKDB4M2YgPDwgMjEpCj4gPiArI2RlZmluZSBMRURDX1QwMV9USU1JTkdfQ1RSTF9SRUdfVDFM CQkoMHgxZiA8PCAxNikKPiA+ICsjZGVmaW5lIExFRENfVDAxX1RJTUlOR19DVFJMX1JFR19UMEgJ CSgweDFmIDw8IDYpCj4gPiArI2RlZmluZSBMRURDX1QwMV9USU1JTkdfQ1RSTF9SRUdfVDBMCQko MHgzZiA8PCAwKQo+ID4gKyNkZWZpbmUgTEVEQ19SRVNFVF9USU1JTkdfQ1RSTF9SRUcJMHgwMDBj Cj4gPiArI2RlZmluZSBMRURDX1JFU0VUX1RJTUlOR19DVFJMX1JFR19MRURfTlVNCSgweDNmZiA8 PCAwKQo+ID4gKyNkZWZpbmUgTEVEQ19EQVRBX1JFRwkJCTB4MDAxNAo+ID4gKyNkZWZpbmUgTEVE Q19ETUFfQ1RSTF9SRUcJCTB4MDAxOAo+ID4gKyNkZWZpbmUgTEVEQ19ETUFfQ1RSTF9SRUdfRklG T19UUklHX0xFVkVMCSgweDFmIDw8IDApCj4gPiArI2RlZmluZSBMRURDX0lOVF9DVFJMX1JFRwkJ MHgwMDFjCj4gPiArI2RlZmluZSBMRURDX0lOVF9DVFJMX1JFR19HTE9CQUxfSU5UX0VOCQlCSVQo NSkKPiA+ICsjZGVmaW5lIExFRENfSU5UX0NUUkxfUkVHX0ZJRk9fQ1BVUkVRX0lOVF9FTglCSVQo MSkKPiA+ICsjZGVmaW5lIExFRENfSU5UX0NUUkxfUkVHX1RSQU5TX0ZJTklTSF9JTlRfRU4JQklU KDApCj4gPiArI2RlZmluZSBMRURDX0lOVF9TVFNfUkVHCQkweDAwMjAKPiA+ICsjZGVmaW5lIExF RENfSU5UX1NUU19SRUdfRklGT19DUFVSRVFfSU5UCUJJVCgxKQo+ID4gKyNkZWZpbmUgTEVEQ19J TlRfU1RTX1JFR19UUkFOU19GSU5JU0hfSU5UCUJJVCgwKQo+ID4gKwo+ID4gKyNkZWZpbmUgTEVE Q19GSUZPX0RFUFRICQkJMzIKPiA+ICsjZGVmaW5lIExFRENfTUFYX0xFRFMJCQkxMDI0Cj4gPiAr Cj4gPiArI2RlZmluZSBMRURTX1RPX0JZVEVTKG4pCQkoKG4pICogc2l6ZW9mKHUzMikpCj4gPiAr Cj4gPiArc3RydWN0IHN1bjUwaV9hMTAwX2xlZGNfbGVkIHsKPiA+ICsJc3RydWN0IGxlZF9jbGFz c2Rldl9tYyBtY19jZGV2Owo+ID4gKwlzdHJ1Y3QgbWNfc3VibGVkIHN1YmxlZF9pbmZvWzNdOwo+ ID4gK307Cj4gPiArCj4gPiArI2RlZmluZSB0b19sZWRjX2xlZChtYykgY29udGFpbmVyX29mKG1j LCBzdHJ1Y3Qgc3VuNTBpX2ExMDBfbGVkY19sZWQsIG1jX2NkZXYpCj4gPiArCj4gPiArc3RydWN0 IHN1bjUwaV9hMTAwX2xlZGNfdGltaW5nIHsKPiA+ICsJdTMyIHQwaF9uczsKPiA+ICsJdTMyIHQw bF9uczsKPiA+ICsJdTMyIHQxaF9uczsKPiA+ICsJdTMyIHQxbF9uczsKPiA+ICsJdTMyIHRyZXNl dF9uczsKPiA+ICt9Owo+ID4gKwo+ID4gK3N0cnVjdCBzdW41MGlfYTEwMF9sZWRjIHsKPiA+ICsJ c3RydWN0IGRldmljZSAqZGV2Owo+ID4gKwl2b2lkIF9faW9tZW0gKmJhc2U7Cj4gPiArCXN0cnVj dCBjbGsgKmJ1c19jbGs7Cj4gPiArCXN0cnVjdCBjbGsgKm1vZF9jbGs7Cj4gPiArCXN0cnVjdCBy ZXNldF9jb250cm9sICpyZXNldDsKPiA+ICsKPiA+ICsJdTMyICpidWZmZXI7Cj4gPiArCXN0cnVj dCBkbWFfY2hhbiAqZG1hX2NoYW47Cj4gPiArCWRtYV9hZGRyX3QgZG1hX2hhbmRsZTsKPiA+ICsJ aW50IHBpb19sZW5ndGg7Cj4gPiArCWludCBwaW9fb2Zmc2V0Owo+ID4gKwo+ID4gKwlzcGlubG9j a190IGxvY2s7Cj4gPiArCWludCBuZXh0X2xlbmd0aDsKPiA+ICsJYm9vbCB4ZmVyX2FjdGl2ZTsK PiA+ICsKPiA+ICsJdTMyIGZvcm1hdDsKPiA+ICsJc3RydWN0IHN1bjUwaV9hMTAwX2xlZGNfdGlt aW5nIHRpbWluZzsKPiA+ICsKPiA+ICsJaW50IG51bV9sZWRzOwo+ID4gKwlzdHJ1Y3Qgc3VuNTBp X2ExMDBfbGVkY19sZWQgbGVkc1tdOwo+ID4gK307Cj4gPiArCj4gPiArc3RhdGljIGludCBzdW41 MGlfYTEwMF9sZWRjX2RtYV94ZmVyKHN0cnVjdCBzdW41MGlfYTEwMF9sZWRjICpwcml2LCBpbnQg bGVuZ3RoKQo+ID4gK3sKPiA+ICsJc3RydWN0IGRtYV9hc3luY190eF9kZXNjcmlwdG9yICpkZXNj Owo+ID4gKwlkbWFfY29va2llX3QgY29va2llOwo+ID4gKwo+ID4gKwlkZXNjID0gZG1hZW5naW5l X3ByZXBfc2xhdmVfc2luZ2xlKHByaXYtPmRtYV9jaGFuLCBwcml2LT5kbWFfaGFuZGxlLAo+ID4g KwkJCQkJICAgTEVEU19UT19CWVRFUyhsZW5ndGgpLAo+ID4gKwkJCQkJICAgRE1BX01FTV9UT19E RVYsIDApOwo+ID4gKwlpZiAoIWRlc2MpCj4gPiArCQlyZXR1cm4gLUVOT01FTTsKPiA+ICsKPiA+ ICsJY29va2llID0gZG1hZW5naW5lX3N1Ym1pdChkZXNjKTsKPiA+ICsJaWYgKGRtYV9zdWJtaXRf ZXJyb3IoY29va2llKSkKPiA+ICsJCXJldHVybiAtRUlPOwo+ID4gKwo+ID4gKwlkbWFfYXN5bmNf aXNzdWVfcGVuZGluZyhwcml2LT5kbWFfY2hhbik7Cj4gPiArCj4gPiArCXJldHVybiAwOwo+ID4g K30KPiA+ICsKPiA+ICtzdGF0aWMgdm9pZCBzdW41MGlfYTEwMF9sZWRjX3Bpb194ZmVyKHN0cnVj dCBzdW41MGlfYTEwMF9sZWRjICpwcml2LCBpbnQgbGVuZ3RoKQo+ID4gK3sKPiA+ICsJdTMyIGJ1 cnN0LCBvZmZzZXQsIHZhbDsKPiA+ICsKPiA+ICsJaWYgKGxlbmd0aCkgewo+ID4gKwkJLyogTmV3 IHRyYW5zZmVyIChGSUZPIGlzIGVtcHR5KS4gKi8KPiA+ICsJCW9mZnNldCA9IDA7Cj4gPiArCQli dXJzdCAgPSBtaW4obGVuZ3RoLCBMRURDX0ZJRk9fREVQVEgpOwo+ID4gKwl9IGVsc2Ugewo+ID4g KwkJLyogRXhpc3RpbmcgdHJhbnNmZXIgKEZJRk8gaXMgaGFsZi1mdWxsKS4gKi8KPiA+ICsJCWxl bmd0aCA9IHByaXYtPnBpb19sZW5ndGg7Cj4gPiArCQlvZmZzZXQgPSBwcml2LT5waW9fb2Zmc2V0 Owo+ID4gKwkJYnVyc3QgID0gbWluKGxlbmd0aCwgTEVEQ19GSUZPX0RFUFRIIC8gMik7Cj4gPiAr CX0KPiA+ICsKPiA+ICsJaW93cml0ZTMyX3JlcChwcml2LT5iYXNlICsgTEVEQ19EQVRBX1JFRywg cHJpdi0+YnVmZmVyICsgb2Zmc2V0LCBidXJzdCk7Cj4gPiArCj4gPiArCWlmIChidXJzdCA8IGxl bmd0aCkgewo+ID4gKwkJcHJpdi0+cGlvX2xlbmd0aCA9IGxlbmd0aCAtIGJ1cnN0Owo+ID4gKwkJ cHJpdi0+cGlvX29mZnNldCA9IG9mZnNldCArIGJ1cnN0Owo+ID4gKwo+ID4gKwkJaWYgKCFvZmZz ZXQpIHsKPiA+ICsJCQl2YWwgPSByZWFkbChwcml2LT5iYXNlICsgTEVEQ19JTlRfQ1RSTF9SRUcp Owo+ID4gKwkJCXZhbCB8PSBMRURDX0lOVF9DVFJMX1JFR19GSUZPX0NQVVJFUV9JTlRfRU47Cj4g PiArCQkJd3JpdGVsKHZhbCwgcHJpdi0+YmFzZSArIExFRENfSU5UX0NUUkxfUkVHKTsKPiA+ICsJ CX0KPiA+ICsJfSBlbHNlIHsKPiA+ICsJCS8qIERpc2FibGUgdGhlIHJlcXVlc3QgSVJRIG9uY2Ug YWxsIGRhdGEgaXMgd3JpdHRlbi4gKi8KPiA+ICsJCXZhbCA9IHJlYWRsKHByaXYtPmJhc2UgKyBM RURDX0lOVF9DVFJMX1JFRyk7Cj4gPiArCQl2YWwgJj0gfkxFRENfSU5UX0NUUkxfUkVHX0ZJRk9f Q1BVUkVRX0lOVF9FTjsKPiA+ICsJCXdyaXRlbCh2YWwsIHByaXYtPmJhc2UgKyBMRURDX0lOVF9D VFJMX1JFRyk7Cj4gPiArCX0KPiA+ICt9Cj4gPiArCj4gPiArc3RhdGljIHZvaWQgc3VuNTBpX2Ex MDBfbGVkY19zdGFydF94ZmVyKHN0cnVjdCBzdW41MGlfYTEwMF9sZWRjICpwcml2LAo+ID4gKwkJ CQkJaW50IGxlbmd0aCkKPiA+ICt7Cj4gPiArCXUzMiB2YWw7Cj4gPiArCj4gPiArCWRldl9kYmco cHJpdi0+ZGV2LCAiVXBkYXRpbmcgJWQgTEVEc1xuIiwgbGVuZ3RoKTsKPiA+ICsKPiA+ICsJdmFs ID0gcmVhZGwocHJpdi0+YmFzZSArIExFRENfQ1RSTF9SRUcpOwo+ID4gKwl2YWwgJj0gfkxFRENf Q1RSTF9SRUdfREFUQV9MRU5HVEg7Cj4gPiArCXZhbCB8PSBsZW5ndGggPDwgMTYgfCBMRURDX0NU UkxfUkVHX0xFRENfRU47Cj4gPiArCXdyaXRlbCh2YWwsIHByaXYtPmJhc2UgKyBMRURDX0NUUkxf UkVHKTsKPiA+ICsKPiA+ICsJaWYgKGxlbmd0aCA+IExFRENfRklGT19ERVBUSCkgewo+ID4gKwkJ aW50IHJldCA9IHN1bjUwaV9hMTAwX2xlZGNfZG1hX3hmZXIocHJpdiwgbGVuZ3RoKTsKPiA+ICsK PiA+ICsJCWlmICghcmV0KQo+ID4gKwkJCXJldHVybjsKPiA+ICsKPiA+ICsJCWRldl93YXJuKHBy aXYtPmRldiwgIkZhaWxlZCB0byBzZXQgdXAgRE1BOiAlZFxuIiwgcmV0KTsKPiA+ICsJfQo+ID4g Kwo+ID4gKwlzdW41MGlfYTEwMF9sZWRjX3Bpb194ZmVyKHByaXYsIGxlbmd0aCk7Cj4gPiArfQo+ ID4gKwo+ID4gK3N0YXRpYyBpcnFyZXR1cm5fdCBzdW41MGlfYTEwMF9sZWRjX2lycShpbnQgaXJx LCB2b2lkICpkZXZfaWQpCj4gPiArewo+ID4gKwlzdHJ1Y3Qgc3VuNTBpX2ExMDBfbGVkYyAqcHJp diA9IGRldl9pZDsKPiA+ICsJdTMyIHZhbDsKPiA+ICsKPiA+ICsJdmFsID0gcmVhZGwocHJpdi0+ YmFzZSArIExFRENfSU5UX1NUU19SRUcpOwo+ID4gKwo+ID4gKwlpZiAodmFsICYgTEVEQ19JTlRf U1RTX1JFR19UUkFOU19GSU5JU0hfSU5UKSB7Cj4gPiArCQlpbnQgbmV4dF9sZW5ndGg7Cj4gPiAr Cj4gPiArCQkvKiBTdGFydCB0aGUgbmV4dCB0cmFuc2ZlciBpZiBuZWVkZWQuICovCj4gPiArCQlz cGluX2xvY2soJnByaXYtPmxvY2spOwo+ID4gKwkJbmV4dF9sZW5ndGggPSBwcml2LT5uZXh0X2xl bmd0aDsKPiA+ICsJCWlmIChuZXh0X2xlbmd0aCkKPiA+ICsJCQlwcml2LT5uZXh0X2xlbmd0aCA9 IDA7Cj4gPiArCQllbHNlCj4gPiArCQkJcHJpdi0+eGZlcl9hY3RpdmUgPSBmYWxzZTsKPiA+ICsJ CXNwaW5fdW5sb2NrKCZwcml2LT5sb2NrKTsKPiA+ICsKPiA+ICsJCWlmIChuZXh0X2xlbmd0aCkK PiA+ICsJCQlzdW41MGlfYTEwMF9sZWRjX3N0YXJ0X3hmZXIocHJpdiwgbmV4dF9sZW5ndGgpOwo+ ID4gKwl9IGVsc2UgaWYgKHZhbCAmIExFRENfSU5UX1NUU19SRUdfRklGT19DUFVSRVFfSU5UKSB7 Cj4gPiArCQkvKiBDb250aW51ZSB0aGUgY3VycmVudCB0cmFuc2Zlci4gKi8KPiA+ICsJCXN1bjUw aV9hMTAwX2xlZGNfcGlvX3hmZXIocHJpdiwgMCk7Cj4gPiArCX0KPiA+ICsKPiA+ICsJd3JpdGVs KHZhbCwgcHJpdi0+YmFzZSArIExFRENfSU5UX1NUU19SRUcpOwo+ID4gKwo+ID4gKwlyZXR1cm4g SVJRX0hBTkRMRUQ7Cj4gPiArfQo+ID4gKwo+ID4gK3N0YXRpYyB2b2lkIHN1bjUwaV9hMTAwX2xl ZGNfYnJpZ2h0bmVzc19zZXQoc3RydWN0IGxlZF9jbGFzc2RldiAqY2RldiwKPiA+ICsJCQkJCSAg ICBlbnVtIGxlZF9icmlnaHRuZXNzIGJyaWdodG5lc3MpCj4gPiArewo+ID4gKwlzdHJ1Y3Qgc3Vu NTBpX2ExMDBfbGVkYyAqcHJpdiA9IGRldl9nZXRfZHJ2ZGF0YShjZGV2LT5kZXYtPnBhcmVudCk7 Cj4gPiArCXN0cnVjdCBsZWRfY2xhc3NkZXZfbWMgKm1jX2NkZXYgPSBsY2Rldl90b19tY2NkZXYo Y2Rldik7Cj4gPiArCXN0cnVjdCBzdW41MGlfYTEwMF9sZWRjX2xlZCAqbGVkID0gdG9fbGVkY19s ZWQobWNfY2Rldik7Cj4gPiArCWludCBhZGRyID0gbGVkIC0gcHJpdi0+bGVkczsKPiA+ICsJdW5z aWduZWQgbG9uZyBmbGFnczsKPiA+ICsJYm9vbCB4ZmVyX2FjdGl2ZTsKPiA+ICsJaW50IG5leHRf bGVuZ3RoOwo+ID4gKwo+ID4gKwlsZWRfbWNfY2FsY19jb2xvcl9jb21wb25lbnRzKG1jX2NkZXYs IGJyaWdodG5lc3MpOwo+ID4gKwo+ID4gKwlwcml2LT5idWZmZXJbYWRkcl0gPSBsZWQtPnN1Ymxl ZF9pbmZvWzBdLmJyaWdodG5lc3MgPDwgMTYgfAo+ID4gKwkJCSAgICAgbGVkLT5zdWJsZWRfaW5m b1sxXS5icmlnaHRuZXNzIDw8ICA4IHwKPiA+ICsJCQkgICAgIGxlZC0+c3VibGVkX2luZm9bMl0u YnJpZ2h0bmVzczsKPiA+ICsKPiA+ICsJZGV2X2RiZyhwcml2LT5kZXYsICJMRUQgJWQgLT4gIyUw NnhcbiIsIGFkZHIsIHByaXYtPmJ1ZmZlclthZGRyXSk7Cj4gPiArCj4gPiArCXNwaW5fbG9ja19p cnFzYXZlKCZwcml2LT5sb2NrLCBmbGFncyk7Cj4gPiArCW5leHRfbGVuZ3RoID0gbWF4KHByaXYt Pm5leHRfbGVuZ3RoLCBhZGRyICsgMSk7Cj4gPiArCXhmZXJfYWN0aXZlID0gcHJpdi0+eGZlcl9h Y3RpdmU7Cj4gPiArCWlmICh4ZmVyX2FjdGl2ZSkKPiA+ICsJCXByaXYtPm5leHRfbGVuZ3RoID0g bmV4dF9sZW5ndGg7Cj4gPiArCWVsc2UKPiA+ICsJCXByaXYtPnhmZXJfYWN0aXZlID0gdHJ1ZTsK PiA+ICsJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJpdi0+bG9jaywgZmxhZ3MpOwo+ID4gKwo+ ID4gKwlpZiAoIXhmZXJfYWN0aXZlKQo+ID4gKwkJc3VuNTBpX2ExMDBfbGVkY19zdGFydF94ZmVy KHByaXYsIG5leHRfbGVuZ3RoKTsKPiA+ICt9Cj4gPiArCj4gPiArc3RhdGljIGNvbnN0IGNoYXIg KmNvbnN0IHN1bjUwaV9hMTAwX2xlZGNfZm9ybWF0c1tdID0gewo+ID4gKwkicmdiIiwKPiA+ICsJ InJiZyIsCj4gPiArCSJncmIiLAo+ID4gKwkiZ2JyIiwKPiA+ICsJImJyZyIsCj4gPiArCSJiZ3Ii LAo+ID4gK307Cj4gPiArCj4gPiArc3RhdGljIGludCBzdW41MGlfYTEwMF9sZWRjX3BhcnNlX2Zv cm1hdChjb25zdCBzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wLAo+ID4gKwkJCQkJIHN0cnVjdCBzdW41 MGlfYTEwMF9sZWRjICpwcml2KQo+ID4gK3sKPiA+ICsJY29uc3QgY2hhciAqZm9ybWF0ID0gImdy YiI7Cj4gPiArCXUzMiBpOwo+ID4gKwo+ID4gKwlvZl9wcm9wZXJ0eV9yZWFkX3N0cmluZyhucCwg ImFsbHdpbm5lcixwaXhlbC1mb3JtYXQiLCAmZm9ybWF0KTsKPiA+ICsKPiA+ICsJZm9yIChpID0g MDsgaSA8IEFSUkFZX1NJWkUoc3VuNTBpX2ExMDBfbGVkY19mb3JtYXRzKTsgKytpKSB7Cj4gPiAr CQlpZiAoIXN0cmNtcChmb3JtYXQsIHN1bjUwaV9hMTAwX2xlZGNfZm9ybWF0c1tpXSkpIHsKPiA+ ICsJCQlwcml2LT5mb3JtYXQgPSBpOwo+ID4gKwkJCXJldHVybiAwOwo+ID4gKwkJfQo+ID4gKwl9 Cj4gPiArCj4gPiArCWRldl9lcnIocHJpdi0+ZGV2LCAiQmFkIHBpeGVsIGZvcm1hdCAnJXMnXG4i LCBmb3JtYXQpOwo+ID4gKwo+ID4gKwlyZXR1cm4gLUVJTlZBTDsKPiA+ICt9Cj4gPiArCj4gPiAr c3RhdGljIHZvaWQgc3VuNTBpX2ExMDBfbGVkY19zZXRfZm9ybWF0KHN0cnVjdCBzdW41MGlfYTEw MF9sZWRjICpwcml2KQo+ID4gK3sKPiA+ICsJdTMyIHZhbDsKPiA+ICsKPiA+ICsJdmFsID0gcmVh ZGwocHJpdi0+YmFzZSArIExFRENfQ1RSTF9SRUcpOwo+ID4gKwl2YWwgJj0gfkxFRENfQ1RSTF9S RUdfUkdCX01PREU7Cj4gPiArCXZhbCB8PSBwcml2LT5mb3JtYXQgPDwgNjsKPiA+ICsJd3JpdGVs KHZhbCwgcHJpdi0+YmFzZSArIExFRENfQ1RSTF9SRUcpOwo+ID4gK30KPiA+ICsKPiA+ICtzdGF0 aWMgY29uc3Qgc3RydWN0IHN1bjUwaV9hMTAwX2xlZGNfdGltaW5nIHN1bjUwaV9hMTAwX2xlZGNf ZGVmYXVsdF90aW1pbmcgPSB7Cj4gPiArCS50MGhfbnMgPSAzMzYsCj4gPiArCS50MGxfbnMgPSA4 NDAsCj4gPiArCS50MWhfbnMgPSA4ODIsCj4gPiArCS50MWxfbnMgPSAyOTQsCj4gPiArCS50cmVz ZXRfbnMgPSAzMDAwMDAsCj4gPiArfTsKPiA+ICsKPiA+ICtzdGF0aWMgaW50IHN1bjUwaV9hMTAw X2xlZGNfcGFyc2VfdGltaW5nKGNvbnN0IHN0cnVjdCBkZXZpY2Vfbm9kZSAqbnAsCj4gPiArCQkJ CQkgc3RydWN0IHN1bjUwaV9hMTAwX2xlZGMgKnByaXYpCj4gPiArewo+ID4gKwlzdHJ1Y3Qgc3Vu NTBpX2ExMDBfbGVkY190aW1pbmcgKnRpbWluZyA9ICZwcml2LT50aW1pbmc7Cj4gPiArCj4gPiAr CSp0aW1pbmcgPSBzdW41MGlfYTEwMF9sZWRjX2RlZmF1bHRfdGltaW5nOwo+ID4gKwo+ID4gKwlv Zl9wcm9wZXJ0eV9yZWFkX3UzMihucCwgImFsbHdpbm5lcix0MGgtbnMiLCAmdGltaW5nLT50MGhf bnMpOwo+ID4gKwlvZl9wcm9wZXJ0eV9yZWFkX3UzMihucCwgImFsbHdpbm5lcix0MGwtbnMiLCAm dGltaW5nLT50MGxfbnMpOwo+ID4gKwlvZl9wcm9wZXJ0eV9yZWFkX3UzMihucCwgImFsbHdpbm5l cix0MWgtbnMiLCAmdGltaW5nLT50MWhfbnMpOwo+ID4gKwlvZl9wcm9wZXJ0eV9yZWFkX3UzMihu cCwgImFsbHdpbm5lcix0MWwtbnMiLCAmdGltaW5nLT50MWxfbnMpOwo+ID4gKwlvZl9wcm9wZXJ0 eV9yZWFkX3UzMihucCwgImFsbHdpbm5lcix0cmVzZXQtbnMiLCAmdGltaW5nLT50cmVzZXRfbnMp Owo+ID4gKwo+ID4gKwlyZXR1cm4gMDsKPiA+ICt9Cj4gPiArCj4gPiArc3RhdGljIHZvaWQgc3Vu NTBpX2ExMDBfbGVkY19zZXRfdGltaW5nKHN0cnVjdCBzdW41MGlfYTEwMF9sZWRjICpwcml2KQo+ ID4gK3sKPiA+ICsJY29uc3Qgc3RydWN0IHN1bjUwaV9hMTAwX2xlZGNfdGltaW5nICp0aW1pbmcg PSAmcHJpdi0+dGltaW5nOwo+ID4gKwl1bnNpZ25lZCBsb25nIG1vZF9mcmVxID0gY2xrX2dldF9y YXRlKHByaXYtPm1vZF9jbGspOwo+ID4gKwl1MzIgY3ljbGVfbnMgPSBOU0VDX1BFUl9TRUMgLyBt b2RfZnJlcTsKPiA+ICsJdTMyIHZhbDsKPiA+ICsKPiA+ICsJdmFsID0gKHRpbWluZy0+dDFoX25z IC8gY3ljbGVfbnMpIDw8IDIxIHwKPiA+ICsJICAgICAgKHRpbWluZy0+dDFsX25zIC8gY3ljbGVf bnMpIDw8IDE2IHwKPiA+ICsJICAgICAgKHRpbWluZy0+dDBoX25zIC8gY3ljbGVfbnMpIDw8ICA2 IHwKPiA+ICsJICAgICAgKHRpbWluZy0+dDBsX25zIC8gY3ljbGVfbnMpOwo+ID4gKwl3cml0ZWwo dmFsLCBwcml2LT5iYXNlICsgTEVEQ19UMDFfVElNSU5HX0NUUkxfUkVHKTsKPiA+ICsKPiA+ICsJ dmFsID0gKHRpbWluZy0+dHJlc2V0X25zIC8gY3ljbGVfbnMpIDw8IDE2IHwKPiA+ICsJICAgICAg KHByaXYtPm51bV9sZWRzIC0gMSk7Cj4gPiArCXdyaXRlbCh2YWwsIHByaXYtPmJhc2UgKyBMRURD X1JFU0VUX1RJTUlOR19DVFJMX1JFRyk7Cj4gPiArfQo+ID4gKwo+ID4gK3N0YXRpYyBpbnQgc3Vu NTBpX2ExMDBfbGVkY19yZXN1bWUoc3RydWN0IGRldmljZSAqZGV2KQo+ID4gK3sKPiA+ICsJc3Ry dWN0IHN1bjUwaV9hMTAwX2xlZGMgKnByaXYgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKPiA+ICsJ dTMyIHZhbDsKPiA+ICsJaW50IHJldDsKPiA+ICsKPiA+ICsJcmV0ID0gcmVzZXRfY29udHJvbF9k ZWFzc2VydChwcml2LT5yZXNldCk7Cj4gPiArCWlmIChyZXQpCj4gPiArCQlyZXR1cm4gcmV0Owo+ ID4gKwo+ID4gKwlyZXQgPSBjbGtfcHJlcGFyZV9lbmFibGUocHJpdi0+YnVzX2Nsayk7Cj4gPiAr CWlmIChyZXQpCj4gPiArCQlnb3RvIGVycl9hc3NlcnRfcmVzZXQ7Cj4gPiArCj4gPiArCXJldCA9 IGNsa19wcmVwYXJlX2VuYWJsZShwcml2LT5tb2RfY2xrKTsKPiA+ICsJaWYgKHJldCkKPiA+ICsJ CWdvdG8gZXJyX2Rpc2FibGVfYnVzX2NsazsKPiA+ICsKPiA+ICsJc3VuNTBpX2ExMDBfbGVkY19z ZXRfZm9ybWF0KHByaXYpOwo+ID4gKwlzdW41MGlfYTEwMF9sZWRjX3NldF90aW1pbmcocHJpdik7 Cj4gPiArCj4gPiArCS8qIFRoZSB0cmlnZ2VyIGxldmVsIG11c3QgYmUgYXQgbGVhc3QgdGhlIGJ1 cnN0IGxlbmd0aC4gKi8KPiA+ICsJdmFsID0gcmVhZGwocHJpdi0+YmFzZSArIExFRENfRE1BX0NU UkxfUkVHKTsKPiA+ICsJdmFsICY9IH5MRURDX0RNQV9DVFJMX1JFR19GSUZPX1RSSUdfTEVWRUw7 Cj4gPiArCXZhbCB8PSBMRURDX0ZJRk9fREVQVEggLyAyOwo+ID4gKwl3cml0ZWwodmFsLCBwcml2 LT5iYXNlICsgTEVEQ19ETUFfQ1RSTF9SRUcpOwo+ID4gKwo+ID4gKwl2YWwgPSBMRURDX0lOVF9D VFJMX1JFR19HTE9CQUxfSU5UX0VOIHwKPiA+ICsJICAgICAgTEVEQ19JTlRfQ1RSTF9SRUdfVFJB TlNfRklOSVNIX0lOVF9FTjsKPiA+ICsJd3JpdGVsKHZhbCwgcHJpdi0+YmFzZSArIExFRENfSU5U X0NUUkxfUkVHKTsKPiA+ICsKPiA+ICsJcmV0dXJuIDA7Cj4gPiArCj4gPiArZXJyX2Rpc2FibGVf YnVzX2NsazoKPiA+ICsJY2xrX2Rpc2FibGVfdW5wcmVwYXJlKHByaXYtPmJ1c19jbGspOwo+ID4g K2Vycl9hc3NlcnRfcmVzZXQ6Cj4gPiArCXJlc2V0X2NvbnRyb2xfYXNzZXJ0KHByaXYtPnJlc2V0 KTsKPiA+ICsKPiA+ICsJcmV0dXJuIHJldDsKPiA+ICt9Cj4gPiArCj4gPiArc3RhdGljIGludCBz dW41MGlfYTEwMF9sZWRjX3N1c3BlbmQoc3RydWN0IGRldmljZSAqZGV2KQo+ID4gK3sKPiA+ICsJ c3RydWN0IHN1bjUwaV9hMTAwX2xlZGMgKnByaXYgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKPiA+ ICsKPiA+ICsJY2xrX2Rpc2FibGVfdW5wcmVwYXJlKHByaXYtPm1vZF9jbGspOwo+ID4gKwljbGtf ZGlzYWJsZV91bnByZXBhcmUocHJpdi0+YnVzX2Nsayk7Cj4gPiArCXJlc2V0X2NvbnRyb2xfYXNz ZXJ0KHByaXYtPnJlc2V0KTsKPiA+ICsKPiA+ICsJcmV0dXJuIDA7Cj4gPiArfQo+ID4gKwo+ID4g K3N0YXRpYyB2b2lkIHN1bjUwaV9hMTAwX2xlZGNfZG1hX2NsZWFudXAodm9pZCAqZGF0YSkKPiA+ ICt7Cj4gPiArCXN0cnVjdCBzdW41MGlfYTEwMF9sZWRjICpwcml2ID0gZGF0YTsKPiA+ICsJc3Ry dWN0IGRldmljZSAqZG1hX2RldiA9IGRtYWVuZ2luZV9nZXRfZG1hX2RldmljZShwcml2LT5kbWFf Y2hhbik7Cj4gPiArCj4gPiArCWlmIChwcml2LT5idWZmZXIpCj4gPiArCQlkbWFfZnJlZV93Yyhk bWFfZGV2LCBMRURTX1RPX0JZVEVTKHByaXYtPm51bV9sZWRzKSwKPiA+ICsJCQkgICAgcHJpdi0+ YnVmZmVyLCBwcml2LT5kbWFfaGFuZGxlKTsKPiA+ICsJZG1hX3JlbGVhc2VfY2hhbm5lbChwcml2 LT5kbWFfY2hhbik7Cj4gPiArfQo+ID4gKwo+ID4gK3N0YXRpYyBpbnQgc3VuNTBpX2ExMDBfbGVk Y19wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQo+ID4gK3sKPiA+ICsJY29uc3Qg c3RydWN0IGRldmljZV9ub2RlICpucCA9IHBkZXYtPmRldi5vZl9ub2RlOwo+ID4gKwlzdHJ1Y3Qg ZG1hX3NsYXZlX2NvbmZpZyBkbWFfY2ZnID0ge307Cj4gPiArCXN0cnVjdCBsZWRfaW5pdF9kYXRh IGluaXRfZGF0YSA9IHt9Owo+ID4gKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSAmcGRldi0+ZGV2Owo+ ID4gKwlzdHJ1Y3QgZGV2aWNlX25vZGUgKmNoaWxkOwo+ID4gKwlzdHJ1Y3Qgc3VuNTBpX2ExMDBf bGVkYyAqcHJpdjsKPiA+ICsJc3RydWN0IHJlc291cmNlICptZW07Cj4gPiArCWludCBjb3VudCwg aXJxLCByZXQ7Cj4gPiArCj4gPiArCWNvdW50ID0gb2ZfZ2V0X2F2YWlsYWJsZV9jaGlsZF9jb3Vu dChucCk7Cj4gPiArCWlmICghY291bnQpCj4gPiArCQlyZXR1cm4gLUVOT0RFVjsKPiA+ICsJaWYg KGNvdW50ID4gTEVEQ19NQVhfTEVEUykgewo+ID4gKwkJZGV2X2VycihkZXYsICJUb28gbWFueSBM RURzISAobWF4IGlzICVkKVxuIiwgTEVEQ19NQVhfTEVEUyk7Cj4gPiArCQlyZXR1cm4gLUVJTlZB TDsKPiA+ICsJfQo+ID4gKwo+ID4gKwlwcml2ID0gZGV2bV9remFsbG9jKGRldiwgc3RydWN0X3Np emUocHJpdiwgbGVkcywgY291bnQpLCBHRlBfS0VSTkVMKTsKPiA+ICsJaWYgKCFwcml2KQo+ID4g KwkJcmV0dXJuIC1FTk9NRU07Cj4gPiArCj4gPiArCXByaXYtPmRldiA9IGRldjsKPiA+ICsJcHJp di0+bnVtX2xlZHMgPSBjb3VudDsKPiA+ICsJc3Bpbl9sb2NrX2luaXQoJnByaXYtPmxvY2spOwo+ ID4gKwlkZXZfc2V0X2RydmRhdGEoZGV2LCBwcml2KTsKPiA+ICsKPiA+ICsJcmV0ID0gc3VuNTBp X2ExMDBfbGVkY19wYXJzZV9mb3JtYXQobnAsIHByaXYpOwo+ID4gKwlpZiAocmV0KQo+ID4gKwkJ cmV0dXJuIHJldDsKPiA+ICsKPiA+ICsJcmV0ID0gc3VuNTBpX2ExMDBfbGVkY19wYXJzZV90aW1p bmcobnAsIHByaXYpOwo+ID4gKwlpZiAocmV0KQo+ID4gKwkJcmV0dXJuIHJldDsKPiA+ICsKPiA+ ICsJcHJpdi0+YmFzZSA9IGRldm1fcGxhdGZvcm1fZ2V0X2FuZF9pb3JlbWFwX3Jlc291cmNlKHBk ZXYsIDAsICZtZW0pOwo+ID4gKwlpZiAoSVNfRVJSKHByaXYtPmJhc2UpKQo+ID4gKwkJcmV0dXJu IFBUUl9FUlIocHJpdi0+YmFzZSk7Cj4gPiArCj4gPiArCXByaXYtPmJ1c19jbGsgPSBkZXZtX2Ns a19nZXQoZGV2LCAiYnVzIik7Cj4gPiArCWlmIChJU19FUlIocHJpdi0+YnVzX2NsaykpCj4gPiAr CQlyZXR1cm4gUFRSX0VSUihwcml2LT5idXNfY2xrKTsKPiA+ICsKPiA+ICsJcHJpdi0+bW9kX2Ns ayA9IGRldm1fY2xrX2dldChkZXYsICJtb2QiKTsKPiA+ICsJaWYgKElTX0VSUihwcml2LT5tb2Rf Y2xrKSkKPiA+ICsJCXJldHVybiBQVFJfRVJSKHByaXYtPm1vZF9jbGspOwo+ID4gKwo+ID4gKwlw cml2LT5yZXNldCA9IGRldm1fcmVzZXRfY29udHJvbF9nZXRfZXhjbHVzaXZlKGRldiwgTlVMTCk7 Cj4gPiArCWlmIChJU19FUlIocHJpdi0+cmVzZXQpKQo+ID4gKwkJcmV0dXJuIFBUUl9FUlIocHJp di0+cmVzZXQpOwo+ID4gKwo+ID4gKwlwcml2LT5kbWFfY2hhbiA9IGRtYV9yZXF1ZXN0X2NoYW4o ZGV2LCAidHgiKTsKPiA+ICsJaWYgKElTX0VSUihwcml2LT5kbWFfY2hhbikpCj4gPiArCQlyZXR1 cm4gUFRSX0VSUihwcml2LT5kbWFfY2hhbik7Cj4gPiArCj4gPiArCXJldCA9IGRldm1fYWRkX2Fj dGlvbl9vcl9yZXNldChkZXYsIHN1bjUwaV9hMTAwX2xlZGNfZG1hX2NsZWFudXAsIHByaXYpOwo+ ID4gKwlpZiAocmV0KQo+ID4gKwkJcmV0dXJuIHJldDsKPiA+ICsKPiA+ICsJZG1hX2NmZy5kc3Rf YWRkcgk9IG1lbS0+c3RhcnQgKyBMRURDX0RBVEFfUkVHOwo+ID4gKwlkbWFfY2ZnLmRzdF9hZGRy X3dpZHRoCT0gRE1BX1NMQVZFX0JVU1dJRFRIXzRfQllURVM7Cj4gPiArCWRtYV9jZmcuZHN0X21h eGJ1cnN0CT0gTEVEQ19GSUZPX0RFUFRIIC8gMjsKPiA+ICsJcmV0ID0gZG1hZW5naW5lX3NsYXZl X2NvbmZpZyhwcml2LT5kbWFfY2hhbiwgJmRtYV9jZmcpOwo+ID4gKwlpZiAocmV0KQo+ID4gKwkJ cmV0dXJuIHJldDsKPiA+ICsKPiA+ICsJcHJpdi0+YnVmZmVyID0gZG1hX2FsbG9jX3djKGRtYWVu Z2luZV9nZXRfZG1hX2RldmljZShwcml2LT5kbWFfY2hhbiksCj4gPiArCQkJCSAgICBMRURTX1RP X0JZVEVTKHByaXYtPm51bV9sZWRzKSwKPiA+ICsJCQkJICAgICZwcml2LT5kbWFfaGFuZGxlLCBH RlBfS0VSTkVMKTsKPiA+ICsJaWYgKCFwcml2LT5idWZmZXIpCj4gPiArCQlyZXR1cm4gLUVOT01F TTsKPiA+ICsKPiA+ICsJaXJxID0gcGxhdGZvcm1fZ2V0X2lycShwZGV2LCAwKTsKPiA+ICsJaWYg KGlycSA8IDApCj4gPiArCQlyZXR1cm4gaXJxOwo+ID4gKwo+ID4gKwlyZXQgPSBkZXZtX3JlcXVl c3RfaXJxKGRldiwgaXJxLCBzdW41MGlfYTEwMF9sZWRjX2lycSwKPiA+ICsJCQkgICAgICAgMCwg ZGV2X25hbWUoZGV2KSwgcHJpdik7Cj4gPiArCWlmIChyZXQpCj4gPiArCQlyZXR1cm4gcmV0Owo+ ID4gKwo+ID4gKwlyZXQgPSBzdW41MGlfYTEwMF9sZWRjX3Jlc3VtZShkZXYpOwo+ID4gKwlpZiAo cmV0KQo+ID4gKwkJcmV0dXJuIHJldDsKPiA+ICsKPiA+ICsJZm9yX2VhY2hfYXZhaWxhYmxlX2No aWxkX29mX25vZGUobnAsIGNoaWxkKSB7Cj4gPiArCQlzdHJ1Y3Qgc3VuNTBpX2ExMDBfbGVkY19s ZWQgKmxlZDsKPiA+ICsJCXN0cnVjdCBsZWRfY2xhc3NkZXYgKmNkZXY7Cj4gPiArCQl1MzIgYWRk ciwgY29sb3I7Cj4gPiArCj4gPiArCQlyZXQgPSBvZl9wcm9wZXJ0eV9yZWFkX3UzMihjaGlsZCwg InJlZyIsICZhZGRyKTsKPiA+ICsJCWlmIChyZXQgfHwgYWRkciA+PSBjb3VudCkgewo+ID4gKwkJ CWRldl9lcnIoZGV2LCAiTEVEICdyZWcnIHZhbHVlcyBtdXN0IGJlIGZyb20gMCB0byAlZFxuIiwK PiA+ICsJCQkJcHJpdi0+bnVtX2xlZHMgLSAxKTsKPiA+ICsJCQlyZXQgPSAtRUlOVkFMOwo+ID4g KwkJCWdvdG8gZXJyX3B1dF9jaGlsZDsKPiA+ICsJCX0KPiA+ICsKPiA+ICsJCXJldCA9IG9mX3By b3BlcnR5X3JlYWRfdTMyKGNoaWxkLCAiY29sb3IiLCAmY29sb3IpOwo+ID4gKwkJaWYgKHJldCB8 fCBjb2xvciAhPSBMRURfQ09MT1JfSURfUkdCKSB7Cj4gPiArCQkJZGV2X2VycihkZXYsICJMRUQg J2NvbG9yJyBtdXN0IGJlIExFRF9DT0xPUl9JRF9SR0JcbiIpOwo+ID4gKwkJCXJldCA9IC1FSU5W QUw7Cj4gPiArCQkJZ290byBlcnJfcHV0X2NoaWxkOwo+ID4gKwkJfQo+ID4gKwo+ID4gKwkJbGVk ID0gJnByaXYtPmxlZHNbYWRkcl07Cj4gPiArCj4gPiArCQlsZWQtPnN1YmxlZF9pbmZvWzBdLmNv bG9yX2luZGV4ID0gTEVEX0NPTE9SX0lEX1JFRDsKPiA+ICsJCWxlZC0+c3VibGVkX2luZm9bMF0u Y2hhbm5lbCA9IDA7Cj4gPiArCQlsZWQtPnN1YmxlZF9pbmZvWzFdLmNvbG9yX2luZGV4ID0gTEVE X0NPTE9SX0lEX0dSRUVOOwo+ID4gKwkJbGVkLT5zdWJsZWRfaW5mb1sxXS5jaGFubmVsID0gMTsK PiA+ICsJCWxlZC0+c3VibGVkX2luZm9bMl0uY29sb3JfaW5kZXggPSBMRURfQ09MT1JfSURfQkxV RTsKPiA+ICsJCWxlZC0+c3VibGVkX2luZm9bMl0uY2hhbm5lbCA9IDI7Cj4gPiArCj4gPiArCQls ZWQtPm1jX2NkZXYubnVtX2NvbG9ycyA9IEFSUkFZX1NJWkUobGVkLT5zdWJsZWRfaW5mbyk7Cj4g PiArCQlsZWQtPm1jX2NkZXYuc3VibGVkX2luZm8gPSBsZWQtPnN1YmxlZF9pbmZvOwo+ID4gKwo+ ID4gKwkJY2RldiA9ICZsZWQtPm1jX2NkZXYubGVkX2NkZXY7Cj4gPiArCQljZGV2LT5tYXhfYnJp Z2h0bmVzcyA9IFU4X01BWDsKPiA+ICsJCWNkZXYtPmJyaWdodG5lc3Nfc2V0ID0gc3VuNTBpX2Ex MDBfbGVkY19icmlnaHRuZXNzX3NldDsKPiA+ICsKPiA+ICsJCWluaXRfZGF0YS5md25vZGUgPSBv Zl9md25vZGVfaGFuZGxlKGNoaWxkKTsKPiA+ICsKPiA+ICsJCXJldCA9IGRldm1fbGVkX2NsYXNz ZGV2X211bHRpY29sb3JfcmVnaXN0ZXJfZXh0KGRldiwKPiA+ICsJCQkJCQkJCSZsZWQtPm1jX2Nk ZXYsCj4gPiArCQkJCQkJCQkmaW5pdF9kYXRhKTsKPiA+ICsJCWlmIChyZXQpIHsKPiA+ICsJCQlk ZXZfZXJyKGRldiwgIkZhaWxlZCB0byByZWdpc3RlciBMRUQgJXU6ICVkXG4iLAo+ID4gKwkJCQlh ZGRyLCByZXQpOwo+ID4gKwkJCWdvdG8gZXJyX3B1dF9jaGlsZDsKPiA+ICsJCX0KPiA+ICsJfQo+ ID4gKwo+ID4gKwlkZXZfaW5mbyhkZXYsICJSZWdpc3RlcmVkICVkIExFRHNcbiIsIHByaXYtPm51 bV9sZWRzKTsKPiA+ICsKPiA+ICsJcmV0dXJuIDA7Cj4gPiArCj4gPiArZXJyX3B1dF9jaGlsZDoK PiA+ICsJb2Zfbm9kZV9wdXQoY2hpbGQpOwo+ID4gKwlzdW41MGlfYTEwMF9sZWRjX3N1c3BlbmQo JnBkZXYtPmRldik7Cj4gPiArCj4gPiArCXJldHVybiByZXQ7Cj4gPiArfQo+ID4gKwo+ID4gK3N0 YXRpYyBpbnQgc3VuNTBpX2ExMDBfbGVkY19yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAq cGRldikKPiA+ICt7Cj4gPiArCXN1bjUwaV9hMTAwX2xlZGNfc3VzcGVuZCgmcGRldi0+ZGV2KTsK PiA+ICsKPiA+ICsJcmV0dXJuIDA7Cj4gPiArfQo+ID4gKwo+ID4gK3N0YXRpYyB2b2lkIHN1bjUw aV9hMTAwX2xlZGNfc2h1dGRvd24oc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKPiA+ICt7 Cj4gPiArCXN1bjUwaV9hMTAwX2xlZGNfc3VzcGVuZCgmcGRldi0+ZGV2KTsKPiA+ICt9Cj4gPiAr Cj4gPiArc3RhdGljIGNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgc3VuNTBpX2ExMDBfbGVkY19v Zl9tYXRjaFtdID0gewo+ID4gKwl7IC5jb21wYXRpYmxlID0gImFsbHdpbm5lcixzdW41MGktYTEw MC1sZWRjIiB9LAo+ID4gKwl7fQo+ID4gK307Cj4gPiArTU9EVUxFX0RFVklDRV9UQUJMRShvZiwg c3VuNTBpX2ExMDBfbGVkY19vZl9tYXRjaCk7Cj4gPiArCj4gPiArc3RhdGljIERFRklORV9TSU1Q TEVfREVWX1BNX09QUyhzdW41MGlfYTEwMF9sZWRjX3BtLAo+ID4gKwkJCQlzdW41MGlfYTEwMF9s ZWRjX3N1c3BlbmQsCj4gPiArCQkJCXN1bjUwaV9hMTAwX2xlZGNfcmVzdW1lKTsKPiA+ICsKPiA+ ICtzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciBzdW41MGlfYTEwMF9sZWRjX2RyaXZlciA9 IHsKPiA+ICsJLnByb2JlCQk9IHN1bjUwaV9hMTAwX2xlZGNfcHJvYmUsCj4gPiArCS5yZW1vdmUJ CT0gc3VuNTBpX2ExMDBfbGVkY19yZW1vdmUsCj4gPiArCS5zaHV0ZG93bgk9IHN1bjUwaV9hMTAw X2xlZGNfc2h1dGRvd24sCj4gPiArCS5kcml2ZXIJCT0gewo+ID4gKwkJLm5hbWUJCT0gInN1bjUw aS1hMTAwLWxlZGMiLAo+ID4gKwkJLm9mX21hdGNoX3RhYmxlCT0gc3VuNTBpX2ExMDBfbGVkY19v Zl9tYXRjaCwKPiA+ICsJCS5wbQkJPSBwbV9wdHIoJnN1bjUwaV9hMTAwX2xlZGNfcG0pLAo+ID4g Kwl9LAo+ID4gK307Cj4gPiArbW9kdWxlX3BsYXRmb3JtX2RyaXZlcihzdW41MGlfYTEwMF9sZWRj X2RyaXZlcik7Cj4gPiArCj4gPiArTU9EVUxFX0FVVEhPUigiU2FtdWVsIEhvbGxhbmQgPHNhbXVl bEBzaG9sbGFuZC5vcmc+Iik7Cj4gPiArTU9EVUxFX0RFU0NSSVBUSU9OKCJBbGx3aW5uZXIgQTEw MCBMRUQgY29udHJvbGxlciBkcml2ZXIiKTsKPiA+ICtNT0RVTEVfTElDRU5TRSgiR1BMIik7Cj4g PiAtLSAKPiA+IDIuMzcuNAo+ID4gCj4gCj4gLS0gCj4gTGVlIEpvbmVzIFvmnY7nkLzmlq9dCgot LSAKTGVlIEpvbmVzIFvmnY7nkLzmlq9dCgpfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fXwpsaW51eC1yaXNjdiBtYWlsaW5nIGxpc3QKbGludXgtcmlzY3ZAbGlz dHMuaW5mcmFkZWFkLm9yZwpodHRwOi8vbGlzdHMuaW5mcmFkZWFkLm9yZy9tYWlsbWFuL2xpc3Rp bmZvL2xpbnV4LXJpc2N2Cg== 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 318C7C64ED6 for ; Wed, 1 Mar 2023 14:29:27 +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:In-Reply-To:MIME-Version:References: Message-ID:Subject:Cc:To:From:Date:Reply-To:Content-ID:Content-Description: Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID: List-Owner; bh=O1v/qltY+J563N/u19ndWZvRde+sHfFRk8RWum7mVvI=; b=vxr/vL2o67u/SN VvnKkMNqm++v0aNfz2NWgUq/GWj/hcCv0PIFF2RUxE1eumGIE1VQmU7ZT+gM2hemPU6wQFcP2ko/h XXDCHNK/YnP/hTm0q/DniObaxgrAv3luRabkDGjtkslTsE/gsAquA5Z3ez8Yl51QStEieM8qiF0sa mTG6/rl9XgNi5pi99tZUsDwjg3dYqsCqlhbMGzkxh4ihOFkTca5Dcx8ee1OE4caTKJp8LRpMiTAni xc2Q/PFsY7bFxjaIsTxeZ3TVBNotltssIJjLl4IeR0MTtN5q0EhwXb5+qaGZnQUS2sBGouTPXZT4w 2l4BRdpeJipLMfnFSwFQ==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.94.2 #2 (Red Hat Linux)) id 1pXNR4-00GRpm-14; Wed, 01 Mar 2023 14:28:02 +0000 Received: from sin.source.kernel.org ([145.40.73.55]) by bombadil.infradead.org with esmtps (Exim 4.94.2 #2 (Red Hat Linux)) id 1pXNQz-00GRoa-6U; Wed, 01 Mar 2023 14:28:00 +0000 Received: from smtp.kernel.org (relay.kernel.org [52.25.139.140]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by sin.source.kernel.org (Postfix) with ESMTPS id 627A3CE1D27; Wed, 1 Mar 2023 14:27:52 +0000 (UTC) Received: by smtp.kernel.org (Postfix) with ESMTPSA id 9CCEBC433EF; Wed, 1 Mar 2023 14:27:46 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1677680870; bh=ttkMVI2PgJT17F1GCf+MRcAKRGAwKJrx7jI40ihN05o=; h=Date:From:To:Cc:Subject:References:In-Reply-To:From; b=d2Eh3J6sfKwwi+WAWoVaAFhsN38gHZH07XDoPgXzPsuGEwqEg14yOzgvna30/tEC4 6/QfYCilKghH7PGoL8ICi716UfLENTfBsfDJ2x9psBEf3q9hVpCuoAfaiD9IWPI44+ vzQGI+ef+EqBhWcWkwnH10yhXzPscC3PZEUO73q2u7J55MH6ZaZmSpd625ZqQ6hKX5 Q/4Wssrw9ER2RbZ9axhRhW2bdea7xHbFHFpxhuKMG/GN6cncW1w16en99vtiShaV7r TGhDA7Qi43oH3toVKY6dMYXeorpfhd2RDZOAnc4m9eOJKDHdi9YPp2ch3/0PBQaRPS P3A38sdKFtwhg== Date: Wed, 1 Mar 2023 14:27:43 +0000 From: Lee Jones To: Samuel Holland Cc: Pavel Machek , linux-leds@vger.kernel.org, Chen-Yu Tsai , Jernej Skrabec , 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: Re: [RESEND PATCH v7 2/5] leds: sun50i-a100: New driver for the A100 LED controller Message-ID: References: <20221231235541.13568-1-samuel@sholland.org> <20221231235541.13568-3-samuel@sholland.org> MIME-Version: 1.0 Content-Disposition: inline In-Reply-To: X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20230301_062757_643694_7B4C4551 X-CRM114-Status: GOOD ( 40.05 ) 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 UGF2ZWwsCgpJIHNlZSB0aGF0IHlvdSBhcmUgYWN0aXZlIG5vdyAtIGNvdWxkIHlvdSBwbGVhc2Ug cHJpb3JpdGlzZSB0aGlzIG9uZS4KCk9uIE1vbiwgMDkgSmFuIDIwMjMsIExlZSBKb25lcyB3cm90 ZToKCj4gT25lIG1vcmUgZm9yIFBhdmVsIHVudGlsIEkgY2FuIGJ1aWxkIG15IExFRHMgc3BlY2lm aWMga25vd2xlZGdlIHN1ZmZpY2llbnRseS4KPiAKPiBPbiBTYXQsIDMxIERlYyAyMDIyLCBTYW11 ZWwgSG9sbGFuZCB3cm90ZToKPiAKPiA+IFNvbWUgQWxsd2lubmVyIHN1bnhpIFNvQ3MsIHN0YXJ0 aW5nIHdpdGggdGhlIEExMDAsIGNvbnRhaW4gYW4gTEVECj4gPiBjb250cm9sbGVyIGRlc2lnbmVk IHRvIGRyaXZlIFJHQiBMRUQgcGl4ZWxzLiBBZGQgYSBkcml2ZXIgZm9yIGl0IHVzaW5nCj4gPiB0 aGUgbXVsdGljb2xvciBMRUQgZnJhbWV3b3JrLCBhbmQgd2l0aCBMRURzIGRlZmluZWQgaW4gdGhl IGRldmljZSB0cmVlLgo+ID4gCj4gPiBBY2tlZC1ieTogSmVybmVqIFNrcmFiZWMgPGplcm5lai5z a3JhYmVjQGdtYWlsLmNvbT4KPiA+IFNpZ25lZC1vZmYtYnk6IFNhbXVlbCBIb2xsYW5kIDxzYW11 ZWxAc2hvbGxhbmQub3JnPgo+ID4gLS0tCj4gPiAKPiA+IENoYW5nZXMgaW4gdjc6Cj4gPiAgLSBV c2UgREVGSU5FX1NJTVBMRV9ERVZfUE1fT1BTCj4gPiAKPiA+IENoYW5nZXMgaW4gdjU6Cj4gPiAg LSBSZW5hbWUgdGhlIGRyaXZlciBSMzI5IC0+IEExMDAsIHNpbmNlIHRoYXQgaXMgdGhlIGFjdHVh bCBvcmlnaW5hbAo+ID4gICAgaW1wbGVtZW50YXRpb24KPiA+IAo+ID4gQ2hhbmdlcyBpbiB2NDoK PiA+ICAtIERlcGVuZCBvbiBMRURTX0NMQVNTX01VTFRJQ09MT1IKPiA+IAo+ID4gQ2hhbmdlcyBp biB2MzoKPiA+ICAtIEFkZGVkIHZlbmRvciBwcmVmaXggdG8gdGltaW5nL2Zvcm1hdCBwcm9wZXJ0 aWVzCj4gPiAgLSBSZW5hbWVkICJmb3JtYXQiIHByb3BlcnR5IHRvICJwaXhlbC1mb3JtYXQiIGZv ciBjbGFyaXR5Cj4gPiAgLSBEcm9wcGVkICJ2bGVkLXN1cHBseSIgYXMgaXQgaXMgdW5yZWxhdGVk IHRvIHRoZSBjb250cm9sbGVyIGhhcmR3YXJlCj4gPiAgLSBDaGFuZ2VkICJ3cml0ZXNsIiB0byAi aW93cml0ZTMyX3JlcCIgc28gdGhlIGRyaXZlciBidWlsZHMgb24gaHBwYQo+ID4gCj4gPiBDaGFu Z2VzIGluIHYyOgo+ID4gIC0gUmVuYW1lZCBmcm9tIHN1bnhpLWxlZGMgdG8gc3VuNTBpLXIzMjkt bGVkYwo+ID4gIC0gQWRkZWQgbWlzc2luZyAic3RhdGljIiB0byBmdW5jdGlvbnMvZ2xvYmFscyBh cyByZXBvcnRlZCBieSAwZGF5IGJvdAo+ID4gCj4gPiAgZHJpdmVycy9sZWRzL0tjb25maWcgICAg ICAgICAgICB8ICAgOSArCj4gPiAgZHJpdmVycy9sZWRzL01ha2VmaWxlICAgICAgICAgICB8ICAg MSArCj4gPiAgZHJpdmVycy9sZWRzL2xlZHMtc3VuNTBpLWExMDAuYyB8IDU1NSArKysrKysrKysr KysrKysrKysrKysrKysrKysrKysrKwo+ID4gIDMgZmlsZXMgY2hhbmdlZCwgNTY1IGluc2VydGlv bnMoKykKPiA+ICBjcmVhdGUgbW9kZSAxMDA2NDQgZHJpdmVycy9sZWRzL2xlZHMtc3VuNTBpLWEx MDAuYwo+ID4gCj4gPiBkaWZmIC0tZ2l0IGEvZHJpdmVycy9sZWRzL0tjb25maWcgYi9kcml2ZXJz L2xlZHMvS2NvbmZpZwo+ID4gaW5kZXggNDk5ZDBmMjE1YThiLi40ZjRjNTE1ZWQ3ZDcgMTAwNjQ0 Cj4gPiAtLS0gYS9kcml2ZXJzL2xlZHMvS2NvbmZpZwo+ID4gKysrIGIvZHJpdmVycy9sZWRzL0tj b25maWcKPiA+IEBAIC0yODEsNiArMjgxLDE1IEBAIGNvbmZpZyBMRURTX0NPQkFMVF9SQVEKPiA+ ICAJaGVscAo+ID4gIAkgIFRoaXMgb3B0aW9uIGVuYWJsZXMgc3VwcG9ydCBmb3IgdGhlIENvYmFs dCBSYXEgc2VyaWVzIExFRHMuCj4gPiAgCj4gPiArY29uZmlnIExFRFNfU1VONTBJX0ExMDAKPiA+ ICsJdHJpc3RhdGUgIkxFRCBzdXBwb3J0IGZvciBBbGx3aW5uZXIgQTEwMCBSR0IgTEVEIGNvbnRy b2xsZXIiCj4gPiArCWRlcGVuZHMgb24gTEVEU19DTEFTU19NVUxUSUNPTE9SICYmIE9GCj4gPiAr CWRlcGVuZHMgb24gQVJDSF9TVU5YSSB8fCBDT01QSUxFX1RFU1QKPiA+ICsJaGVscAo+ID4gKwkg IFRoaXMgb3B0aW9uIGVuYWJsZXMgc3VwcG9ydCBmb3IgdGhlIFJHQiBMRUQgY29udHJvbGxlciBm b3VuZAo+ID4gKwkgIGluIHNvbWUgQWxsd2lubmVyIHN1bnhpIFNvQ3MsIGluY2x1ZGVpbmcgQTEw MCwgUjMyOSwgYW5kIEQxLgo+ID4gKwkgIEl0IHVzZXMgYSBvbmUtd2lyZSBpbnRlcmZhY2UgdG8g Y29udHJvbCB1cCB0byAxMDI0IExFRHMuCj4gPiArCj4gPiAgY29uZmlnIExFRFNfU1VORklSRQo+ ID4gIAl0cmlzdGF0ZSAiTEVEIHN1cHBvcnQgZm9yIFN1bkZpcmUgc2VydmVycy4iCj4gPiAgCWRl cGVuZHMgb24gTEVEU19DTEFTUwo+ID4gZGlmZiAtLWdpdCBhL2RyaXZlcnMvbGVkcy9NYWtlZmls ZSBiL2RyaXZlcnMvbGVkcy9NYWtlZmlsZQo+ID4gaW5kZXggNGZkMmY5MmNkMTk4Li5hNmVlM2Y1 Y2Y3YmUgMTAwNjQ0Cj4gPiAtLS0gYS9kcml2ZXJzL2xlZHMvTWFrZWZpbGUKPiA+ICsrKyBiL2Ry aXZlcnMvbGVkcy9NYWtlZmlsZQo+ID4gQEAgLTc2LDYgKzc2LDcgQEAgb2JqLSQoQ09ORklHX0xF RFNfUFdNKQkJCSs9IGxlZHMtcHdtLm8KPiA+ICBvYmotJChDT05GSUdfTEVEU19SRUdVTEFUT1Ip CQkrPSBsZWRzLXJlZ3VsYXRvci5vCj4gPiAgb2JqLSQoQ09ORklHX0xFRFNfUzNDMjRYWCkJCSs9 IGxlZHMtczNjMjR4eC5vCj4gPiAgb2JqLSQoQ09ORklHX0xFRFNfU0MyN1hYX0JMVEMpCQkrPSBs ZWRzLXNjMjd4eC1ibHRjLm8KPiA+ICtvYmotJChDT05GSUdfTEVEU19TVU41MElfQTEwMCkJCSs9 IGxlZHMtc3VuNTBpLWExMDAubwo+ID4gIG9iai0kKENPTkZJR19MRURTX1NVTkZJUkUpCQkrPSBs ZWRzLXN1bmZpcmUubwo+ID4gIG9iai0kKENPTkZJR19MRURTX1NZU0NPTikJCSs9IGxlZHMtc3lz Y29uLm8KPiA+ICBvYmotJChDT05GSUdfTEVEU19UQ0E2NTA3KQkJKz0gbGVkcy10Y2E2NTA3Lm8K PiA+IGRpZmYgLS1naXQgYS9kcml2ZXJzL2xlZHMvbGVkcy1zdW41MGktYTEwMC5jIGIvZHJpdmVy cy9sZWRzL2xlZHMtc3VuNTBpLWExMDAuYwo+ID4gbmV3IGZpbGUgbW9kZSAxMDA2NDQKPiA+IGlu ZGV4IDAwMDAwMDAwMDAwMC4uMzBmYTliZTJjZjJkCj4gPiAtLS0gL2Rldi9udWxsCj4gPiArKysg Yi9kcml2ZXJzL2xlZHMvbGVkcy1zdW41MGktYTEwMC5jCj4gPiBAQCAtMCwwICsxLDU1NSBAQAo+ ID4gKy8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wCj4gPiArLy8KPiA+ICsvLyBD b3B5cmlnaHQgKGMpIDIwMjEtMjAyMiBTYW11ZWwgSG9sbGFuZCA8c2FtdWVsQHNob2xsYW5kLm9y Zz4KPiA+ICsvLwo+ID4gKy8vIFBhcnRseSBiYXNlZCBvbiBkcml2ZXJzL2xlZHMvbGVkcy10dXJy aXMtb21uaWEuYywgd2hpY2ggaXM6Cj4gPiArLy8gICAgIENvcHlyaWdodCAoYykgMjAyMCBieSBN YXJlayBCZWjDum4gPGthYmVsQGtlcm5lbC5vcmc+Cj4gPiArLy8KPiA+ICsKPiA+ICsjaW5jbHVk ZSA8bGludXgvY2xrLmg+Cj4gPiArI2luY2x1ZGUgPGxpbnV4L2RtYS1tYXBwaW5nLmg+Cj4gPiAr I2luY2x1ZGUgPGxpbnV4L2RtYWVuZ2luZS5oPgo+ID4gKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1 cHQuaD4KPiA+ICsjaW5jbHVkZSA8bGludXgvaW8uaD4KPiA+ICsjaW5jbHVkZSA8bGludXgvbGVk LWNsYXNzLW11bHRpY29sb3IuaD4KPiA+ICsjaW5jbHVkZSA8bGludXgvbGVkcy5oPgo+ID4gKyNp bmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KPiA+ICsjaW5jbHVkZSA8bGludXgvb2YuaD4KPiA+ICsj aW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+Cj4gPiArI2luY2x1ZGUgPGxpbnV4L3Bt Lmg+Cj4gPiArI2luY2x1ZGUgPGxpbnV4L3Jlc2V0Lmg+Cj4gPiArI2luY2x1ZGUgPGxpbnV4L3Nw aW5sb2NrLmg+Cj4gPiArCj4gPiArI2RlZmluZSBMRURDX0NUUkxfUkVHCQkJMHgwMDAwCj4gPiAr I2RlZmluZSBMRURDX0NUUkxfUkVHX0RBVEFfTEVOR1RICQkoMHgxZmZmIDw8IDE2KQo+ID4gKyNk ZWZpbmUgTEVEQ19DVFJMX1JFR19SR0JfTU9ERQkJCSgweDcgPDwgNikKPiA+ICsjZGVmaW5lIExF RENfQ1RSTF9SRUdfTEVEQ19FTgkJCUJJVCgwKQo+ID4gKyNkZWZpbmUgTEVEQ19UMDFfVElNSU5H X0NUUkxfUkVHCTB4MDAwNAo+ID4gKyNkZWZpbmUgTEVEQ19UMDFfVElNSU5HX0NUUkxfUkVHX1Qx SAkJKDB4M2YgPDwgMjEpCj4gPiArI2RlZmluZSBMRURDX1QwMV9USU1JTkdfQ1RSTF9SRUdfVDFM CQkoMHgxZiA8PCAxNikKPiA+ICsjZGVmaW5lIExFRENfVDAxX1RJTUlOR19DVFJMX1JFR19UMEgJ CSgweDFmIDw8IDYpCj4gPiArI2RlZmluZSBMRURDX1QwMV9USU1JTkdfQ1RSTF9SRUdfVDBMCQko MHgzZiA8PCAwKQo+ID4gKyNkZWZpbmUgTEVEQ19SRVNFVF9USU1JTkdfQ1RSTF9SRUcJMHgwMDBj Cj4gPiArI2RlZmluZSBMRURDX1JFU0VUX1RJTUlOR19DVFJMX1JFR19MRURfTlVNCSgweDNmZiA8 PCAwKQo+ID4gKyNkZWZpbmUgTEVEQ19EQVRBX1JFRwkJCTB4MDAxNAo+ID4gKyNkZWZpbmUgTEVE Q19ETUFfQ1RSTF9SRUcJCTB4MDAxOAo+ID4gKyNkZWZpbmUgTEVEQ19ETUFfQ1RSTF9SRUdfRklG T19UUklHX0xFVkVMCSgweDFmIDw8IDApCj4gPiArI2RlZmluZSBMRURDX0lOVF9DVFJMX1JFRwkJ MHgwMDFjCj4gPiArI2RlZmluZSBMRURDX0lOVF9DVFJMX1JFR19HTE9CQUxfSU5UX0VOCQlCSVQo NSkKPiA+ICsjZGVmaW5lIExFRENfSU5UX0NUUkxfUkVHX0ZJRk9fQ1BVUkVRX0lOVF9FTglCSVQo MSkKPiA+ICsjZGVmaW5lIExFRENfSU5UX0NUUkxfUkVHX1RSQU5TX0ZJTklTSF9JTlRfRU4JQklU KDApCj4gPiArI2RlZmluZSBMRURDX0lOVF9TVFNfUkVHCQkweDAwMjAKPiA+ICsjZGVmaW5lIExF RENfSU5UX1NUU19SRUdfRklGT19DUFVSRVFfSU5UCUJJVCgxKQo+ID4gKyNkZWZpbmUgTEVEQ19J TlRfU1RTX1JFR19UUkFOU19GSU5JU0hfSU5UCUJJVCgwKQo+ID4gKwo+ID4gKyNkZWZpbmUgTEVE Q19GSUZPX0RFUFRICQkJMzIKPiA+ICsjZGVmaW5lIExFRENfTUFYX0xFRFMJCQkxMDI0Cj4gPiAr Cj4gPiArI2RlZmluZSBMRURTX1RPX0JZVEVTKG4pCQkoKG4pICogc2l6ZW9mKHUzMikpCj4gPiAr Cj4gPiArc3RydWN0IHN1bjUwaV9hMTAwX2xlZGNfbGVkIHsKPiA+ICsJc3RydWN0IGxlZF9jbGFz c2Rldl9tYyBtY19jZGV2Owo+ID4gKwlzdHJ1Y3QgbWNfc3VibGVkIHN1YmxlZF9pbmZvWzNdOwo+ ID4gK307Cj4gPiArCj4gPiArI2RlZmluZSB0b19sZWRjX2xlZChtYykgY29udGFpbmVyX29mKG1j LCBzdHJ1Y3Qgc3VuNTBpX2ExMDBfbGVkY19sZWQsIG1jX2NkZXYpCj4gPiArCj4gPiArc3RydWN0 IHN1bjUwaV9hMTAwX2xlZGNfdGltaW5nIHsKPiA+ICsJdTMyIHQwaF9uczsKPiA+ICsJdTMyIHQw bF9uczsKPiA+ICsJdTMyIHQxaF9uczsKPiA+ICsJdTMyIHQxbF9uczsKPiA+ICsJdTMyIHRyZXNl dF9uczsKPiA+ICt9Owo+ID4gKwo+ID4gK3N0cnVjdCBzdW41MGlfYTEwMF9sZWRjIHsKPiA+ICsJ c3RydWN0IGRldmljZSAqZGV2Owo+ID4gKwl2b2lkIF9faW9tZW0gKmJhc2U7Cj4gPiArCXN0cnVj dCBjbGsgKmJ1c19jbGs7Cj4gPiArCXN0cnVjdCBjbGsgKm1vZF9jbGs7Cj4gPiArCXN0cnVjdCBy ZXNldF9jb250cm9sICpyZXNldDsKPiA+ICsKPiA+ICsJdTMyICpidWZmZXI7Cj4gPiArCXN0cnVj dCBkbWFfY2hhbiAqZG1hX2NoYW47Cj4gPiArCWRtYV9hZGRyX3QgZG1hX2hhbmRsZTsKPiA+ICsJ aW50IHBpb19sZW5ndGg7Cj4gPiArCWludCBwaW9fb2Zmc2V0Owo+ID4gKwo+ID4gKwlzcGlubG9j a190IGxvY2s7Cj4gPiArCWludCBuZXh0X2xlbmd0aDsKPiA+ICsJYm9vbCB4ZmVyX2FjdGl2ZTsK PiA+ICsKPiA+ICsJdTMyIGZvcm1hdDsKPiA+ICsJc3RydWN0IHN1bjUwaV9hMTAwX2xlZGNfdGlt aW5nIHRpbWluZzsKPiA+ICsKPiA+ICsJaW50IG51bV9sZWRzOwo+ID4gKwlzdHJ1Y3Qgc3VuNTBp X2ExMDBfbGVkY19sZWQgbGVkc1tdOwo+ID4gK307Cj4gPiArCj4gPiArc3RhdGljIGludCBzdW41 MGlfYTEwMF9sZWRjX2RtYV94ZmVyKHN0cnVjdCBzdW41MGlfYTEwMF9sZWRjICpwcml2LCBpbnQg bGVuZ3RoKQo+ID4gK3sKPiA+ICsJc3RydWN0IGRtYV9hc3luY190eF9kZXNjcmlwdG9yICpkZXNj Owo+ID4gKwlkbWFfY29va2llX3QgY29va2llOwo+ID4gKwo+ID4gKwlkZXNjID0gZG1hZW5naW5l X3ByZXBfc2xhdmVfc2luZ2xlKHByaXYtPmRtYV9jaGFuLCBwcml2LT5kbWFfaGFuZGxlLAo+ID4g KwkJCQkJICAgTEVEU19UT19CWVRFUyhsZW5ndGgpLAo+ID4gKwkJCQkJICAgRE1BX01FTV9UT19E RVYsIDApOwo+ID4gKwlpZiAoIWRlc2MpCj4gPiArCQlyZXR1cm4gLUVOT01FTTsKPiA+ICsKPiA+ ICsJY29va2llID0gZG1hZW5naW5lX3N1Ym1pdChkZXNjKTsKPiA+ICsJaWYgKGRtYV9zdWJtaXRf ZXJyb3IoY29va2llKSkKPiA+ICsJCXJldHVybiAtRUlPOwo+ID4gKwo+ID4gKwlkbWFfYXN5bmNf aXNzdWVfcGVuZGluZyhwcml2LT5kbWFfY2hhbik7Cj4gPiArCj4gPiArCXJldHVybiAwOwo+ID4g K30KPiA+ICsKPiA+ICtzdGF0aWMgdm9pZCBzdW41MGlfYTEwMF9sZWRjX3Bpb194ZmVyKHN0cnVj dCBzdW41MGlfYTEwMF9sZWRjICpwcml2LCBpbnQgbGVuZ3RoKQo+ID4gK3sKPiA+ICsJdTMyIGJ1 cnN0LCBvZmZzZXQsIHZhbDsKPiA+ICsKPiA+ICsJaWYgKGxlbmd0aCkgewo+ID4gKwkJLyogTmV3 IHRyYW5zZmVyIChGSUZPIGlzIGVtcHR5KS4gKi8KPiA+ICsJCW9mZnNldCA9IDA7Cj4gPiArCQli dXJzdCAgPSBtaW4obGVuZ3RoLCBMRURDX0ZJRk9fREVQVEgpOwo+ID4gKwl9IGVsc2Ugewo+ID4g KwkJLyogRXhpc3RpbmcgdHJhbnNmZXIgKEZJRk8gaXMgaGFsZi1mdWxsKS4gKi8KPiA+ICsJCWxl bmd0aCA9IHByaXYtPnBpb19sZW5ndGg7Cj4gPiArCQlvZmZzZXQgPSBwcml2LT5waW9fb2Zmc2V0 Owo+ID4gKwkJYnVyc3QgID0gbWluKGxlbmd0aCwgTEVEQ19GSUZPX0RFUFRIIC8gMik7Cj4gPiAr CX0KPiA+ICsKPiA+ICsJaW93cml0ZTMyX3JlcChwcml2LT5iYXNlICsgTEVEQ19EQVRBX1JFRywg cHJpdi0+YnVmZmVyICsgb2Zmc2V0LCBidXJzdCk7Cj4gPiArCj4gPiArCWlmIChidXJzdCA8IGxl bmd0aCkgewo+ID4gKwkJcHJpdi0+cGlvX2xlbmd0aCA9IGxlbmd0aCAtIGJ1cnN0Owo+ID4gKwkJ cHJpdi0+cGlvX29mZnNldCA9IG9mZnNldCArIGJ1cnN0Owo+ID4gKwo+ID4gKwkJaWYgKCFvZmZz ZXQpIHsKPiA+ICsJCQl2YWwgPSByZWFkbChwcml2LT5iYXNlICsgTEVEQ19JTlRfQ1RSTF9SRUcp Owo+ID4gKwkJCXZhbCB8PSBMRURDX0lOVF9DVFJMX1JFR19GSUZPX0NQVVJFUV9JTlRfRU47Cj4g PiArCQkJd3JpdGVsKHZhbCwgcHJpdi0+YmFzZSArIExFRENfSU5UX0NUUkxfUkVHKTsKPiA+ICsJ CX0KPiA+ICsJfSBlbHNlIHsKPiA+ICsJCS8qIERpc2FibGUgdGhlIHJlcXVlc3QgSVJRIG9uY2Ug YWxsIGRhdGEgaXMgd3JpdHRlbi4gKi8KPiA+ICsJCXZhbCA9IHJlYWRsKHByaXYtPmJhc2UgKyBM RURDX0lOVF9DVFJMX1JFRyk7Cj4gPiArCQl2YWwgJj0gfkxFRENfSU5UX0NUUkxfUkVHX0ZJRk9f Q1BVUkVRX0lOVF9FTjsKPiA+ICsJCXdyaXRlbCh2YWwsIHByaXYtPmJhc2UgKyBMRURDX0lOVF9D VFJMX1JFRyk7Cj4gPiArCX0KPiA+ICt9Cj4gPiArCj4gPiArc3RhdGljIHZvaWQgc3VuNTBpX2Ex MDBfbGVkY19zdGFydF94ZmVyKHN0cnVjdCBzdW41MGlfYTEwMF9sZWRjICpwcml2LAo+ID4gKwkJ CQkJaW50IGxlbmd0aCkKPiA+ICt7Cj4gPiArCXUzMiB2YWw7Cj4gPiArCj4gPiArCWRldl9kYmco cHJpdi0+ZGV2LCAiVXBkYXRpbmcgJWQgTEVEc1xuIiwgbGVuZ3RoKTsKPiA+ICsKPiA+ICsJdmFs ID0gcmVhZGwocHJpdi0+YmFzZSArIExFRENfQ1RSTF9SRUcpOwo+ID4gKwl2YWwgJj0gfkxFRENf Q1RSTF9SRUdfREFUQV9MRU5HVEg7Cj4gPiArCXZhbCB8PSBsZW5ndGggPDwgMTYgfCBMRURDX0NU UkxfUkVHX0xFRENfRU47Cj4gPiArCXdyaXRlbCh2YWwsIHByaXYtPmJhc2UgKyBMRURDX0NUUkxf UkVHKTsKPiA+ICsKPiA+ICsJaWYgKGxlbmd0aCA+IExFRENfRklGT19ERVBUSCkgewo+ID4gKwkJ aW50IHJldCA9IHN1bjUwaV9hMTAwX2xlZGNfZG1hX3hmZXIocHJpdiwgbGVuZ3RoKTsKPiA+ICsK PiA+ICsJCWlmICghcmV0KQo+ID4gKwkJCXJldHVybjsKPiA+ICsKPiA+ICsJCWRldl93YXJuKHBy aXYtPmRldiwgIkZhaWxlZCB0byBzZXQgdXAgRE1BOiAlZFxuIiwgcmV0KTsKPiA+ICsJfQo+ID4g Kwo+ID4gKwlzdW41MGlfYTEwMF9sZWRjX3Bpb194ZmVyKHByaXYsIGxlbmd0aCk7Cj4gPiArfQo+ ID4gKwo+ID4gK3N0YXRpYyBpcnFyZXR1cm5fdCBzdW41MGlfYTEwMF9sZWRjX2lycShpbnQgaXJx LCB2b2lkICpkZXZfaWQpCj4gPiArewo+ID4gKwlzdHJ1Y3Qgc3VuNTBpX2ExMDBfbGVkYyAqcHJp diA9IGRldl9pZDsKPiA+ICsJdTMyIHZhbDsKPiA+ICsKPiA+ICsJdmFsID0gcmVhZGwocHJpdi0+ YmFzZSArIExFRENfSU5UX1NUU19SRUcpOwo+ID4gKwo+ID4gKwlpZiAodmFsICYgTEVEQ19JTlRf U1RTX1JFR19UUkFOU19GSU5JU0hfSU5UKSB7Cj4gPiArCQlpbnQgbmV4dF9sZW5ndGg7Cj4gPiAr Cj4gPiArCQkvKiBTdGFydCB0aGUgbmV4dCB0cmFuc2ZlciBpZiBuZWVkZWQuICovCj4gPiArCQlz cGluX2xvY2soJnByaXYtPmxvY2spOwo+ID4gKwkJbmV4dF9sZW5ndGggPSBwcml2LT5uZXh0X2xl bmd0aDsKPiA+ICsJCWlmIChuZXh0X2xlbmd0aCkKPiA+ICsJCQlwcml2LT5uZXh0X2xlbmd0aCA9 IDA7Cj4gPiArCQllbHNlCj4gPiArCQkJcHJpdi0+eGZlcl9hY3RpdmUgPSBmYWxzZTsKPiA+ICsJ CXNwaW5fdW5sb2NrKCZwcml2LT5sb2NrKTsKPiA+ICsKPiA+ICsJCWlmIChuZXh0X2xlbmd0aCkK PiA+ICsJCQlzdW41MGlfYTEwMF9sZWRjX3N0YXJ0X3hmZXIocHJpdiwgbmV4dF9sZW5ndGgpOwo+ ID4gKwl9IGVsc2UgaWYgKHZhbCAmIExFRENfSU5UX1NUU19SRUdfRklGT19DUFVSRVFfSU5UKSB7 Cj4gPiArCQkvKiBDb250aW51ZSB0aGUgY3VycmVudCB0cmFuc2Zlci4gKi8KPiA+ICsJCXN1bjUw aV9hMTAwX2xlZGNfcGlvX3hmZXIocHJpdiwgMCk7Cj4gPiArCX0KPiA+ICsKPiA+ICsJd3JpdGVs KHZhbCwgcHJpdi0+YmFzZSArIExFRENfSU5UX1NUU19SRUcpOwo+ID4gKwo+ID4gKwlyZXR1cm4g SVJRX0hBTkRMRUQ7Cj4gPiArfQo+ID4gKwo+ID4gK3N0YXRpYyB2b2lkIHN1bjUwaV9hMTAwX2xl ZGNfYnJpZ2h0bmVzc19zZXQoc3RydWN0IGxlZF9jbGFzc2RldiAqY2RldiwKPiA+ICsJCQkJCSAg ICBlbnVtIGxlZF9icmlnaHRuZXNzIGJyaWdodG5lc3MpCj4gPiArewo+ID4gKwlzdHJ1Y3Qgc3Vu NTBpX2ExMDBfbGVkYyAqcHJpdiA9IGRldl9nZXRfZHJ2ZGF0YShjZGV2LT5kZXYtPnBhcmVudCk7 Cj4gPiArCXN0cnVjdCBsZWRfY2xhc3NkZXZfbWMgKm1jX2NkZXYgPSBsY2Rldl90b19tY2NkZXYo Y2Rldik7Cj4gPiArCXN0cnVjdCBzdW41MGlfYTEwMF9sZWRjX2xlZCAqbGVkID0gdG9fbGVkY19s ZWQobWNfY2Rldik7Cj4gPiArCWludCBhZGRyID0gbGVkIC0gcHJpdi0+bGVkczsKPiA+ICsJdW5z aWduZWQgbG9uZyBmbGFnczsKPiA+ICsJYm9vbCB4ZmVyX2FjdGl2ZTsKPiA+ICsJaW50IG5leHRf bGVuZ3RoOwo+ID4gKwo+ID4gKwlsZWRfbWNfY2FsY19jb2xvcl9jb21wb25lbnRzKG1jX2NkZXYs IGJyaWdodG5lc3MpOwo+ID4gKwo+ID4gKwlwcml2LT5idWZmZXJbYWRkcl0gPSBsZWQtPnN1Ymxl ZF9pbmZvWzBdLmJyaWdodG5lc3MgPDwgMTYgfAo+ID4gKwkJCSAgICAgbGVkLT5zdWJsZWRfaW5m b1sxXS5icmlnaHRuZXNzIDw8ICA4IHwKPiA+ICsJCQkgICAgIGxlZC0+c3VibGVkX2luZm9bMl0u YnJpZ2h0bmVzczsKPiA+ICsKPiA+ICsJZGV2X2RiZyhwcml2LT5kZXYsICJMRUQgJWQgLT4gIyUw NnhcbiIsIGFkZHIsIHByaXYtPmJ1ZmZlclthZGRyXSk7Cj4gPiArCj4gPiArCXNwaW5fbG9ja19p cnFzYXZlKCZwcml2LT5sb2NrLCBmbGFncyk7Cj4gPiArCW5leHRfbGVuZ3RoID0gbWF4KHByaXYt Pm5leHRfbGVuZ3RoLCBhZGRyICsgMSk7Cj4gPiArCXhmZXJfYWN0aXZlID0gcHJpdi0+eGZlcl9h Y3RpdmU7Cj4gPiArCWlmICh4ZmVyX2FjdGl2ZSkKPiA+ICsJCXByaXYtPm5leHRfbGVuZ3RoID0g bmV4dF9sZW5ndGg7Cj4gPiArCWVsc2UKPiA+ICsJCXByaXYtPnhmZXJfYWN0aXZlID0gdHJ1ZTsK PiA+ICsJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJpdi0+bG9jaywgZmxhZ3MpOwo+ID4gKwo+ ID4gKwlpZiAoIXhmZXJfYWN0aXZlKQo+ID4gKwkJc3VuNTBpX2ExMDBfbGVkY19zdGFydF94ZmVy KHByaXYsIG5leHRfbGVuZ3RoKTsKPiA+ICt9Cj4gPiArCj4gPiArc3RhdGljIGNvbnN0IGNoYXIg KmNvbnN0IHN1bjUwaV9hMTAwX2xlZGNfZm9ybWF0c1tdID0gewo+ID4gKwkicmdiIiwKPiA+ICsJ InJiZyIsCj4gPiArCSJncmIiLAo+ID4gKwkiZ2JyIiwKPiA+ICsJImJyZyIsCj4gPiArCSJiZ3Ii LAo+ID4gK307Cj4gPiArCj4gPiArc3RhdGljIGludCBzdW41MGlfYTEwMF9sZWRjX3BhcnNlX2Zv cm1hdChjb25zdCBzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wLAo+ID4gKwkJCQkJIHN0cnVjdCBzdW41 MGlfYTEwMF9sZWRjICpwcml2KQo+ID4gK3sKPiA+ICsJY29uc3QgY2hhciAqZm9ybWF0ID0gImdy YiI7Cj4gPiArCXUzMiBpOwo+ID4gKwo+ID4gKwlvZl9wcm9wZXJ0eV9yZWFkX3N0cmluZyhucCwg ImFsbHdpbm5lcixwaXhlbC1mb3JtYXQiLCAmZm9ybWF0KTsKPiA+ICsKPiA+ICsJZm9yIChpID0g MDsgaSA8IEFSUkFZX1NJWkUoc3VuNTBpX2ExMDBfbGVkY19mb3JtYXRzKTsgKytpKSB7Cj4gPiAr CQlpZiAoIXN0cmNtcChmb3JtYXQsIHN1bjUwaV9hMTAwX2xlZGNfZm9ybWF0c1tpXSkpIHsKPiA+ ICsJCQlwcml2LT5mb3JtYXQgPSBpOwo+ID4gKwkJCXJldHVybiAwOwo+ID4gKwkJfQo+ID4gKwl9 Cj4gPiArCj4gPiArCWRldl9lcnIocHJpdi0+ZGV2LCAiQmFkIHBpeGVsIGZvcm1hdCAnJXMnXG4i LCBmb3JtYXQpOwo+ID4gKwo+ID4gKwlyZXR1cm4gLUVJTlZBTDsKPiA+ICt9Cj4gPiArCj4gPiAr c3RhdGljIHZvaWQgc3VuNTBpX2ExMDBfbGVkY19zZXRfZm9ybWF0KHN0cnVjdCBzdW41MGlfYTEw MF9sZWRjICpwcml2KQo+ID4gK3sKPiA+ICsJdTMyIHZhbDsKPiA+ICsKPiA+ICsJdmFsID0gcmVh ZGwocHJpdi0+YmFzZSArIExFRENfQ1RSTF9SRUcpOwo+ID4gKwl2YWwgJj0gfkxFRENfQ1RSTF9S RUdfUkdCX01PREU7Cj4gPiArCXZhbCB8PSBwcml2LT5mb3JtYXQgPDwgNjsKPiA+ICsJd3JpdGVs KHZhbCwgcHJpdi0+YmFzZSArIExFRENfQ1RSTF9SRUcpOwo+ID4gK30KPiA+ICsKPiA+ICtzdGF0 aWMgY29uc3Qgc3RydWN0IHN1bjUwaV9hMTAwX2xlZGNfdGltaW5nIHN1bjUwaV9hMTAwX2xlZGNf ZGVmYXVsdF90aW1pbmcgPSB7Cj4gPiArCS50MGhfbnMgPSAzMzYsCj4gPiArCS50MGxfbnMgPSA4 NDAsCj4gPiArCS50MWhfbnMgPSA4ODIsCj4gPiArCS50MWxfbnMgPSAyOTQsCj4gPiArCS50cmVz ZXRfbnMgPSAzMDAwMDAsCj4gPiArfTsKPiA+ICsKPiA+ICtzdGF0aWMgaW50IHN1bjUwaV9hMTAw X2xlZGNfcGFyc2VfdGltaW5nKGNvbnN0IHN0cnVjdCBkZXZpY2Vfbm9kZSAqbnAsCj4gPiArCQkJ CQkgc3RydWN0IHN1bjUwaV9hMTAwX2xlZGMgKnByaXYpCj4gPiArewo+ID4gKwlzdHJ1Y3Qgc3Vu NTBpX2ExMDBfbGVkY190aW1pbmcgKnRpbWluZyA9ICZwcml2LT50aW1pbmc7Cj4gPiArCj4gPiAr CSp0aW1pbmcgPSBzdW41MGlfYTEwMF9sZWRjX2RlZmF1bHRfdGltaW5nOwo+ID4gKwo+ID4gKwlv Zl9wcm9wZXJ0eV9yZWFkX3UzMihucCwgImFsbHdpbm5lcix0MGgtbnMiLCAmdGltaW5nLT50MGhf bnMpOwo+ID4gKwlvZl9wcm9wZXJ0eV9yZWFkX3UzMihucCwgImFsbHdpbm5lcix0MGwtbnMiLCAm dGltaW5nLT50MGxfbnMpOwo+ID4gKwlvZl9wcm9wZXJ0eV9yZWFkX3UzMihucCwgImFsbHdpbm5l cix0MWgtbnMiLCAmdGltaW5nLT50MWhfbnMpOwo+ID4gKwlvZl9wcm9wZXJ0eV9yZWFkX3UzMihu cCwgImFsbHdpbm5lcix0MWwtbnMiLCAmdGltaW5nLT50MWxfbnMpOwo+ID4gKwlvZl9wcm9wZXJ0 eV9yZWFkX3UzMihucCwgImFsbHdpbm5lcix0cmVzZXQtbnMiLCAmdGltaW5nLT50cmVzZXRfbnMp Owo+ID4gKwo+ID4gKwlyZXR1cm4gMDsKPiA+ICt9Cj4gPiArCj4gPiArc3RhdGljIHZvaWQgc3Vu NTBpX2ExMDBfbGVkY19zZXRfdGltaW5nKHN0cnVjdCBzdW41MGlfYTEwMF9sZWRjICpwcml2KQo+ ID4gK3sKPiA+ICsJY29uc3Qgc3RydWN0IHN1bjUwaV9hMTAwX2xlZGNfdGltaW5nICp0aW1pbmcg PSAmcHJpdi0+dGltaW5nOwo+ID4gKwl1bnNpZ25lZCBsb25nIG1vZF9mcmVxID0gY2xrX2dldF9y YXRlKHByaXYtPm1vZF9jbGspOwo+ID4gKwl1MzIgY3ljbGVfbnMgPSBOU0VDX1BFUl9TRUMgLyBt b2RfZnJlcTsKPiA+ICsJdTMyIHZhbDsKPiA+ICsKPiA+ICsJdmFsID0gKHRpbWluZy0+dDFoX25z IC8gY3ljbGVfbnMpIDw8IDIxIHwKPiA+ICsJICAgICAgKHRpbWluZy0+dDFsX25zIC8gY3ljbGVf bnMpIDw8IDE2IHwKPiA+ICsJICAgICAgKHRpbWluZy0+dDBoX25zIC8gY3ljbGVfbnMpIDw8ICA2 IHwKPiA+ICsJICAgICAgKHRpbWluZy0+dDBsX25zIC8gY3ljbGVfbnMpOwo+ID4gKwl3cml0ZWwo dmFsLCBwcml2LT5iYXNlICsgTEVEQ19UMDFfVElNSU5HX0NUUkxfUkVHKTsKPiA+ICsKPiA+ICsJ dmFsID0gKHRpbWluZy0+dHJlc2V0X25zIC8gY3ljbGVfbnMpIDw8IDE2IHwKPiA+ICsJICAgICAg KHByaXYtPm51bV9sZWRzIC0gMSk7Cj4gPiArCXdyaXRlbCh2YWwsIHByaXYtPmJhc2UgKyBMRURD X1JFU0VUX1RJTUlOR19DVFJMX1JFRyk7Cj4gPiArfQo+ID4gKwo+ID4gK3N0YXRpYyBpbnQgc3Vu NTBpX2ExMDBfbGVkY19yZXN1bWUoc3RydWN0IGRldmljZSAqZGV2KQo+ID4gK3sKPiA+ICsJc3Ry dWN0IHN1bjUwaV9hMTAwX2xlZGMgKnByaXYgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKPiA+ICsJ dTMyIHZhbDsKPiA+ICsJaW50IHJldDsKPiA+ICsKPiA+ICsJcmV0ID0gcmVzZXRfY29udHJvbF9k ZWFzc2VydChwcml2LT5yZXNldCk7Cj4gPiArCWlmIChyZXQpCj4gPiArCQlyZXR1cm4gcmV0Owo+ ID4gKwo+ID4gKwlyZXQgPSBjbGtfcHJlcGFyZV9lbmFibGUocHJpdi0+YnVzX2Nsayk7Cj4gPiAr CWlmIChyZXQpCj4gPiArCQlnb3RvIGVycl9hc3NlcnRfcmVzZXQ7Cj4gPiArCj4gPiArCXJldCA9 IGNsa19wcmVwYXJlX2VuYWJsZShwcml2LT5tb2RfY2xrKTsKPiA+ICsJaWYgKHJldCkKPiA+ICsJ CWdvdG8gZXJyX2Rpc2FibGVfYnVzX2NsazsKPiA+ICsKPiA+ICsJc3VuNTBpX2ExMDBfbGVkY19z ZXRfZm9ybWF0KHByaXYpOwo+ID4gKwlzdW41MGlfYTEwMF9sZWRjX3NldF90aW1pbmcocHJpdik7 Cj4gPiArCj4gPiArCS8qIFRoZSB0cmlnZ2VyIGxldmVsIG11c3QgYmUgYXQgbGVhc3QgdGhlIGJ1 cnN0IGxlbmd0aC4gKi8KPiA+ICsJdmFsID0gcmVhZGwocHJpdi0+YmFzZSArIExFRENfRE1BX0NU UkxfUkVHKTsKPiA+ICsJdmFsICY9IH5MRURDX0RNQV9DVFJMX1JFR19GSUZPX1RSSUdfTEVWRUw7 Cj4gPiArCXZhbCB8PSBMRURDX0ZJRk9fREVQVEggLyAyOwo+ID4gKwl3cml0ZWwodmFsLCBwcml2 LT5iYXNlICsgTEVEQ19ETUFfQ1RSTF9SRUcpOwo+ID4gKwo+ID4gKwl2YWwgPSBMRURDX0lOVF9D VFJMX1JFR19HTE9CQUxfSU5UX0VOIHwKPiA+ICsJICAgICAgTEVEQ19JTlRfQ1RSTF9SRUdfVFJB TlNfRklOSVNIX0lOVF9FTjsKPiA+ICsJd3JpdGVsKHZhbCwgcHJpdi0+YmFzZSArIExFRENfSU5U X0NUUkxfUkVHKTsKPiA+ICsKPiA+ICsJcmV0dXJuIDA7Cj4gPiArCj4gPiArZXJyX2Rpc2FibGVf YnVzX2NsazoKPiA+ICsJY2xrX2Rpc2FibGVfdW5wcmVwYXJlKHByaXYtPmJ1c19jbGspOwo+ID4g K2Vycl9hc3NlcnRfcmVzZXQ6Cj4gPiArCXJlc2V0X2NvbnRyb2xfYXNzZXJ0KHByaXYtPnJlc2V0 KTsKPiA+ICsKPiA+ICsJcmV0dXJuIHJldDsKPiA+ICt9Cj4gPiArCj4gPiArc3RhdGljIGludCBz dW41MGlfYTEwMF9sZWRjX3N1c3BlbmQoc3RydWN0IGRldmljZSAqZGV2KQo+ID4gK3sKPiA+ICsJ c3RydWN0IHN1bjUwaV9hMTAwX2xlZGMgKnByaXYgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKPiA+ ICsKPiA+ICsJY2xrX2Rpc2FibGVfdW5wcmVwYXJlKHByaXYtPm1vZF9jbGspOwo+ID4gKwljbGtf ZGlzYWJsZV91bnByZXBhcmUocHJpdi0+YnVzX2Nsayk7Cj4gPiArCXJlc2V0X2NvbnRyb2xfYXNz ZXJ0KHByaXYtPnJlc2V0KTsKPiA+ICsKPiA+ICsJcmV0dXJuIDA7Cj4gPiArfQo+ID4gKwo+ID4g K3N0YXRpYyB2b2lkIHN1bjUwaV9hMTAwX2xlZGNfZG1hX2NsZWFudXAodm9pZCAqZGF0YSkKPiA+ ICt7Cj4gPiArCXN0cnVjdCBzdW41MGlfYTEwMF9sZWRjICpwcml2ID0gZGF0YTsKPiA+ICsJc3Ry dWN0IGRldmljZSAqZG1hX2RldiA9IGRtYWVuZ2luZV9nZXRfZG1hX2RldmljZShwcml2LT5kbWFf Y2hhbik7Cj4gPiArCj4gPiArCWlmIChwcml2LT5idWZmZXIpCj4gPiArCQlkbWFfZnJlZV93Yyhk bWFfZGV2LCBMRURTX1RPX0JZVEVTKHByaXYtPm51bV9sZWRzKSwKPiA+ICsJCQkgICAgcHJpdi0+ YnVmZmVyLCBwcml2LT5kbWFfaGFuZGxlKTsKPiA+ICsJZG1hX3JlbGVhc2VfY2hhbm5lbChwcml2 LT5kbWFfY2hhbik7Cj4gPiArfQo+ID4gKwo+ID4gK3N0YXRpYyBpbnQgc3VuNTBpX2ExMDBfbGVk Y19wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQo+ID4gK3sKPiA+ICsJY29uc3Qg c3RydWN0IGRldmljZV9ub2RlICpucCA9IHBkZXYtPmRldi5vZl9ub2RlOwo+ID4gKwlzdHJ1Y3Qg ZG1hX3NsYXZlX2NvbmZpZyBkbWFfY2ZnID0ge307Cj4gPiArCXN0cnVjdCBsZWRfaW5pdF9kYXRh IGluaXRfZGF0YSA9IHt9Owo+ID4gKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSAmcGRldi0+ZGV2Owo+ ID4gKwlzdHJ1Y3QgZGV2aWNlX25vZGUgKmNoaWxkOwo+ID4gKwlzdHJ1Y3Qgc3VuNTBpX2ExMDBf bGVkYyAqcHJpdjsKPiA+ICsJc3RydWN0IHJlc291cmNlICptZW07Cj4gPiArCWludCBjb3VudCwg aXJxLCByZXQ7Cj4gPiArCj4gPiArCWNvdW50ID0gb2ZfZ2V0X2F2YWlsYWJsZV9jaGlsZF9jb3Vu dChucCk7Cj4gPiArCWlmICghY291bnQpCj4gPiArCQlyZXR1cm4gLUVOT0RFVjsKPiA+ICsJaWYg KGNvdW50ID4gTEVEQ19NQVhfTEVEUykgewo+ID4gKwkJZGV2X2VycihkZXYsICJUb28gbWFueSBM RURzISAobWF4IGlzICVkKVxuIiwgTEVEQ19NQVhfTEVEUyk7Cj4gPiArCQlyZXR1cm4gLUVJTlZB TDsKPiA+ICsJfQo+ID4gKwo+ID4gKwlwcml2ID0gZGV2bV9remFsbG9jKGRldiwgc3RydWN0X3Np emUocHJpdiwgbGVkcywgY291bnQpLCBHRlBfS0VSTkVMKTsKPiA+ICsJaWYgKCFwcml2KQo+ID4g KwkJcmV0dXJuIC1FTk9NRU07Cj4gPiArCj4gPiArCXByaXYtPmRldiA9IGRldjsKPiA+ICsJcHJp di0+bnVtX2xlZHMgPSBjb3VudDsKPiA+ICsJc3Bpbl9sb2NrX2luaXQoJnByaXYtPmxvY2spOwo+ ID4gKwlkZXZfc2V0X2RydmRhdGEoZGV2LCBwcml2KTsKPiA+ICsKPiA+ICsJcmV0ID0gc3VuNTBp X2ExMDBfbGVkY19wYXJzZV9mb3JtYXQobnAsIHByaXYpOwo+ID4gKwlpZiAocmV0KQo+ID4gKwkJ cmV0dXJuIHJldDsKPiA+ICsKPiA+ICsJcmV0ID0gc3VuNTBpX2ExMDBfbGVkY19wYXJzZV90aW1p bmcobnAsIHByaXYpOwo+ID4gKwlpZiAocmV0KQo+ID4gKwkJcmV0dXJuIHJldDsKPiA+ICsKPiA+ ICsJcHJpdi0+YmFzZSA9IGRldm1fcGxhdGZvcm1fZ2V0X2FuZF9pb3JlbWFwX3Jlc291cmNlKHBk ZXYsIDAsICZtZW0pOwo+ID4gKwlpZiAoSVNfRVJSKHByaXYtPmJhc2UpKQo+ID4gKwkJcmV0dXJu IFBUUl9FUlIocHJpdi0+YmFzZSk7Cj4gPiArCj4gPiArCXByaXYtPmJ1c19jbGsgPSBkZXZtX2Ns a19nZXQoZGV2LCAiYnVzIik7Cj4gPiArCWlmIChJU19FUlIocHJpdi0+YnVzX2NsaykpCj4gPiAr CQlyZXR1cm4gUFRSX0VSUihwcml2LT5idXNfY2xrKTsKPiA+ICsKPiA+ICsJcHJpdi0+bW9kX2Ns ayA9IGRldm1fY2xrX2dldChkZXYsICJtb2QiKTsKPiA+ICsJaWYgKElTX0VSUihwcml2LT5tb2Rf Y2xrKSkKPiA+ICsJCXJldHVybiBQVFJfRVJSKHByaXYtPm1vZF9jbGspOwo+ID4gKwo+ID4gKwlw cml2LT5yZXNldCA9IGRldm1fcmVzZXRfY29udHJvbF9nZXRfZXhjbHVzaXZlKGRldiwgTlVMTCk7 Cj4gPiArCWlmIChJU19FUlIocHJpdi0+cmVzZXQpKQo+ID4gKwkJcmV0dXJuIFBUUl9FUlIocHJp di0+cmVzZXQpOwo+ID4gKwo+ID4gKwlwcml2LT5kbWFfY2hhbiA9IGRtYV9yZXF1ZXN0X2NoYW4o ZGV2LCAidHgiKTsKPiA+ICsJaWYgKElTX0VSUihwcml2LT5kbWFfY2hhbikpCj4gPiArCQlyZXR1 cm4gUFRSX0VSUihwcml2LT5kbWFfY2hhbik7Cj4gPiArCj4gPiArCXJldCA9IGRldm1fYWRkX2Fj dGlvbl9vcl9yZXNldChkZXYsIHN1bjUwaV9hMTAwX2xlZGNfZG1hX2NsZWFudXAsIHByaXYpOwo+ ID4gKwlpZiAocmV0KQo+ID4gKwkJcmV0dXJuIHJldDsKPiA+ICsKPiA+ICsJZG1hX2NmZy5kc3Rf YWRkcgk9IG1lbS0+c3RhcnQgKyBMRURDX0RBVEFfUkVHOwo+ID4gKwlkbWFfY2ZnLmRzdF9hZGRy X3dpZHRoCT0gRE1BX1NMQVZFX0JVU1dJRFRIXzRfQllURVM7Cj4gPiArCWRtYV9jZmcuZHN0X21h eGJ1cnN0CT0gTEVEQ19GSUZPX0RFUFRIIC8gMjsKPiA+ICsJcmV0ID0gZG1hZW5naW5lX3NsYXZl X2NvbmZpZyhwcml2LT5kbWFfY2hhbiwgJmRtYV9jZmcpOwo+ID4gKwlpZiAocmV0KQo+ID4gKwkJ cmV0dXJuIHJldDsKPiA+ICsKPiA+ICsJcHJpdi0+YnVmZmVyID0gZG1hX2FsbG9jX3djKGRtYWVu Z2luZV9nZXRfZG1hX2RldmljZShwcml2LT5kbWFfY2hhbiksCj4gPiArCQkJCSAgICBMRURTX1RP X0JZVEVTKHByaXYtPm51bV9sZWRzKSwKPiA+ICsJCQkJICAgICZwcml2LT5kbWFfaGFuZGxlLCBH RlBfS0VSTkVMKTsKPiA+ICsJaWYgKCFwcml2LT5idWZmZXIpCj4gPiArCQlyZXR1cm4gLUVOT01F TTsKPiA+ICsKPiA+ICsJaXJxID0gcGxhdGZvcm1fZ2V0X2lycShwZGV2LCAwKTsKPiA+ICsJaWYg KGlycSA8IDApCj4gPiArCQlyZXR1cm4gaXJxOwo+ID4gKwo+ID4gKwlyZXQgPSBkZXZtX3JlcXVl c3RfaXJxKGRldiwgaXJxLCBzdW41MGlfYTEwMF9sZWRjX2lycSwKPiA+ICsJCQkgICAgICAgMCwg ZGV2X25hbWUoZGV2KSwgcHJpdik7Cj4gPiArCWlmIChyZXQpCj4gPiArCQlyZXR1cm4gcmV0Owo+ ID4gKwo+ID4gKwlyZXQgPSBzdW41MGlfYTEwMF9sZWRjX3Jlc3VtZShkZXYpOwo+ID4gKwlpZiAo cmV0KQo+ID4gKwkJcmV0dXJuIHJldDsKPiA+ICsKPiA+ICsJZm9yX2VhY2hfYXZhaWxhYmxlX2No aWxkX29mX25vZGUobnAsIGNoaWxkKSB7Cj4gPiArCQlzdHJ1Y3Qgc3VuNTBpX2ExMDBfbGVkY19s ZWQgKmxlZDsKPiA+ICsJCXN0cnVjdCBsZWRfY2xhc3NkZXYgKmNkZXY7Cj4gPiArCQl1MzIgYWRk ciwgY29sb3I7Cj4gPiArCj4gPiArCQlyZXQgPSBvZl9wcm9wZXJ0eV9yZWFkX3UzMihjaGlsZCwg InJlZyIsICZhZGRyKTsKPiA+ICsJCWlmIChyZXQgfHwgYWRkciA+PSBjb3VudCkgewo+ID4gKwkJ CWRldl9lcnIoZGV2LCAiTEVEICdyZWcnIHZhbHVlcyBtdXN0IGJlIGZyb20gMCB0byAlZFxuIiwK PiA+ICsJCQkJcHJpdi0+bnVtX2xlZHMgLSAxKTsKPiA+ICsJCQlyZXQgPSAtRUlOVkFMOwo+ID4g KwkJCWdvdG8gZXJyX3B1dF9jaGlsZDsKPiA+ICsJCX0KPiA+ICsKPiA+ICsJCXJldCA9IG9mX3By b3BlcnR5X3JlYWRfdTMyKGNoaWxkLCAiY29sb3IiLCAmY29sb3IpOwo+ID4gKwkJaWYgKHJldCB8 fCBjb2xvciAhPSBMRURfQ09MT1JfSURfUkdCKSB7Cj4gPiArCQkJZGV2X2VycihkZXYsICJMRUQg J2NvbG9yJyBtdXN0IGJlIExFRF9DT0xPUl9JRF9SR0JcbiIpOwo+ID4gKwkJCXJldCA9IC1FSU5W QUw7Cj4gPiArCQkJZ290byBlcnJfcHV0X2NoaWxkOwo+ID4gKwkJfQo+ID4gKwo+ID4gKwkJbGVk ID0gJnByaXYtPmxlZHNbYWRkcl07Cj4gPiArCj4gPiArCQlsZWQtPnN1YmxlZF9pbmZvWzBdLmNv bG9yX2luZGV4ID0gTEVEX0NPTE9SX0lEX1JFRDsKPiA+ICsJCWxlZC0+c3VibGVkX2luZm9bMF0u Y2hhbm5lbCA9IDA7Cj4gPiArCQlsZWQtPnN1YmxlZF9pbmZvWzFdLmNvbG9yX2luZGV4ID0gTEVE X0NPTE9SX0lEX0dSRUVOOwo+ID4gKwkJbGVkLT5zdWJsZWRfaW5mb1sxXS5jaGFubmVsID0gMTsK PiA+ICsJCWxlZC0+c3VibGVkX2luZm9bMl0uY29sb3JfaW5kZXggPSBMRURfQ09MT1JfSURfQkxV RTsKPiA+ICsJCWxlZC0+c3VibGVkX2luZm9bMl0uY2hhbm5lbCA9IDI7Cj4gPiArCj4gPiArCQls ZWQtPm1jX2NkZXYubnVtX2NvbG9ycyA9IEFSUkFZX1NJWkUobGVkLT5zdWJsZWRfaW5mbyk7Cj4g PiArCQlsZWQtPm1jX2NkZXYuc3VibGVkX2luZm8gPSBsZWQtPnN1YmxlZF9pbmZvOwo+ID4gKwo+ ID4gKwkJY2RldiA9ICZsZWQtPm1jX2NkZXYubGVkX2NkZXY7Cj4gPiArCQljZGV2LT5tYXhfYnJp Z2h0bmVzcyA9IFU4X01BWDsKPiA+ICsJCWNkZXYtPmJyaWdodG5lc3Nfc2V0ID0gc3VuNTBpX2Ex MDBfbGVkY19icmlnaHRuZXNzX3NldDsKPiA+ICsKPiA+ICsJCWluaXRfZGF0YS5md25vZGUgPSBv Zl9md25vZGVfaGFuZGxlKGNoaWxkKTsKPiA+ICsKPiA+ICsJCXJldCA9IGRldm1fbGVkX2NsYXNz ZGV2X211bHRpY29sb3JfcmVnaXN0ZXJfZXh0KGRldiwKPiA+ICsJCQkJCQkJCSZsZWQtPm1jX2Nk ZXYsCj4gPiArCQkJCQkJCQkmaW5pdF9kYXRhKTsKPiA+ICsJCWlmIChyZXQpIHsKPiA+ICsJCQlk ZXZfZXJyKGRldiwgIkZhaWxlZCB0byByZWdpc3RlciBMRUQgJXU6ICVkXG4iLAo+ID4gKwkJCQlh ZGRyLCByZXQpOwo+ID4gKwkJCWdvdG8gZXJyX3B1dF9jaGlsZDsKPiA+ICsJCX0KPiA+ICsJfQo+ ID4gKwo+ID4gKwlkZXZfaW5mbyhkZXYsICJSZWdpc3RlcmVkICVkIExFRHNcbiIsIHByaXYtPm51 bV9sZWRzKTsKPiA+ICsKPiA+ICsJcmV0dXJuIDA7Cj4gPiArCj4gPiArZXJyX3B1dF9jaGlsZDoK PiA+ICsJb2Zfbm9kZV9wdXQoY2hpbGQpOwo+ID4gKwlzdW41MGlfYTEwMF9sZWRjX3N1c3BlbmQo JnBkZXYtPmRldik7Cj4gPiArCj4gPiArCXJldHVybiByZXQ7Cj4gPiArfQo+ID4gKwo+ID4gK3N0 YXRpYyBpbnQgc3VuNTBpX2ExMDBfbGVkY19yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAq cGRldikKPiA+ICt7Cj4gPiArCXN1bjUwaV9hMTAwX2xlZGNfc3VzcGVuZCgmcGRldi0+ZGV2KTsK PiA+ICsKPiA+ICsJcmV0dXJuIDA7Cj4gPiArfQo+ID4gKwo+ID4gK3N0YXRpYyB2b2lkIHN1bjUw aV9hMTAwX2xlZGNfc2h1dGRvd24oc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKPiA+ICt7 Cj4gPiArCXN1bjUwaV9hMTAwX2xlZGNfc3VzcGVuZCgmcGRldi0+ZGV2KTsKPiA+ICt9Cj4gPiAr Cj4gPiArc3RhdGljIGNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgc3VuNTBpX2ExMDBfbGVkY19v Zl9tYXRjaFtdID0gewo+ID4gKwl7IC5jb21wYXRpYmxlID0gImFsbHdpbm5lcixzdW41MGktYTEw MC1sZWRjIiB9LAo+ID4gKwl7fQo+ID4gK307Cj4gPiArTU9EVUxFX0RFVklDRV9UQUJMRShvZiwg c3VuNTBpX2ExMDBfbGVkY19vZl9tYXRjaCk7Cj4gPiArCj4gPiArc3RhdGljIERFRklORV9TSU1Q TEVfREVWX1BNX09QUyhzdW41MGlfYTEwMF9sZWRjX3BtLAo+ID4gKwkJCQlzdW41MGlfYTEwMF9s ZWRjX3N1c3BlbmQsCj4gPiArCQkJCXN1bjUwaV9hMTAwX2xlZGNfcmVzdW1lKTsKPiA+ICsKPiA+ ICtzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciBzdW41MGlfYTEwMF9sZWRjX2RyaXZlciA9 IHsKPiA+ICsJLnByb2JlCQk9IHN1bjUwaV9hMTAwX2xlZGNfcHJvYmUsCj4gPiArCS5yZW1vdmUJ CT0gc3VuNTBpX2ExMDBfbGVkY19yZW1vdmUsCj4gPiArCS5zaHV0ZG93bgk9IHN1bjUwaV9hMTAw X2xlZGNfc2h1dGRvd24sCj4gPiArCS5kcml2ZXIJCT0gewo+ID4gKwkJLm5hbWUJCT0gInN1bjUw aS1hMTAwLWxlZGMiLAo+ID4gKwkJLm9mX21hdGNoX3RhYmxlCT0gc3VuNTBpX2ExMDBfbGVkY19v Zl9tYXRjaCwKPiA+ICsJCS5wbQkJPSBwbV9wdHIoJnN1bjUwaV9hMTAwX2xlZGNfcG0pLAo+ID4g Kwl9LAo+ID4gK307Cj4gPiArbW9kdWxlX3BsYXRmb3JtX2RyaXZlcihzdW41MGlfYTEwMF9sZWRj X2RyaXZlcik7Cj4gPiArCj4gPiArTU9EVUxFX0FVVEhPUigiU2FtdWVsIEhvbGxhbmQgPHNhbXVl bEBzaG9sbGFuZC5vcmc+Iik7Cj4gPiArTU9EVUxFX0RFU0NSSVBUSU9OKCJBbGx3aW5uZXIgQTEw MCBMRUQgY29udHJvbGxlciBkcml2ZXIiKTsKPiA+ICtNT0RVTEVfTElDRU5TRSgiR1BMIik7Cj4g PiAtLSAKPiA+IDIuMzcuNAo+ID4gCj4gCj4gLS0gCj4gTGVlIEpvbmVzIFvmnY7nkLzmlq9dCgot LSAKTGVlIEpvbmVzIFvmnY7nkLzmlq9dCgpfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fXwpsaW51eC1hcm0ta2VybmVsIG1haWxpbmcgbGlzdApsaW51eC1hcm0t a2VybmVsQGxpc3RzLmluZnJhZGVhZC5vcmcKaHR0cDovL2xpc3RzLmluZnJhZGVhZC5vcmcvbWFp bG1hbi9saXN0aW5mby9saW51eC1hcm0ta2VybmVsCg==