From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-11.2 required=3.0 tests=BAYES_00,INCLUDES_CR_TRAILER, INCLUDES_PATCH,MAILING_LIST_MULTI,SPF_HELO_NONE,SPF_PASS, UNWANTED_LANGUAGE_BODY,URIBL_BLOCKED autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id A66B3C433DB for ; Wed, 20 Jan 2021 22:12:27 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id 7002923602 for ; Wed, 20 Jan 2021 22:12:27 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1733050AbhATVrw convert rfc822-to-8bit (ORCPT ); Wed, 20 Jan 2021 16:47:52 -0500 Received: from mail-ed1-f49.google.com ([209.85.208.49]:35474 "EHLO mail-ed1-f49.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1727109AbhATVTK (ORCPT ); Wed, 20 Jan 2021 16:19:10 -0500 Received: by mail-ed1-f49.google.com with SMTP id j13so34406edp.2 for ; Wed, 20 Jan 2021 13:18:50 -0800 (PST) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:mime-version:references:in-reply-to:from:date :message-id:subject:to:cc:content-transfer-encoding; bh=R+sF0wg3r8XINJntKCq2KV4V+mR8u2K7/6NUXxJfJmY=; b=mflkR8V2WqAa0XRrTgaTebhslGTJxtbyj6cgEpLA9rv4pgcc4MoZzF1ZJ3OAm1ieCN YN40OA8wAAepSwoF0OogRoT0muV/4K+3dmWwz4N3WNWE/+FvNan7wqk2b4W3nTPCoZXZ zc6Ai9RtPFjdH7Mo1mmW8hrSQ0xWQ2JxOmLDcc408VB67hpo69TW2ynJUSGcWmjOxRIX KTZV6VEO92nNGVfdfuqgLmp0hHPWp5PjlUxMW3lGfs1FQ8w3XzERCCvPl/onHzEo2fCM 1K3VAZvFGG8FM9u/H8IbI//H2pZMVMhCsz9lDqn7AnGLKSrv66iuzou0eZ692Q0XH2L7 lQ2w== X-Gm-Message-State: AOAM532ZRirdkUPVx2e6bJx6rFzDG9/DSFLIwbqvjtr5f8nmvUhrEBZo Kai1+EGiOqtH1qIynpE3uLGogIXGNW1Kd0Gh4lo= X-Google-Smtp-Source: ABdhPJyGTRiNEqKZLpSpnoiPmaNeBKxr+8eBMLUjTU/s0fvSxkLQC2K59RrITmCTRRVl6rkbG4LkKiaBDcH7KAkIKWQ= X-Received: by 2002:a50:fd84:: with SMTP id o4mr6474874edt.340.1611177504958; Wed, 20 Jan 2021 13:18:24 -0800 (PST) MIME-Version: 1.0 References: <20210120162553.21666-1-arnd@kernel.org> <20210120162553.21666-2-arnd@kernel.org> In-Reply-To: <20210120162553.21666-2-arnd@kernel.org> From: Barry Song Date: Thu, 21 Jan 2021 10:18:13 +1300 Message-ID: Subject: Re: [PATCH 1/2] ASoC: remove sirf prima/atlas drivers To: Arnd Bergmann Cc: linux-arm-kernel@lists.infradead.org, LKML , alsa-devel@alsa-project.org, Mark Brown , Liam Girdwood , Arnd Bergmann Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: 8BIT Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Arnd Bergmann 于2021年1月21日周四 上午5:26写道: > > From: Arnd Bergmann > > The CSR SiRF prima2/atlas platforms are getting removed, so this driver > is no longer needed. > > Cc: Barry Song > Signed-off-by: Arnd Bergmann Acked-by: Barry Song > --- > .../bindings/sound/sirf-audio-codec.txt | 17 - > .../devicetree/bindings/sound/sirf-usp.txt | 27 - > sound/soc/Kconfig | 1 - > sound/soc/Makefile | 1 - > sound/soc/codecs/Makefile | 2 - > sound/soc/codecs/sirf-audio-codec.c | 575 ------------------ > sound/soc/sirf/Kconfig | 21 - > sound/soc/sirf/Makefile | 8 - > sound/soc/sirf/sirf-audio-port.c | 86 --- > sound/soc/sirf/sirf-audio.c | 160 ----- > sound/soc/sirf/sirf-usp.c | 435 ------------- > sound/soc/sirf/sirf-usp.h | 292 --------- > 12 files changed, 1625 deletions(-) > delete mode 100644 Documentation/devicetree/bindings/sound/sirf-audio-codec.txt > delete mode 100644 Documentation/devicetree/bindings/sound/sirf-usp.txt > delete mode 100644 sound/soc/codecs/sirf-audio-codec.c > delete mode 100644 sound/soc/sirf/Kconfig > delete mode 100644 sound/soc/sirf/Makefile > delete mode 100644 sound/soc/sirf/sirf-audio-port.c > delete mode 100644 sound/soc/sirf/sirf-audio.c > delete mode 100644 sound/soc/sirf/sirf-usp.c > delete mode 100644 sound/soc/sirf/sirf-usp.h > > diff --git a/Documentation/devicetree/bindings/sound/sirf-audio-codec.txt b/Documentation/devicetree/bindings/sound/sirf-audio-codec.txt > deleted file mode 100644 > index 062f5ec36f9b..000000000000 > --- a/Documentation/devicetree/bindings/sound/sirf-audio-codec.txt > +++ /dev/null > @@ -1,17 +0,0 @@ > -SiRF internal audio CODEC > - > -Required properties: > - > - - compatible : "sirf,atlas6-audio-codec" or "sirf,prima2-audio-codec" > - > - - reg : the register address of the device. > - > - - clocks: the clock of SiRF internal audio codec > - > -Example: > - > -audiocodec: audiocodec@b0040000 { > - compatible = "sirf,atlas6-audio-codec"; > - reg = <0xb0040000 0x10000>; > - clocks = <&clks 27>; > -}; > diff --git a/Documentation/devicetree/bindings/sound/sirf-usp.txt b/Documentation/devicetree/bindings/sound/sirf-usp.txt > deleted file mode 100644 > index 02f85b32d359..000000000000 > --- a/Documentation/devicetree/bindings/sound/sirf-usp.txt > +++ /dev/null > @@ -1,27 +0,0 @@ > -* SiRF SoC USP module > - > -Required properties: > -- compatible: "sirf,prima2-usp-pcm" > -- reg: Base address and size entries: > -- dmas: List of DMA controller phandle and DMA request line ordered pairs. > -- dma-names: Identifier string for each DMA request line in the dmas property. > - These strings correspond 1:1 with the ordered pairs in dmas. > - > - One of the DMA channels will be responsible for transmission (should be > - named "tx") and one for reception (should be named "rx"). > - > -- clocks: USP controller clock source > -- pinctrl-names: Must contain a "default" entry. > -- pinctrl-NNN: One property must exist for each entry in pinctrl-names. > - > -Example: > -usp0: usp@b0080000 { > - compatible = "sirf,prima2-usp-pcm"; > - reg = <0xb0080000 0x10000>; > - clocks = <&clks 28>; > - dmas = <&dmac1 1>, <&dmac1 2>; > - dma-names = "rx", "tx"; > - pinctrl-names = "default"; > - pinctrl-0 = <&usp0_only_utfs_pins_a>; > -}; > - > diff --git a/sound/soc/Kconfig b/sound/soc/Kconfig > index 71a6fe87d1a1..1fb61e689031 100644 > --- a/sound/soc/Kconfig > +++ b/sound/soc/Kconfig > @@ -62,7 +62,6 @@ source "sound/soc/qcom/Kconfig" > source "sound/soc/rockchip/Kconfig" > source "sound/soc/samsung/Kconfig" > source "sound/soc/sh/Kconfig" > -source "sound/soc/sirf/Kconfig" > source "sound/soc/sof/Kconfig" > source "sound/soc/spear/Kconfig" > source "sound/soc/sprd/Kconfig" > diff --git a/sound/soc/Makefile b/sound/soc/Makefile > index ddbac3a2169f..d2b7a23f0e7b 100644 > --- a/sound/soc/Makefile > +++ b/sound/soc/Makefile > @@ -45,7 +45,6 @@ obj-$(CONFIG_SND_SOC) += qcom/ > obj-$(CONFIG_SND_SOC) += rockchip/ > obj-$(CONFIG_SND_SOC) += samsung/ > obj-$(CONFIG_SND_SOC) += sh/ > -obj-$(CONFIG_SND_SOC) += sirf/ > obj-$(CONFIG_SND_SOC) += sof/ > obj-$(CONFIG_SND_SOC) += spear/ > obj-$(CONFIG_SND_SOC) += sprd/ > diff --git a/sound/soc/codecs/Makefile b/sound/soc/codecs/Makefile > index d277f0366e09..c30762fc9b87 100644 > --- a/sound/soc/codecs/Makefile > +++ b/sound/soc/codecs/Makefile > @@ -201,7 +201,6 @@ snd-soc-sigmadsp-objs := sigmadsp.o > snd-soc-sigmadsp-i2c-objs := sigmadsp-i2c.o > snd-soc-sigmadsp-regmap-objs := sigmadsp-regmap.o > snd-soc-si476x-objs := si476x.o > -snd-soc-sirf-audio-codec-objs := sirf-audio-codec.o > snd-soc-spdif-tx-objs := spdif_transmitter.o > snd-soc-spdif-rx-objs := spdif_receiver.o > snd-soc-ssm2305-objs := ssm2305.o > @@ -516,7 +515,6 @@ obj-$(CONFIG_SND_SOC_SIGMADSP_I2C) += snd-soc-sigmadsp-i2c.o > obj-$(CONFIG_SND_SOC_SIGMADSP_REGMAP) += snd-soc-sigmadsp-regmap.o > obj-$(CONFIG_SND_SOC_SI476X) += snd-soc-si476x.o > obj-$(CONFIG_SND_SOC_SPDIF) += snd-soc-spdif-rx.o snd-soc-spdif-tx.o > -obj-$(CONFIG_SND_SOC_SIRF_AUDIO_CODEC) += sirf-audio-codec.o > obj-$(CONFIG_SND_SOC_SSM2305) += snd-soc-ssm2305.o > obj-$(CONFIG_SND_SOC_SSM2518) += snd-soc-ssm2518.o > obj-$(CONFIG_SND_SOC_SSM2602) += snd-soc-ssm2602.o > diff --git a/sound/soc/codecs/sirf-audio-codec.c b/sound/soc/codecs/sirf-audio-codec.c > deleted file mode 100644 > index a061d78473ac..000000000000 > --- a/sound/soc/codecs/sirf-audio-codec.c > +++ /dev/null > @@ -1,575 +0,0 @@ > -// SPDX-License-Identifier: GPL-2.0-or-later > -/* > - * SiRF audio codec driver > - * > - * Copyright (c) 2011 Cambridge Silicon Radio Limited, a CSR plc group company. > - */ > - > -#include > -#include > -#include > -#include > -#include > -#include > -#include > -#include > -#include > -#include > -#include > -#include > -#include > -#include > -#include > -#include > - > -#include "sirf-audio-codec.h" > - > -struct sirf_audio_codec { > - struct clk *clk; > - struct regmap *regmap; > - u32 reg_ctrl0, reg_ctrl1; > -}; > - > -static const char * const input_mode_mux[] = {"Single-ended", > - "Differential"}; > - > -static const struct soc_enum input_mode_mux_enum = > - SOC_ENUM_SINGLE(AUDIO_IC_CODEC_CTRL1, 4, 2, input_mode_mux); > - > -static const struct snd_kcontrol_new sirf_audio_codec_input_mode_control = > - SOC_DAPM_ENUM("Route", input_mode_mux_enum); > - > -static const DECLARE_TLV_DB_SCALE(playback_vol_tlv, -12400, 100, 0); > -static const DECLARE_TLV_DB_SCALE(capture_vol_tlv_prima2, 500, 100, 0); > -static const DECLARE_TLV_DB_RANGE(capture_vol_tlv_atlas6, > - 0, 7, TLV_DB_SCALE_ITEM(-100, 100, 0), > - 0x22, 0x3F, TLV_DB_SCALE_ITEM(700, 100, 0), > -); > - > -static struct snd_kcontrol_new volume_controls_atlas6[] = { > - SOC_DOUBLE_TLV("Playback Volume", AUDIO_IC_CODEC_CTRL0, 21, 14, > - 0x7F, 0, playback_vol_tlv), > - SOC_DOUBLE_TLV("Capture Volume", AUDIO_IC_CODEC_CTRL1, 16, 10, > - 0x3F, 0, capture_vol_tlv_atlas6), > -}; > - > -static struct snd_kcontrol_new volume_controls_prima2[] = { > - SOC_DOUBLE_TLV("Speaker Volume", AUDIO_IC_CODEC_CTRL0, 21, 14, > - 0x7F, 0, playback_vol_tlv), > - SOC_DOUBLE_TLV("Capture Volume", AUDIO_IC_CODEC_CTRL1, 15, 10, > - 0x1F, 0, capture_vol_tlv_prima2), > -}; > - > -static struct snd_kcontrol_new left_input_path_controls[] = { > - SOC_DAPM_SINGLE("Line Left Switch", AUDIO_IC_CODEC_CTRL1, 6, 1, 0), > - SOC_DAPM_SINGLE("Mic Left Switch", AUDIO_IC_CODEC_CTRL1, 3, 1, 0), > -}; > - > -static struct snd_kcontrol_new right_input_path_controls[] = { > - SOC_DAPM_SINGLE("Line Right Switch", AUDIO_IC_CODEC_CTRL1, 5, 1, 0), > - SOC_DAPM_SINGLE("Mic Right Switch", AUDIO_IC_CODEC_CTRL1, 2, 1, 0), > -}; > - > -static struct snd_kcontrol_new left_dac_to_hp_left_amp_switch_control = > - SOC_DAPM_SINGLE("Switch", AUDIO_IC_CODEC_CTRL0, 9, 1, 0); > - > -static struct snd_kcontrol_new left_dac_to_hp_right_amp_switch_control = > - SOC_DAPM_SINGLE("Switch", AUDIO_IC_CODEC_CTRL0, 8, 1, 0); > - > -static struct snd_kcontrol_new right_dac_to_hp_left_amp_switch_control = > - SOC_DAPM_SINGLE("Switch", AUDIO_IC_CODEC_CTRL0, 7, 1, 0); > - > -static struct snd_kcontrol_new right_dac_to_hp_right_amp_switch_control = > - SOC_DAPM_SINGLE("Switch", AUDIO_IC_CODEC_CTRL0, 6, 1, 0); > - > -static struct snd_kcontrol_new left_dac_to_speaker_lineout_switch_control = > - SOC_DAPM_SINGLE("Switch", AUDIO_IC_CODEC_CTRL0, 11, 1, 0); > - > -static struct snd_kcontrol_new right_dac_to_speaker_lineout_switch_control = > - SOC_DAPM_SINGLE("Switch", AUDIO_IC_CODEC_CTRL0, 10, 1, 0); > - > -/* After enable adc, Delay 200ms to avoid pop noise */ > -static int adc_enable_delay_event(struct snd_soc_dapm_widget *w, > - struct snd_kcontrol *kcontrol, int event) > -{ > - switch (event) { > - case SND_SOC_DAPM_POST_PMU: > - msleep(200); > - break; > - default: > - break; > - } > - > - return 0; > -} > - > -static void enable_and_reset_codec(struct regmap *regmap, > - u32 codec_enable_bits, u32 codec_reset_bits) > -{ > - regmap_update_bits(regmap, AUDIO_IC_CODEC_CTRL1, > - codec_enable_bits | codec_reset_bits, > - codec_enable_bits); > - msleep(20); > - regmap_update_bits(regmap, AUDIO_IC_CODEC_CTRL1, > - codec_reset_bits, codec_reset_bits); > -} > - > -static int atlas6_codec_enable_and_reset_event(struct snd_soc_dapm_widget *w, > - struct snd_kcontrol *kcontrol, int event) > -{ > -#define ATLAS6_CODEC_ENABLE_BITS (1 << 29) > -#define ATLAS6_CODEC_RESET_BITS (1 << 28) > - struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm); > - struct sirf_audio_codec *sirf_audio_codec = snd_soc_component_get_drvdata(component); > - switch (event) { > - case SND_SOC_DAPM_PRE_PMU: > - enable_and_reset_codec(sirf_audio_codec->regmap, > - ATLAS6_CODEC_ENABLE_BITS, ATLAS6_CODEC_RESET_BITS); > - break; > - case SND_SOC_DAPM_POST_PMD: > - regmap_update_bits(sirf_audio_codec->regmap, > - AUDIO_IC_CODEC_CTRL1, ATLAS6_CODEC_ENABLE_BITS, 0); > - break; > - default: > - break; > - } > - > - return 0; > -} > - > -static int prima2_codec_enable_and_reset_event(struct snd_soc_dapm_widget *w, > - struct snd_kcontrol *kcontrol, int event) > -{ > -#define PRIMA2_CODEC_ENABLE_BITS (1 << 27) > -#define PRIMA2_CODEC_RESET_BITS (1 << 26) > - struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm); > - struct sirf_audio_codec *sirf_audio_codec = snd_soc_component_get_drvdata(component); > - switch (event) { > - case SND_SOC_DAPM_POST_PMU: > - enable_and_reset_codec(sirf_audio_codec->regmap, > - PRIMA2_CODEC_ENABLE_BITS, PRIMA2_CODEC_RESET_BITS); > - break; > - case SND_SOC_DAPM_POST_PMD: > - regmap_update_bits(sirf_audio_codec->regmap, > - AUDIO_IC_CODEC_CTRL1, PRIMA2_CODEC_ENABLE_BITS, 0); > - break; > - default: > - break; > - } > - > - return 0; > -} > - > -static const struct snd_soc_dapm_widget atlas6_output_driver_dapm_widgets[] = { > - SND_SOC_DAPM_OUT_DRV("HP Left Driver", AUDIO_IC_CODEC_CTRL1, > - 25, 0, NULL, 0), > - SND_SOC_DAPM_OUT_DRV("HP Right Driver", AUDIO_IC_CODEC_CTRL1, > - 26, 0, NULL, 0), > - SND_SOC_DAPM_OUT_DRV("Speaker Driver", AUDIO_IC_CODEC_CTRL1, > - 27, 0, NULL, 0), > -}; > - > -static const struct snd_soc_dapm_widget prima2_output_driver_dapm_widgets[] = { > - SND_SOC_DAPM_OUT_DRV("HP Left Driver", AUDIO_IC_CODEC_CTRL1, > - 23, 0, NULL, 0), > - SND_SOC_DAPM_OUT_DRV("HP Right Driver", AUDIO_IC_CODEC_CTRL1, > - 24, 0, NULL, 0), > - SND_SOC_DAPM_OUT_DRV("Speaker Driver", AUDIO_IC_CODEC_CTRL1, > - 25, 0, NULL, 0), > -}; > - > -static const struct snd_soc_dapm_widget atlas6_codec_clock_dapm_widget = > - SND_SOC_DAPM_SUPPLY("codecclk", SND_SOC_NOPM, 0, 0, > - atlas6_codec_enable_and_reset_event, > - SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD); > - > -static const struct snd_soc_dapm_widget prima2_codec_clock_dapm_widget = > - SND_SOC_DAPM_SUPPLY("codecclk", SND_SOC_NOPM, 0, 0, > - prima2_codec_enable_and_reset_event, > - SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD); > - > -static const struct snd_soc_dapm_widget sirf_audio_codec_dapm_widgets[] = { > - SND_SOC_DAPM_DAC("DAC left", NULL, AUDIO_IC_CODEC_CTRL0, 1, 0), > - SND_SOC_DAPM_DAC("DAC right", NULL, AUDIO_IC_CODEC_CTRL0, 0, 0), > - SND_SOC_DAPM_SWITCH("Left dac to hp left amp", SND_SOC_NOPM, 0, 0, > - &left_dac_to_hp_left_amp_switch_control), > - SND_SOC_DAPM_SWITCH("Left dac to hp right amp", SND_SOC_NOPM, 0, 0, > - &left_dac_to_hp_right_amp_switch_control), > - SND_SOC_DAPM_SWITCH("Right dac to hp left amp", SND_SOC_NOPM, 0, 0, > - &right_dac_to_hp_left_amp_switch_control), > - SND_SOC_DAPM_SWITCH("Right dac to hp right amp", SND_SOC_NOPM, 0, 0, > - &right_dac_to_hp_right_amp_switch_control), > - SND_SOC_DAPM_OUT_DRV("HP amp left driver", AUDIO_IC_CODEC_CTRL0, 3, 0, > - NULL, 0), > - SND_SOC_DAPM_OUT_DRV("HP amp right driver", AUDIO_IC_CODEC_CTRL0, 3, 0, > - NULL, 0), > - > - SND_SOC_DAPM_SWITCH("Left dac to speaker lineout", SND_SOC_NOPM, 0, 0, > - &left_dac_to_speaker_lineout_switch_control), > - SND_SOC_DAPM_SWITCH("Right dac to speaker lineout", SND_SOC_NOPM, 0, 0, > - &right_dac_to_speaker_lineout_switch_control), > - SND_SOC_DAPM_OUT_DRV("Speaker amp driver", AUDIO_IC_CODEC_CTRL0, 4, 0, > - NULL, 0), > - > - SND_SOC_DAPM_OUTPUT("HPOUTL"), > - SND_SOC_DAPM_OUTPUT("HPOUTR"), > - SND_SOC_DAPM_OUTPUT("SPKOUT"), > - > - SND_SOC_DAPM_ADC_E("ADC left", NULL, AUDIO_IC_CODEC_CTRL1, 8, 0, > - adc_enable_delay_event, SND_SOC_DAPM_POST_PMU), > - SND_SOC_DAPM_ADC_E("ADC right", NULL, AUDIO_IC_CODEC_CTRL1, 7, 0, > - adc_enable_delay_event, SND_SOC_DAPM_POST_PMU), > - SND_SOC_DAPM_MIXER("Left PGA mixer", AUDIO_IC_CODEC_CTRL1, 1, 0, > - &left_input_path_controls[0], > - ARRAY_SIZE(left_input_path_controls)), > - SND_SOC_DAPM_MIXER("Right PGA mixer", AUDIO_IC_CODEC_CTRL1, 0, 0, > - &right_input_path_controls[0], > - ARRAY_SIZE(right_input_path_controls)), > - > - SND_SOC_DAPM_MUX("Mic input mode mux", SND_SOC_NOPM, 0, 0, > - &sirf_audio_codec_input_mode_control), > - SND_SOC_DAPM_MICBIAS("Mic Bias", AUDIO_IC_CODEC_PWR, 3, 0), > - SND_SOC_DAPM_INPUT("MICIN1"), > - SND_SOC_DAPM_INPUT("MICIN2"), > - SND_SOC_DAPM_INPUT("LINEIN1"), > - SND_SOC_DAPM_INPUT("LINEIN2"), > - > - SND_SOC_DAPM_SUPPLY("HSL Phase Opposite", AUDIO_IC_CODEC_CTRL0, > - 30, 0, NULL, 0), > -}; > - > -static const struct snd_soc_dapm_route sirf_audio_codec_map[] = { > - {"SPKOUT", NULL, "Speaker Driver"}, > - {"Speaker Driver", NULL, "Speaker amp driver"}, > - {"Speaker amp driver", NULL, "Left dac to speaker lineout"}, > - {"Speaker amp driver", NULL, "Right dac to speaker lineout"}, > - {"Left dac to speaker lineout", "Switch", "DAC left"}, > - {"Right dac to speaker lineout", "Switch", "DAC right"}, > - {"HPOUTL", NULL, "HP Left Driver"}, > - {"HPOUTR", NULL, "HP Right Driver"}, > - {"HP Left Driver", NULL, "HP amp left driver"}, > - {"HP Right Driver", NULL, "HP amp right driver"}, > - {"HP amp left driver", NULL, "Right dac to hp left amp"}, > - {"HP amp right driver", NULL , "Right dac to hp right amp"}, > - {"HP amp left driver", NULL, "Left dac to hp left amp"}, > - {"HP amp right driver", NULL , "Right dac to hp right amp"}, > - {"Right dac to hp left amp", "Switch", "DAC left"}, > - {"Right dac to hp right amp", "Switch", "DAC right"}, > - {"Left dac to hp left amp", "Switch", "DAC left"}, > - {"Left dac to hp right amp", "Switch", "DAC right"}, > - {"DAC left", NULL, "codecclk"}, > - {"DAC right", NULL, "codecclk"}, > - {"DAC left", NULL, "Playback"}, > - {"DAC right", NULL, "Playback"}, > - {"DAC left", NULL, "HSL Phase Opposite"}, > - {"DAC right", NULL, "HSL Phase Opposite"}, > - > - {"Capture", NULL, "ADC left"}, > - {"Capture", NULL, "ADC right"}, > - {"ADC left", NULL, "codecclk"}, > - {"ADC right", NULL, "codecclk"}, > - {"ADC left", NULL, "Left PGA mixer"}, > - {"ADC right", NULL, "Right PGA mixer"}, > - {"Left PGA mixer", "Line Left Switch", "LINEIN2"}, > - {"Right PGA mixer", "Line Right Switch", "LINEIN1"}, > - {"Left PGA mixer", "Mic Left Switch", "MICIN2"}, > - {"Right PGA mixer", "Mic Right Switch", "Mic input mode mux"}, > - {"Mic input mode mux", "Single-ended", "MICIN1"}, > - {"Mic input mode mux", "Differential", "MICIN1"}, > -}; > - > -static void sirf_audio_codec_tx_enable(struct sirf_audio_codec *sirf_audio_codec) > -{ > - regmap_update_bits(sirf_audio_codec->regmap, AUDIO_PORT_IC_TXFIFO_OP, > - AUDIO_FIFO_RESET, AUDIO_FIFO_RESET); > - regmap_update_bits(sirf_audio_codec->regmap, AUDIO_PORT_IC_TXFIFO_OP, > - AUDIO_FIFO_RESET, ~AUDIO_FIFO_RESET); > - regmap_write(sirf_audio_codec->regmap, AUDIO_PORT_IC_TXFIFO_INT_MSK, 0); > - regmap_write(sirf_audio_codec->regmap, AUDIO_PORT_IC_TXFIFO_OP, 0); > - regmap_update_bits(sirf_audio_codec->regmap, AUDIO_PORT_IC_TXFIFO_OP, > - AUDIO_FIFO_START, AUDIO_FIFO_START); > - regmap_update_bits(sirf_audio_codec->regmap, > - AUDIO_PORT_IC_CODEC_TX_CTRL, IC_TX_ENABLE, IC_TX_ENABLE); > -} > - > -static void sirf_audio_codec_tx_disable(struct sirf_audio_codec *sirf_audio_codec) > -{ > - regmap_write(sirf_audio_codec->regmap, AUDIO_PORT_IC_TXFIFO_OP, 0); > - regmap_update_bits(sirf_audio_codec->regmap, > - AUDIO_PORT_IC_CODEC_TX_CTRL, IC_TX_ENABLE, ~IC_TX_ENABLE); > -} > - > -static void sirf_audio_codec_rx_enable(struct sirf_audio_codec *sirf_audio_codec, > - int channels) > -{ > - regmap_update_bits(sirf_audio_codec->regmap, AUDIO_PORT_IC_RXFIFO_OP, > - AUDIO_FIFO_RESET, AUDIO_FIFO_RESET); > - regmap_update_bits(sirf_audio_codec->regmap, AUDIO_PORT_IC_RXFIFO_OP, > - AUDIO_FIFO_RESET, ~AUDIO_FIFO_RESET); > - regmap_write(sirf_audio_codec->regmap, > - AUDIO_PORT_IC_RXFIFO_INT_MSK, 0); > - regmap_write(sirf_audio_codec->regmap, AUDIO_PORT_IC_RXFIFO_OP, 0); > - regmap_update_bits(sirf_audio_codec->regmap, AUDIO_PORT_IC_RXFIFO_OP, > - AUDIO_FIFO_START, AUDIO_FIFO_START); > - if (channels == 1) > - regmap_update_bits(sirf_audio_codec->regmap, > - AUDIO_PORT_IC_CODEC_RX_CTRL, > - IC_RX_ENABLE_MONO, IC_RX_ENABLE_MONO); > - else > - regmap_update_bits(sirf_audio_codec->regmap, > - AUDIO_PORT_IC_CODEC_RX_CTRL, > - IC_RX_ENABLE_STEREO, IC_RX_ENABLE_STEREO); > -} > - > -static void sirf_audio_codec_rx_disable(struct sirf_audio_codec *sirf_audio_codec) > -{ > - regmap_update_bits(sirf_audio_codec->regmap, > - AUDIO_PORT_IC_CODEC_RX_CTRL, > - IC_RX_ENABLE_STEREO, ~IC_RX_ENABLE_STEREO); > -} > - > -static int sirf_audio_codec_trigger(struct snd_pcm_substream *substream, > - int cmd, > - struct snd_soc_dai *dai) > -{ > - struct snd_soc_component *component = dai->component; > - struct sirf_audio_codec *sirf_audio_codec = snd_soc_component_get_drvdata(component); > - int playback = substream->stream == SNDRV_PCM_STREAM_PLAYBACK; > - > - /* > - * This is a workaround, When stop playback, > - * need disable HP amp, avoid the current noise. > - */ > - switch (cmd) { > - case SNDRV_PCM_TRIGGER_STOP: > - case SNDRV_PCM_TRIGGER_SUSPEND: > - case SNDRV_PCM_TRIGGER_PAUSE_PUSH: > - if (playback) { > - snd_soc_component_update_bits(component, AUDIO_IC_CODEC_CTRL0, > - IC_HSLEN | IC_HSREN, 0); > - sirf_audio_codec_tx_disable(sirf_audio_codec); > - } else > - sirf_audio_codec_rx_disable(sirf_audio_codec); > - break; > - case SNDRV_PCM_TRIGGER_START: > - case SNDRV_PCM_TRIGGER_RESUME: > - case SNDRV_PCM_TRIGGER_PAUSE_RELEASE: > - if (playback) { > - sirf_audio_codec_tx_enable(sirf_audio_codec); > - snd_soc_component_update_bits(component, AUDIO_IC_CODEC_CTRL0, > - IC_HSLEN | IC_HSREN, IC_HSLEN | IC_HSREN); > - } else > - sirf_audio_codec_rx_enable(sirf_audio_codec, > - substream->runtime->channels); > - break; > - default: > - return -EINVAL; > - } > - > - return 0; > -} > - > -static const struct snd_soc_dai_ops sirf_audio_codec_dai_ops = { > - .trigger = sirf_audio_codec_trigger, > -}; > - > -static struct snd_soc_dai_driver sirf_audio_codec_dai = { > - .name = "sirf-audio-codec", > - .playback = { > - .stream_name = "Playback", > - .channels_min = 2, > - .channels_max = 2, > - .rates = SNDRV_PCM_RATE_48000, > - .formats = SNDRV_PCM_FMTBIT_S16_LE, > - }, > - .capture = { > - .stream_name = "Capture", > - .channels_min = 1, > - .channels_max = 2, > - .rates = SNDRV_PCM_RATE_48000, > - .formats = SNDRV_PCM_FMTBIT_S16_LE, > - }, > - .ops = &sirf_audio_codec_dai_ops, > -}; > - > -static int sirf_audio_codec_probe(struct snd_soc_component *component) > -{ > - struct snd_soc_dapm_context *dapm = snd_soc_component_get_dapm(component); > - > - pm_runtime_enable(component->dev); > - > - if (of_device_is_compatible(component->dev->of_node, "sirf,prima2-audio-codec")) { > - snd_soc_dapm_new_controls(dapm, > - prima2_output_driver_dapm_widgets, > - ARRAY_SIZE(prima2_output_driver_dapm_widgets)); > - snd_soc_dapm_new_controls(dapm, > - &prima2_codec_clock_dapm_widget, 1); > - return snd_soc_add_component_controls(component, > - volume_controls_prima2, > - ARRAY_SIZE(volume_controls_prima2)); > - } > - if (of_device_is_compatible(component->dev->of_node, "sirf,atlas6-audio-codec")) { > - snd_soc_dapm_new_controls(dapm, > - atlas6_output_driver_dapm_widgets, > - ARRAY_SIZE(atlas6_output_driver_dapm_widgets)); > - snd_soc_dapm_new_controls(dapm, > - &atlas6_codec_clock_dapm_widget, 1); > - return snd_soc_add_component_controls(component, > - volume_controls_atlas6, > - ARRAY_SIZE(volume_controls_atlas6)); > - } > - > - return -EINVAL; > -} > - > -static void sirf_audio_codec_remove(struct snd_soc_component *component) > -{ > - pm_runtime_disable(component->dev); > -} > - > -static const struct snd_soc_component_driver soc_codec_device_sirf_audio_codec = { > - .probe = sirf_audio_codec_probe, > - .remove = sirf_audio_codec_remove, > - .dapm_widgets = sirf_audio_codec_dapm_widgets, > - .num_dapm_widgets = ARRAY_SIZE(sirf_audio_codec_dapm_widgets), > - .dapm_routes = sirf_audio_codec_map, > - .num_dapm_routes = ARRAY_SIZE(sirf_audio_codec_map), > - .use_pmdown_time = 1, > - .endianness = 1, > - .non_legacy_dai_naming = 1, > -}; > - > -static const struct of_device_id sirf_audio_codec_of_match[] = { > - { .compatible = "sirf,prima2-audio-codec" }, > - { .compatible = "sirf,atlas6-audio-codec" }, > - {} > -}; > -MODULE_DEVICE_TABLE(of, sirf_audio_codec_of_match); > - > -static const struct regmap_config sirf_audio_codec_regmap_config = { > - .reg_bits = 32, > - .reg_stride = 4, > - .val_bits = 32, > - .max_register = AUDIO_PORT_IC_RXFIFO_INT_MSK, > - .cache_type = REGCACHE_NONE, > -}; > - > -static int sirf_audio_codec_driver_probe(struct platform_device *pdev) > -{ > - int ret; > - struct sirf_audio_codec *sirf_audio_codec; > - void __iomem *base; > - > - sirf_audio_codec = devm_kzalloc(&pdev->dev, > - sizeof(struct sirf_audio_codec), GFP_KERNEL); > - if (!sirf_audio_codec) > - return -ENOMEM; > - > - platform_set_drvdata(pdev, sirf_audio_codec); > - > - base = devm_platform_ioremap_resource(pdev, 0); > - if (IS_ERR(base)) > - return PTR_ERR(base); > - > - sirf_audio_codec->regmap = devm_regmap_init_mmio(&pdev->dev, base, > - &sirf_audio_codec_regmap_config); > - if (IS_ERR(sirf_audio_codec->regmap)) > - return PTR_ERR(sirf_audio_codec->regmap); > - > - sirf_audio_codec->clk = devm_clk_get(&pdev->dev, NULL); > - if (IS_ERR(sirf_audio_codec->clk)) { > - dev_err(&pdev->dev, "Get clock failed.\n"); > - return PTR_ERR(sirf_audio_codec->clk); > - } > - > - ret = clk_prepare_enable(sirf_audio_codec->clk); > - if (ret) { > - dev_err(&pdev->dev, "Enable clock failed.\n"); > - return ret; > - } > - > - ret = devm_snd_soc_register_component(&(pdev->dev), > - &soc_codec_device_sirf_audio_codec, > - &sirf_audio_codec_dai, 1); > - if (ret) { > - dev_err(&pdev->dev, "Register Audio Codec dai failed.\n"); > - goto err_clk_put; > - } > - > - /* > - * Always open charge pump, if not, when the charge pump closed the > - * adc will not stable > - */ > - regmap_update_bits(sirf_audio_codec->regmap, AUDIO_IC_CODEC_CTRL0, > - IC_CPFREQ, IC_CPFREQ); > - > - if (of_device_is_compatible(pdev->dev.of_node, "sirf,atlas6-audio-codec")) > - regmap_update_bits(sirf_audio_codec->regmap, > - AUDIO_IC_CODEC_CTRL0, IC_CPEN, IC_CPEN); > - return 0; > - > -err_clk_put: > - clk_disable_unprepare(sirf_audio_codec->clk); > - return ret; > -} > - > -static int sirf_audio_codec_driver_remove(struct platform_device *pdev) > -{ > - struct sirf_audio_codec *sirf_audio_codec = platform_get_drvdata(pdev); > - > - clk_disable_unprepare(sirf_audio_codec->clk); > - > - return 0; > -} > - > -#ifdef CONFIG_PM_SLEEP > -static int sirf_audio_codec_suspend(struct device *dev) > -{ > - struct sirf_audio_codec *sirf_audio_codec = dev_get_drvdata(dev); > - > - regmap_read(sirf_audio_codec->regmap, AUDIO_IC_CODEC_CTRL0, > - &sirf_audio_codec->reg_ctrl0); > - regmap_read(sirf_audio_codec->regmap, AUDIO_IC_CODEC_CTRL1, > - &sirf_audio_codec->reg_ctrl1); > - clk_disable_unprepare(sirf_audio_codec->clk); > - > - return 0; > -} > - > -static int sirf_audio_codec_resume(struct device *dev) > -{ > - struct sirf_audio_codec *sirf_audio_codec = dev_get_drvdata(dev); > - int ret; > - > - ret = clk_prepare_enable(sirf_audio_codec->clk); > - if (ret) > - return ret; > - > - regmap_write(sirf_audio_codec->regmap, AUDIO_IC_CODEC_CTRL0, > - sirf_audio_codec->reg_ctrl0); > - regmap_write(sirf_audio_codec->regmap, AUDIO_IC_CODEC_CTRL1, > - sirf_audio_codec->reg_ctrl1); > - > - return 0; > -} > -#endif > - > -static const struct dev_pm_ops sirf_audio_codec_pm_ops = { > - SET_SYSTEM_SLEEP_PM_OPS(sirf_audio_codec_suspend, sirf_audio_codec_resume) > -}; > - > -static struct platform_driver sirf_audio_codec_driver = { > - .driver = { > - .name = "sirf-audio-codec", > - .of_match_table = sirf_audio_codec_of_match, > - .pm = &sirf_audio_codec_pm_ops, > - }, > - .probe = sirf_audio_codec_driver_probe, > - .remove = sirf_audio_codec_driver_remove, > -}; > - > -module_platform_driver(sirf_audio_codec_driver); > - > -MODULE_DESCRIPTION("SiRF audio codec driver"); > -MODULE_AUTHOR("RongJun Ying "); > -MODULE_LICENSE("GPL v2"); > diff --git a/sound/soc/sirf/Kconfig b/sound/soc/sirf/Kconfig > deleted file mode 100644 > index 094a1c89c59d..000000000000 > --- a/sound/soc/sirf/Kconfig > +++ /dev/null > @@ -1,21 +0,0 @@ > -# SPDX-License-Identifier: GPL-2.0-only > -config SND_SOC_SIRF > - tristate "SoC Audio for the SiRF SoC chips" > - depends on ARCH_SIRF || COMPILE_TEST > - select SND_SOC_GENERIC_DMAENGINE_PCM > - > -config SND_SOC_SIRF_AUDIO > - tristate "SoC Audio support for SiRF internal audio codec" > - depends on SND_SOC_SIRF > - select SND_SOC_SIRF_AUDIO_CODEC > - select SND_SOC_SIRF_AUDIO_PORT > - > -config SND_SOC_SIRF_AUDIO_PORT > - select REGMAP_MMIO > - tristate > - > -config SND_SOC_SIRF_USP > - tristate "SoC Audio (I2S protocol) for SiRF SoC USP interface" > - depends on SND_SOC_SIRF > - select REGMAP_MMIO > - tristate > diff --git a/sound/soc/sirf/Makefile b/sound/soc/sirf/Makefile > deleted file mode 100644 > index 16ed11965ff9..000000000000 > --- a/sound/soc/sirf/Makefile > +++ /dev/null > @@ -1,8 +0,0 @@ > -# SPDX-License-Identifier: GPL-2.0 > -snd-soc-sirf-audio-objs := sirf-audio.o > -snd-soc-sirf-audio-port-objs := sirf-audio-port.o > -snd-soc-sirf-usp-objs := sirf-usp.o > - > -obj-$(CONFIG_SND_SOC_SIRF_AUDIO) += snd-soc-sirf-audio.o > -obj-$(CONFIG_SND_SOC_SIRF_AUDIO_PORT) += snd-soc-sirf-audio-port.o > -obj-$(CONFIG_SND_SOC_SIRF_USP) += snd-soc-sirf-usp.o > diff --git a/sound/soc/sirf/sirf-audio-port.c b/sound/soc/sirf/sirf-audio-port.c > deleted file mode 100644 > index 8be2f0bc477b..000000000000 > --- a/sound/soc/sirf/sirf-audio-port.c > +++ /dev/null > @@ -1,86 +0,0 @@ > -// SPDX-License-Identifier: GPL-2.0-or-later > -/* > - * SiRF Audio port driver > - * > - * Copyright (c) 2011 Cambridge Silicon Radio Limited, a CSR plc group company. > - */ > -#include > -#include > -#include > - > -struct sirf_audio_port { > - struct regmap *regmap; > - struct snd_dmaengine_dai_dma_data playback_dma_data; > - struct snd_dmaengine_dai_dma_data capture_dma_data; > -}; > - > - > -static int sirf_audio_port_dai_probe(struct snd_soc_dai *dai) > -{ > - struct sirf_audio_port *port = snd_soc_dai_get_drvdata(dai); > - > - snd_soc_dai_init_dma_data(dai, &port->playback_dma_data, > - &port->capture_dma_data); > - return 0; > -} > - > -static struct snd_soc_dai_driver sirf_audio_port_dai = { > - .probe = sirf_audio_port_dai_probe, > - .name = "sirf-audio-port", > - .id = 0, > - .playback = { > - .channels_min = 2, > - .channels_max = 2, > - .rates = SNDRV_PCM_RATE_48000, > - .formats = SNDRV_PCM_FMTBIT_S16_LE, > - }, > - .capture = { > - .channels_min = 1, > - .channels_max = 2, > - .rates = SNDRV_PCM_RATE_48000, > - .formats = SNDRV_PCM_FMTBIT_S16_LE, > - }, > -}; > - > -static const struct snd_soc_component_driver sirf_audio_port_component = { > - .name = "sirf-audio-port", > -}; > - > -static int sirf_audio_port_probe(struct platform_device *pdev) > -{ > - int ret; > - struct sirf_audio_port *port; > - > - port = devm_kzalloc(&pdev->dev, > - sizeof(struct sirf_audio_port), GFP_KERNEL); > - if (!port) > - return -ENOMEM; > - > - ret = devm_snd_soc_register_component(&pdev->dev, > - &sirf_audio_port_component, &sirf_audio_port_dai, 1); > - if (ret) > - return ret; > - > - platform_set_drvdata(pdev, port); > - return devm_snd_dmaengine_pcm_register(&pdev->dev, NULL, 0); > -} > - > -static const struct of_device_id sirf_audio_port_of_match[] = { > - { .compatible = "sirf,audio-port", }, > - {} > -}; > -MODULE_DEVICE_TABLE(of, sirf_audio_port_of_match); > - > -static struct platform_driver sirf_audio_port_driver = { > - .driver = { > - .name = "sirf-audio-port", > - .of_match_table = sirf_audio_port_of_match, > - }, > - .probe = sirf_audio_port_probe, > -}; > - > -module_platform_driver(sirf_audio_port_driver); > - > -MODULE_DESCRIPTION("SiRF Audio Port driver"); > -MODULE_AUTHOR("RongJun Ying "); > -MODULE_LICENSE("GPL v2"); > diff --git a/sound/soc/sirf/sirf-audio.c b/sound/soc/sirf/sirf-audio.c > deleted file mode 100644 > index c923b6772b22..000000000000 > --- a/sound/soc/sirf/sirf-audio.c > +++ /dev/null > @@ -1,160 +0,0 @@ > -// SPDX-License-Identifier: GPL-2.0-or-later > -/* > - * SiRF audio card driver > - * > - * Copyright (c) 2011 Cambridge Silicon Radio Limited, a CSR plc group company. > - */ > - > -#include > -#include > -#include > -#include > -#include > -#include > -#include > -#include > - > -struct sirf_audio_card { > - unsigned int gpio_hp_pa; > - unsigned int gpio_spk_pa; > -}; > - > -static int sirf_audio_hp_event(struct snd_soc_dapm_widget *w, > - struct snd_kcontrol *ctrl, int event) > -{ > - struct snd_soc_dapm_context *dapm = w->dapm; > - struct snd_soc_card *card = dapm->card; > - struct sirf_audio_card *sirf_audio_card = snd_soc_card_get_drvdata(card); > - int on = !SND_SOC_DAPM_EVENT_OFF(event); > - > - if (gpio_is_valid(sirf_audio_card->gpio_hp_pa)) > - gpio_set_value(sirf_audio_card->gpio_hp_pa, on); > - return 0; > -} > - > -static int sirf_audio_spk_event(struct snd_soc_dapm_widget *w, > - struct snd_kcontrol *ctrl, int event) > -{ > - struct snd_soc_dapm_context *dapm = w->dapm; > - struct snd_soc_card *card = dapm->card; > - struct sirf_audio_card *sirf_audio_card = snd_soc_card_get_drvdata(card); > - int on = !SND_SOC_DAPM_EVENT_OFF(event); > - > - if (gpio_is_valid(sirf_audio_card->gpio_spk_pa)) > - gpio_set_value(sirf_audio_card->gpio_spk_pa, on); > - > - return 0; > -} > -static const struct snd_soc_dapm_widget sirf_audio_dapm_widgets[] = { > - SND_SOC_DAPM_HP("Hp", sirf_audio_hp_event), > - SND_SOC_DAPM_SPK("Ext Spk", sirf_audio_spk_event), > - SND_SOC_DAPM_MIC("Ext Mic", NULL), > -}; > - > -static const struct snd_soc_dapm_route intercon[] = { > - {"Hp", NULL, "HPOUTL"}, > - {"Hp", NULL, "HPOUTR"}, > - {"Ext Spk", NULL, "SPKOUT"}, > - {"MICIN1", NULL, "Mic Bias"}, > - {"Mic Bias", NULL, "Ext Mic"}, > -}; > - > -/* Digital audio interface glue - connects codec <--> CPU */ > -SND_SOC_DAILINK_DEFS(sirf, > - DAILINK_COMP_ARRAY(COMP_EMPTY()), > - DAILINK_COMP_ARRAY(COMP_CODEC(NULL, "sirf-audio-codec")), > - DAILINK_COMP_ARRAY(COMP_EMPTY())); > - > -static struct snd_soc_dai_link sirf_audio_dai_link[] = { > - { > - .name = "SiRF audio card", > - .stream_name = "SiRF audio HiFi", > - SND_SOC_DAILINK_REG(sirf), > - }, > -}; > - > -/* Audio machine driver */ > -static struct snd_soc_card snd_soc_sirf_audio_card = { > - .name = "SiRF audio card", > - .owner = THIS_MODULE, > - .dai_link = sirf_audio_dai_link, > - .num_links = ARRAY_SIZE(sirf_audio_dai_link), > - .dapm_widgets = sirf_audio_dapm_widgets, > - .num_dapm_widgets = ARRAY_SIZE(sirf_audio_dapm_widgets), > - .dapm_routes = intercon, > - .num_dapm_routes = ARRAY_SIZE(intercon), > -}; > - > -static int sirf_audio_probe(struct platform_device *pdev) > -{ > - struct snd_soc_card *card = &snd_soc_sirf_audio_card; > - struct sirf_audio_card *sirf_audio_card; > - int ret; > - > - sirf_audio_card = devm_kzalloc(&pdev->dev, sizeof(struct sirf_audio_card), > - GFP_KERNEL); > - if (sirf_audio_card == NULL) > - return -ENOMEM; > - > - sirf_audio_dai_link[0].cpus->of_node = > - of_parse_phandle(pdev->dev.of_node, "sirf,audio-platform", 0); > - sirf_audio_dai_link[0].platforms->of_node = > - of_parse_phandle(pdev->dev.of_node, "sirf,audio-platform", 0); > - sirf_audio_dai_link[0].codecs->of_node = > - of_parse_phandle(pdev->dev.of_node, "sirf,audio-codec", 0); > - sirf_audio_card->gpio_spk_pa = of_get_named_gpio(pdev->dev.of_node, > - "spk-pa-gpios", 0); > - sirf_audio_card->gpio_hp_pa = of_get_named_gpio(pdev->dev.of_node, > - "hp-pa-gpios", 0); > - if (gpio_is_valid(sirf_audio_card->gpio_spk_pa)) { > - ret = devm_gpio_request_one(&pdev->dev, > - sirf_audio_card->gpio_spk_pa, > - GPIOF_OUT_INIT_LOW, "SPA_PA_SD"); > - if (ret) { > - dev_err(&pdev->dev, > - "Failed to request GPIO_%d for reset: %d\n", > - sirf_audio_card->gpio_spk_pa, ret); > - return ret; > - } > - } > - if (gpio_is_valid(sirf_audio_card->gpio_hp_pa)) { > - ret = devm_gpio_request_one(&pdev->dev, > - sirf_audio_card->gpio_hp_pa, > - GPIOF_OUT_INIT_LOW, "HP_PA_SD"); > - if (ret) { > - dev_err(&pdev->dev, > - "Failed to request GPIO_%d for reset: %d\n", > - sirf_audio_card->gpio_hp_pa, ret); > - return ret; > - } > - } > - > - card->dev = &pdev->dev; > - snd_soc_card_set_drvdata(card, sirf_audio_card); > - > - ret = devm_snd_soc_register_card(&pdev->dev, card); > - if (ret) > - dev_err(&pdev->dev, "snd_soc_register_card() failed:%d\n", ret); > - > - return ret; > -} > - > -static const struct of_device_id sirf_audio_of_match[] = { > - {.compatible = "sirf,sirf-audio-card", }, > - { }, > -}; > -MODULE_DEVICE_TABLE(of, sirf_audio_of_match); > - > -static struct platform_driver sirf_audio_driver = { > - .driver = { > - .name = "sirf-audio-card", > - .pm = &snd_soc_pm_ops, > - .of_match_table = sirf_audio_of_match, > - }, > - .probe = sirf_audio_probe, > -}; > -module_platform_driver(sirf_audio_driver); > - > -MODULE_AUTHOR("RongJun Ying "); > -MODULE_DESCRIPTION("ALSA SoC SIRF audio card driver"); > -MODULE_LICENSE("GPL v2"); > diff --git a/sound/soc/sirf/sirf-usp.c b/sound/soc/sirf/sirf-usp.c > deleted file mode 100644 > index 2af0c6f14ee6..000000000000 > --- a/sound/soc/sirf/sirf-usp.c > +++ /dev/null > @@ -1,435 +0,0 @@ > -// SPDX-License-Identifier: GPL-2.0-or-later > -/* > - * SiRF USP in I2S/DSP mode > - * > - * Copyright (c) 2011 Cambridge Silicon Radio Limited, a CSR plc group company. > - */ > -#include > -#include > -#include > -#include > -#include > -#include > -#include > -#include > - > -#include "sirf-usp.h" > - > -struct sirf_usp { > - struct regmap *regmap; > - struct clk *clk; > - u32 mode1_reg; > - u32 mode2_reg; > - int daifmt_format; > - struct snd_dmaengine_dai_dma_data playback_dma_data; > - struct snd_dmaengine_dai_dma_data capture_dma_data; > -}; > - > -static void sirf_usp_tx_enable(struct sirf_usp *usp) > -{ > - regmap_update_bits(usp->regmap, USP_TX_FIFO_OP, > - USP_TX_FIFO_RESET, USP_TX_FIFO_RESET); > - regmap_write(usp->regmap, USP_TX_FIFO_OP, 0); > - > - regmap_update_bits(usp->regmap, USP_TX_FIFO_OP, > - USP_TX_FIFO_START, USP_TX_FIFO_START); > - > - regmap_update_bits(usp->regmap, USP_TX_RX_ENABLE, > - USP_TX_ENA, USP_TX_ENA); > -} > - > -static void sirf_usp_tx_disable(struct sirf_usp *usp) > -{ > - regmap_update_bits(usp->regmap, USP_TX_RX_ENABLE, > - USP_TX_ENA, ~USP_TX_ENA); > - /* FIFO stop */ > - regmap_write(usp->regmap, USP_TX_FIFO_OP, 0); > -} > - > -static void sirf_usp_rx_enable(struct sirf_usp *usp) > -{ > - regmap_update_bits(usp->regmap, USP_RX_FIFO_OP, > - USP_RX_FIFO_RESET, USP_RX_FIFO_RESET); > - regmap_write(usp->regmap, USP_RX_FIFO_OP, 0); > - > - regmap_update_bits(usp->regmap, USP_RX_FIFO_OP, > - USP_RX_FIFO_START, USP_RX_FIFO_START); > - > - regmap_update_bits(usp->regmap, USP_TX_RX_ENABLE, > - USP_RX_ENA, USP_RX_ENA); > -} > - > -static void sirf_usp_rx_disable(struct sirf_usp *usp) > -{ > - regmap_update_bits(usp->regmap, USP_TX_RX_ENABLE, > - USP_RX_ENA, ~USP_RX_ENA); > - /* FIFO stop */ > - regmap_write(usp->regmap, USP_RX_FIFO_OP, 0); > -} > - > -static int sirf_usp_pcm_dai_probe(struct snd_soc_dai *dai) > -{ > - struct sirf_usp *usp = snd_soc_dai_get_drvdata(dai); > - > - snd_soc_dai_init_dma_data(dai, &usp->playback_dma_data, > - &usp->capture_dma_data); > - return 0; > -} > - > -static int sirf_usp_pcm_set_dai_fmt(struct snd_soc_dai *dai, > - unsigned int fmt) > -{ > - struct sirf_usp *usp = snd_soc_dai_get_drvdata(dai); > - > - /* set master/slave audio interface */ > - switch (fmt & SND_SOC_DAIFMT_MASTER_MASK) { > - case SND_SOC_DAIFMT_CBM_CFM: > - break; > - default: > - dev_err(dai->dev, "Only CBM and CFM supported\n"); > - return -EINVAL; > - } > - > - switch (fmt & SND_SOC_DAIFMT_FORMAT_MASK) { > - case SND_SOC_DAIFMT_I2S: > - case SND_SOC_DAIFMT_DSP_A: > - usp->daifmt_format = (fmt & SND_SOC_DAIFMT_FORMAT_MASK); > - break; > - default: > - dev_err(dai->dev, "Only I2S and DSP_A format supported\n"); > - return -EINVAL; > - } > - > - switch (fmt & SND_SOC_DAIFMT_INV_MASK) { > - case SND_SOC_DAIFMT_NB_NF: > - break; > - case SND_SOC_DAIFMT_IB_NF: > - usp->daifmt_format |= (fmt & SND_SOC_DAIFMT_INV_MASK); > - break; > - default: > - return -EINVAL; > - } > - > - return 0; > -} > - > -static void sirf_usp_i2s_init(struct sirf_usp *usp) > -{ > - /* Configure RISC mode */ > - regmap_update_bits(usp->regmap, USP_RISC_DSP_MODE, > - USP_RISC_DSP_SEL, ~USP_RISC_DSP_SEL); > - > - /* > - * Configure DMA IO Length register > - * Set no limit, USP can receive data continuously until it is diabled > - */ > - regmap_write(usp->regmap, USP_TX_DMA_IO_LEN, 0); > - regmap_write(usp->regmap, USP_RX_DMA_IO_LEN, 0); > - > - /* Configure Mode2 register */ > - regmap_write(usp->regmap, USP_MODE2, (1 << USP_RXD_DELAY_LEN_OFFSET) | > - (0 << USP_TXD_DELAY_LEN_OFFSET) | > - USP_TFS_CLK_SLAVE_MODE | USP_RFS_CLK_SLAVE_MODE); > - > - /* Configure Mode1 register */ > - regmap_write(usp->regmap, USP_MODE1, > - USP_SYNC_MODE | USP_EN | USP_TXD_ACT_EDGE_FALLING | > - USP_RFS_ACT_LEVEL_LOGIC1 | USP_TFS_ACT_LEVEL_LOGIC1 | > - USP_TX_UFLOW_REPEAT_ZERO | USP_CLOCK_MODE_SLAVE); > - > - /* Configure RX DMA IO Control register */ > - regmap_write(usp->regmap, USP_RX_DMA_IO_CTRL, 0); > - > - /* Congiure RX FIFO Control register */ > - regmap_write(usp->regmap, USP_RX_FIFO_CTRL, > - (USP_RX_FIFO_THRESHOLD << USP_RX_FIFO_THD_OFFSET) | > - (USP_TX_RX_FIFO_WIDTH_DWORD << USP_RX_FIFO_WIDTH_OFFSET)); > - > - /* Congiure RX FIFO Level Check register */ > - regmap_write(usp->regmap, USP_RX_FIFO_LEVEL_CHK, > - RX_FIFO_SC(0x04) | RX_FIFO_LC(0x0E) | RX_FIFO_HC(0x1B)); > - > - /* Configure TX DMA IO Control register*/ > - regmap_write(usp->regmap, USP_TX_DMA_IO_CTRL, 0); > - > - /* Configure TX FIFO Control register */ > - regmap_write(usp->regmap, USP_TX_FIFO_CTRL, > - (USP_TX_FIFO_THRESHOLD << USP_TX_FIFO_THD_OFFSET) | > - (USP_TX_RX_FIFO_WIDTH_DWORD << USP_TX_FIFO_WIDTH_OFFSET)); > - /* Congiure TX FIFO Level Check register */ > - regmap_write(usp->regmap, USP_TX_FIFO_LEVEL_CHK, > - TX_FIFO_SC(0x1B) | TX_FIFO_LC(0x0E) | TX_FIFO_HC(0x04)); > -} > - > -static int sirf_usp_pcm_hw_params(struct snd_pcm_substream *substream, > - struct snd_pcm_hw_params *params, struct snd_soc_dai *dai) > -{ > - struct sirf_usp *usp = snd_soc_dai_get_drvdata(dai); > - u32 data_len, frame_len, shifter_len; > - > - switch (params_format(params)) { > - case SNDRV_PCM_FORMAT_S16_LE: > - data_len = 16; > - frame_len = 16; > - break; > - case SNDRV_PCM_FORMAT_S24_LE: > - data_len = 24; > - frame_len = 32; > - break; > - case SNDRV_PCM_FORMAT_S24_3LE: > - data_len = 24; > - frame_len = 24; > - break; > - default: > - dev_err(dai->dev, "Format unsupported\n"); > - return -EINVAL; > - } > - > - shifter_len = data_len; > - > - switch (usp->daifmt_format & SND_SOC_DAIFMT_FORMAT_MASK) { > - case SND_SOC_DAIFMT_I2S: > - regmap_update_bits(usp->regmap, USP_RX_FRAME_CTRL, > - USP_I2S_SYNC_CHG, USP_I2S_SYNC_CHG); > - break; > - case SND_SOC_DAIFMT_DSP_A: > - regmap_update_bits(usp->regmap, USP_RX_FRAME_CTRL, > - USP_I2S_SYNC_CHG, 0); > - frame_len = data_len * params_channels(params); > - data_len = frame_len; > - break; > - default: > - dev_err(dai->dev, "Only support I2S and DSP_A mode\n"); > - return -EINVAL; > - } > - > - switch (usp->daifmt_format & SND_SOC_DAIFMT_INV_MASK) { > - case SND_SOC_DAIFMT_NB_NF: > - break; > - case SND_SOC_DAIFMT_IB_NF: > - regmap_update_bits(usp->regmap, USP_MODE1, > - USP_RXD_ACT_EDGE_FALLING | USP_TXD_ACT_EDGE_FALLING, > - USP_RXD_ACT_EDGE_FALLING); > - break; > - default: > - return -EINVAL; > - } > - > - if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) > - regmap_update_bits(usp->regmap, USP_TX_FRAME_CTRL, > - USP_TXC_DATA_LEN_MASK | USP_TXC_FRAME_LEN_MASK > - | USP_TXC_SHIFTER_LEN_MASK | USP_TXC_SLAVE_CLK_SAMPLE, > - ((data_len - 1) << USP_TXC_DATA_LEN_OFFSET) > - | ((frame_len - 1) << USP_TXC_FRAME_LEN_OFFSET) > - | ((shifter_len - 1) << USP_TXC_SHIFTER_LEN_OFFSET) > - | USP_TXC_SLAVE_CLK_SAMPLE); > - else > - regmap_update_bits(usp->regmap, USP_RX_FRAME_CTRL, > - USP_RXC_DATA_LEN_MASK | USP_RXC_FRAME_LEN_MASK > - | USP_RXC_SHIFTER_LEN_MASK | USP_SINGLE_SYNC_MODE, > - ((data_len - 1) << USP_RXC_DATA_LEN_OFFSET) > - | ((frame_len - 1) << USP_RXC_FRAME_LEN_OFFSET) > - | ((shifter_len - 1) << USP_RXC_SHIFTER_LEN_OFFSET) > - | USP_SINGLE_SYNC_MODE); > - > - return 0; > -} > - > -static int sirf_usp_pcm_trigger(struct snd_pcm_substream *substream, int cmd, > - struct snd_soc_dai *dai) > -{ > - struct sirf_usp *usp = snd_soc_dai_get_drvdata(dai); > - > - switch (cmd) { > - case SNDRV_PCM_TRIGGER_START: > - case SNDRV_PCM_TRIGGER_RESUME: > - case SNDRV_PCM_TRIGGER_PAUSE_RELEASE: > - if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) > - sirf_usp_tx_enable(usp); > - else > - sirf_usp_rx_enable(usp); > - break; > - case SNDRV_PCM_TRIGGER_STOP: > - case SNDRV_PCM_TRIGGER_SUSPEND: > - case SNDRV_PCM_TRIGGER_PAUSE_PUSH: > - if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) > - sirf_usp_tx_disable(usp); > - else > - sirf_usp_rx_disable(usp); > - break; > - } > - > - return 0; > -} > - > -static const struct snd_soc_dai_ops sirf_usp_pcm_dai_ops = { > - .trigger = sirf_usp_pcm_trigger, > - .set_fmt = sirf_usp_pcm_set_dai_fmt, > - .hw_params = sirf_usp_pcm_hw_params, > -}; > - > -static struct snd_soc_dai_driver sirf_usp_pcm_dai = { > - .probe = sirf_usp_pcm_dai_probe, > - .name = "sirf-usp-pcm", > - .id = 0, > - .playback = { > - .stream_name = "SiRF USP PCM Playback", > - .channels_min = 1, > - .channels_max = 2, > - .rates = SNDRV_PCM_RATE_8000_192000, > - .formats = SNDRV_PCM_FMTBIT_S16_LE | SNDRV_PCM_FMTBIT_S24_LE | > - SNDRV_PCM_FMTBIT_S24_3LE, > - }, > - .capture = { > - .stream_name = "SiRF USP PCM Capture", > - .channels_min = 1, > - .channels_max = 2, > - .rates = SNDRV_PCM_RATE_8000_192000, > - .formats = SNDRV_PCM_FMTBIT_S16_LE | SNDRV_PCM_FMTBIT_S24_LE | > - SNDRV_PCM_FMTBIT_S24_3LE, > - }, > - .ops = &sirf_usp_pcm_dai_ops, > -}; > - > -static int sirf_usp_pcm_runtime_suspend(struct device *dev) > -{ > - struct sirf_usp *usp = dev_get_drvdata(dev); > - > - clk_disable_unprepare(usp->clk); > - return 0; > -} > - > -static int sirf_usp_pcm_runtime_resume(struct device *dev) > -{ > - struct sirf_usp *usp = dev_get_drvdata(dev); > - int ret; > - > - ret = clk_prepare_enable(usp->clk); > - if (ret) { > - dev_err(dev, "clk_enable failed: %d\n", ret); > - return ret; > - } > - sirf_usp_i2s_init(usp); > - return 0; > -} > - > -#ifdef CONFIG_PM_SLEEP > -static int sirf_usp_pcm_suspend(struct device *dev) > -{ > - struct sirf_usp *usp = dev_get_drvdata(dev); > - > - if (!pm_runtime_status_suspended(dev)) { > - regmap_read(usp->regmap, USP_MODE1, &usp->mode1_reg); > - regmap_read(usp->regmap, USP_MODE2, &usp->mode2_reg); > - sirf_usp_pcm_runtime_suspend(dev); > - } > - return 0; > -} > - > -static int sirf_usp_pcm_resume(struct device *dev) > -{ > - struct sirf_usp *usp = dev_get_drvdata(dev); > - int ret; > - > - if (!pm_runtime_status_suspended(dev)) { > - ret = sirf_usp_pcm_runtime_resume(dev); > - if (ret) > - return ret; > - regmap_write(usp->regmap, USP_MODE1, usp->mode1_reg); > - regmap_write(usp->regmap, USP_MODE2, usp->mode2_reg); > - } > - return 0; > -} > -#endif > - > -static const struct snd_soc_component_driver sirf_usp_component = { > - .name = "sirf-usp", > -}; > - > -static const struct regmap_config sirf_usp_regmap_config = { > - .reg_bits = 32, > - .reg_stride = 4, > - .val_bits = 32, > - .max_register = USP_RX_FIFO_DATA, > - .cache_type = REGCACHE_NONE, > -}; > - > -static int sirf_usp_pcm_probe(struct platform_device *pdev) > -{ > - int ret; > - struct sirf_usp *usp; > - void __iomem *base; > - > - usp = devm_kzalloc(&pdev->dev, sizeof(struct sirf_usp), > - GFP_KERNEL); > - if (!usp) > - return -ENOMEM; > - > - platform_set_drvdata(pdev, usp); > - > - base = devm_platform_ioremap_resource(pdev, 0); > - if (IS_ERR(base)) > - return PTR_ERR(base); > - usp->regmap = devm_regmap_init_mmio(&pdev->dev, base, > - &sirf_usp_regmap_config); > - if (IS_ERR(usp->regmap)) > - return PTR_ERR(usp->regmap); > - > - usp->clk = devm_clk_get(&pdev->dev, NULL); > - if (IS_ERR(usp->clk)) { > - dev_err(&pdev->dev, "Get clock failed.\n"); > - return PTR_ERR(usp->clk); > - } > - > - pm_runtime_enable(&pdev->dev); > - if (!pm_runtime_enabled(&pdev->dev)) { > - ret = sirf_usp_pcm_runtime_resume(&pdev->dev); > - if (ret) > - return ret; > - } > - > - ret = devm_snd_soc_register_component(&pdev->dev, &sirf_usp_component, > - &sirf_usp_pcm_dai, 1); > - if (ret) { > - dev_err(&pdev->dev, "Register Audio SoC dai failed.\n"); > - return ret; > - } > - return devm_snd_dmaengine_pcm_register(&pdev->dev, NULL, 0); > -} > - > -static int sirf_usp_pcm_remove(struct platform_device *pdev) > -{ > - if (!pm_runtime_enabled(&pdev->dev)) > - sirf_usp_pcm_runtime_suspend(&pdev->dev); > - else > - pm_runtime_disable(&pdev->dev); > - return 0; > -} > - > -static const struct of_device_id sirf_usp_pcm_of_match[] = { > - { .compatible = "sirf,prima2-usp-pcm", }, > - {} > -}; > -MODULE_DEVICE_TABLE(of, sirf_usp_pcm_of_match); > - > -static const struct dev_pm_ops sirf_usp_pcm_pm_ops = { > - SET_RUNTIME_PM_OPS(sirf_usp_pcm_runtime_suspend, > - sirf_usp_pcm_runtime_resume, NULL) > - SET_SYSTEM_SLEEP_PM_OPS(sirf_usp_pcm_suspend, sirf_usp_pcm_resume) > -}; > - > -static struct platform_driver sirf_usp_pcm_driver = { > - .driver = { > - .name = "sirf-usp-pcm", > - .of_match_table = sirf_usp_pcm_of_match, > - .pm = &sirf_usp_pcm_pm_ops, > - }, > - .probe = sirf_usp_pcm_probe, > - .remove = sirf_usp_pcm_remove, > -}; > - > -module_platform_driver(sirf_usp_pcm_driver); > - > -MODULE_DESCRIPTION("SiRF SoC USP PCM bus driver"); > -MODULE_AUTHOR("RongJun Ying "); > -MODULE_LICENSE("GPL v2"); > diff --git a/sound/soc/sirf/sirf-usp.h b/sound/soc/sirf/sirf-usp.h > deleted file mode 100644 > index 08993b5992c4..000000000000 > --- a/sound/soc/sirf/sirf-usp.h > +++ /dev/null > @@ -1,292 +0,0 @@ > -/* SPDX-License-Identifier: GPL-2.0-or-later */ > -/* > - * arch/arm/mach-prima2/include/mach/sirfsoc_usp.h > - * > - * Copyright (c) 2011 Cambridge Silicon Radio Limited, a CSR plc group company. > - */ > - > -#ifndef _SIRF_USP_H > -#define _SIRF_USP_H > - > -/* USP Registers */ > -#define USP_MODE1 0x00 > -#define USP_MODE2 0x04 > -#define USP_TX_FRAME_CTRL 0x08 > -#define USP_RX_FRAME_CTRL 0x0C > -#define USP_TX_RX_ENABLE 0x10 > -#define USP_INT_ENABLE 0x14 > -#define USP_INT_STATUS 0x18 > -#define USP_PIN_IO_DATA 0x1C > -#define USP_RISC_DSP_MODE 0x20 > -#define USP_AYSNC_PARAM_REG 0x24 > -#define USP_IRDA_X_MODE_DIV 0x28 > -#define USP_SM_CFG 0x2C > -#define USP_TX_DMA_IO_CTRL 0x100 > -#define USP_TX_DMA_IO_LEN 0x104 > -#define USP_TX_FIFO_CTRL 0x108 > -#define USP_TX_FIFO_LEVEL_CHK 0x10C > -#define USP_TX_FIFO_OP 0x110 > -#define USP_TX_FIFO_STATUS 0x114 > -#define USP_TX_FIFO_DATA 0x118 > -#define USP_RX_DMA_IO_CTRL 0x120 > -#define USP_RX_DMA_IO_LEN 0x124 > -#define USP_RX_FIFO_CTRL 0x128 > -#define USP_RX_FIFO_LEVEL_CHK 0x12C > -#define USP_RX_FIFO_OP 0x130 > -#define USP_RX_FIFO_STATUS 0x134 > -#define USP_RX_FIFO_DATA 0x138 > - > -/* USP MODE register-1 */ > -#define USP_SYNC_MODE 0x00000001 > -#define USP_CLOCK_MODE_SLAVE 0x00000002 > -#define USP_LOOP_BACK_EN 0x00000004 > -#define USP_HPSIR_EN 0x00000008 > -#define USP_ENDIAN_CTRL_LSBF 0x00000010 > -#define USP_EN 0x00000020 > -#define USP_RXD_ACT_EDGE_FALLING 0x00000040 > -#define USP_TXD_ACT_EDGE_FALLING 0x00000080 > -#define USP_RFS_ACT_LEVEL_LOGIC1 0x00000100 > -#define USP_TFS_ACT_LEVEL_LOGIC1 0x00000200 > -#define USP_SCLK_IDLE_MODE_TOGGLE 0x00000400 > -#define USP_SCLK_IDLE_LEVEL_LOGIC1 0x00000800 > -#define USP_SCLK_PIN_MODE_IO 0x00001000 > -#define USP_RFS_PIN_MODE_IO 0x00002000 > -#define USP_TFS_PIN_MODE_IO 0x00004000 > -#define USP_RXD_PIN_MODE_IO 0x00008000 > -#define USP_TXD_PIN_MODE_IO 0x00010000 > -#define USP_SCLK_IO_MODE_INPUT 0x00020000 > -#define USP_RFS_IO_MODE_INPUT 0x00040000 > -#define USP_TFS_IO_MODE_INPUT 0x00080000 > -#define USP_RXD_IO_MODE_INPUT 0x00100000 > -#define USP_TXD_IO_MODE_INPUT 0x00200000 > -#define USP_IRDA_WIDTH_DIV_MASK 0x3FC00000 > -#define USP_IRDA_WIDTH_DIV_OFFSET 0 > -#define USP_IRDA_IDLE_LEVEL_HIGH 0x40000000 > -#define USP_TX_UFLOW_REPEAT_ZERO 0x80000000 > -#define USP_TX_ENDIAN_MODE 0x00000020 > -#define USP_RX_ENDIAN_MODE 0x00000020 > - > -/* USP Mode Register-2 */ > -#define USP_RXD_DELAY_LEN_MASK 0x000000FF > -#define USP_RXD_DELAY_LEN_OFFSET 0 > - > -#define USP_TXD_DELAY_LEN_MASK 0x0000FF00 > -#define USP_TXD_DELAY_LEN_OFFSET 8 > - > -#define USP_ENA_CTRL_MODE 0x00010000 > -#define USP_FRAME_CTRL_MODE 0x00020000 > -#define USP_TFS_SOURCE_MODE 0x00040000 > -#define USP_TFS_MS_MODE 0x00080000 > -#define USP_CLK_DIVISOR_MASK 0x7FE00000 > -#define USP_CLK_DIVISOR_OFFSET 21 > - > -#define USP_TFS_CLK_SLAVE_MODE (1<<20) > -#define USP_RFS_CLK_SLAVE_MODE (1<<19) > - > -#define USP_IRDA_DATA_WIDTH 0x80000000 > - > -/* USP Transmit Frame Control Register */ > - > -#define USP_TXC_DATA_LEN_MASK 0x000000FF > -#define USP_TXC_DATA_LEN_OFFSET 0 > - > -#define USP_TXC_SYNC_LEN_MASK 0x0000FF00 > -#define USP_TXC_SYNC_LEN_OFFSET 8 > - > -#define USP_TXC_FRAME_LEN_MASK 0x00FF0000 > -#define USP_TXC_FRAME_LEN_OFFSET 16 > - > -#define USP_TXC_SHIFTER_LEN_MASK 0x1F000000 > -#define USP_TXC_SHIFTER_LEN_OFFSET 24 > - > -#define USP_TXC_SLAVE_CLK_SAMPLE 0x20000000 > - > -#define USP_TXC_CLK_DIVISOR_MASK 0xC0000000 > -#define USP_TXC_CLK_DIVISOR_OFFSET 30 > - > -/* USP Receive Frame Control Register */ > - > -#define USP_RXC_DATA_LEN_MASK 0x000000FF > -#define USP_RXC_DATA_LEN_OFFSET 0 > - > -#define USP_RXC_FRAME_LEN_MASK 0x0000FF00 > -#define USP_RXC_FRAME_LEN_OFFSET 8 > - > -#define USP_RXC_SHIFTER_LEN_MASK 0x001F0000 > -#define USP_RXC_SHIFTER_LEN_OFFSET 16 > - > -#define USP_START_EDGE_MODE 0x00800000 > -#define USP_I2S_SYNC_CHG 0x00200000 > - > -#define USP_RXC_CLK_DIVISOR_MASK 0x0F000000 > -#define USP_RXC_CLK_DIVISOR_OFFSET 24 > -#define USP_SINGLE_SYNC_MODE 0x00400000 > - > -/* Tx - RX Enable Register */ > - > -#define USP_RX_ENA 0x00000001 > -#define USP_TX_ENA 0x00000002 > - > -/* USP Interrupt Enable and status Register */ > -#define USP_RX_DONE_INT 0x00000001 > -#define USP_TX_DONE_INT 0x00000002 > -#define USP_RX_OFLOW_INT 0x00000004 > -#define USP_TX_UFLOW_INT 0x00000008 > -#define USP_RX_IO_DMA_INT 0x00000010 > -#define USP_TX_IO_DMA_INT 0x00000020 > -#define USP_RXFIFO_FULL_INT 0x00000040 > -#define USP_TXFIFO_EMPTY_INT 0x00000080 > -#define USP_RXFIFO_THD_INT 0x00000100 > -#define USP_TXFIFO_THD_INT 0x00000200 > -#define USP_UART_FRM_ERR_INT 0x00000400 > -#define USP_RX_TIMEOUT_INT 0x00000800 > -#define USP_TX_ALLOUT_INT 0x00001000 > -#define USP_RXD_BREAK_INT 0x00008000 > - > -/* All possible TX interruots */ > -#define USP_TX_INTERRUPT (USP_TX_DONE_INT|USP_TX_UFLOW_INT|\ > - USP_TX_IO_DMA_INT|\ > - USP_TXFIFO_EMPTY_INT|\ > - USP_TXFIFO_THD_INT) > -/* All possible RX interruots */ > -#define USP_RX_INTERRUPT (USP_RX_DONE_INT|USP_RX_OFLOW_INT|\ > - USP_RX_IO_DMA_INT|\ > - USP_RXFIFO_FULL_INT|\ > - USP_RXFIFO_THD_INT|\ > - USP_RX_TIMEOUT_INT) > - > -#define USP_INT_ALL 0x1FFF > - > -/* USP Pin I/O Data Register */ > - > -#define USP_RFS_PIN_VALUE_MASK 0x00000001 > -#define USP_TFS_PIN_VALUE_MASK 0x00000002 > -#define USP_RXD_PIN_VALUE_MASK 0x00000004 > -#define USP_TXD_PIN_VALUE_MASK 0x00000008 > -#define USP_SCLK_PIN_VALUE_MASK 0x00000010 > - > -/* USP RISC/DSP Mode Register */ > -#define USP_RISC_DSP_SEL 0x00000001 > - > -/* USP ASYNC PARAMETER Register*/ > - > -#define USP_ASYNC_TIMEOUT_MASK 0x0000FFFF > -#define USP_ASYNC_TIMEOUT_OFFSET 0 > -#define USP_ASYNC_TIMEOUT(x) (((x)&USP_ASYNC_TIMEOUT_MASK) \ > - < - > -#define USP_ASYNC_DIV2_MASK 0x003F0000 > -#define USP_ASYNC_DIV2_OFFSET 16 > - > -/* USP TX DMA I/O MODE Register */ > -#define USP_TX_MODE_IO 0x00000001 > - > -/* USP TX DMA I/O Length Register */ > -#define USP_TX_DATA_LEN_MASK 0xFFFFFFFF > -#define USP_TX_DATA_LEN_OFFSET 0 > - > -/* USP TX FIFO Control Register */ > -#define USP_TX_FIFO_WIDTH_MASK 0x00000003 > -#define USP_TX_FIFO_WIDTH_OFFSET 0 > - > -#define USP_TX_FIFO_THD_MASK 0x000001FC > -#define USP_TX_FIFO_THD_OFFSET 2 > - > -/* USP TX FIFO Level Check Register */ > -#define USP_TX_FIFO_LEVEL_CHECK_MASK 0x1F > -#define USP_TX_FIFO_SC_OFFSET 0 > -#define USP_TX_FIFO_LC_OFFSET 10 > -#define USP_TX_FIFO_HC_OFFSET 20 > - > -#define TX_FIFO_SC(x) (((x) & USP_TX_FIFO_LEVEL_CHECK_MASK) \ > - << USP_TX_FIFO_SC_OFFSET) > -#define TX_FIFO_LC(x) (((x) & USP_TX_FIFO_LEVEL_CHECK_MASK) \ > - << USP_TX_FIFO_LC_OFFSET) > -#define TX_FIFO_HC(x) (((x) & USP_TX_FIFO_LEVEL_CHECK_MASK) \ > - << USP_TX_FIFO_HC_OFFSET) > - > -/* USP TX FIFO Operation Register */ > -#define USP_TX_FIFO_RESET 0x00000001 > -#define USP_TX_FIFO_START 0x00000002 > - > -/* USP TX FIFO Status Register */ > -#define USP_TX_FIFO_LEVEL_MASK 0x0000007F > -#define USP_TX_FIFO_LEVEL_OFFSET 0 > - > -#define USP_TX_FIFO_FULL 0x00000080 > -#define USP_TX_FIFO_EMPTY 0x00000100 > - > -/* USP TX FIFO Data Register */ > -#define USP_TX_FIFO_DATA_MASK 0xFFFFFFFF > -#define USP_TX_FIFO_DATA_OFFSET 0 > - > -/* USP RX DMA I/O MODE Register */ > -#define USP_RX_MODE_IO 0x00000001 > -#define USP_RX_DMA_FLUSH 0x00000004 > - > -/* USP RX DMA I/O Length Register */ > -#define USP_RX_DATA_LEN_MASK 0xFFFFFFFF > -#define USP_RX_DATA_LEN_OFFSET 0 > - > -/* USP RX FIFO Control Register */ > -#define USP_RX_FIFO_WIDTH_MASK 0x00000003 > -#define USP_RX_FIFO_WIDTH_OFFSET 0 > - > -#define USP_RX_FIFO_THD_MASK 0x000001FC > -#define USP_RX_FIFO_THD_OFFSET 2 > - > -/* USP RX FIFO Level Check Register */ > - > -#define USP_RX_FIFO_LEVEL_CHECK_MASK 0x1F > -#define USP_RX_FIFO_SC_OFFSET 0 > -#define USP_RX_FIFO_LC_OFFSET 10 > -#define USP_RX_FIFO_HC_OFFSET 20 > - > -#define RX_FIFO_SC(x) (((x) & USP_RX_FIFO_LEVEL_CHECK_MASK) \ > - << USP_RX_FIFO_SC_OFFSET) > -#define RX_FIFO_LC(x) (((x) & USP_RX_FIFO_LEVEL_CHECK_MASK) \ > - << USP_RX_FIFO_LC_OFFSET) > -#define RX_FIFO_HC(x) (((x) & USP_RX_FIFO_LEVEL_CHECK_MASK) \ > - << USP_RX_FIFO_HC_OFFSET) > - > -/* USP RX FIFO Operation Register */ > -#define USP_RX_FIFO_RESET 0x00000001 > -#define USP_RX_FIFO_START 0x00000002 > - > -/* USP RX FIFO Status Register */ > - > -#define USP_RX_FIFO_LEVEL_MASK 0x0000007F > -#define USP_RX_FIFO_LEVEL_OFFSET 0 > - > -#define USP_RX_FIFO_FULL 0x00000080 > -#define USP_RX_FIFO_EMPTY 0x00000100 > - > -/* USP RX FIFO Data Register */ > - > -#define USP_RX_FIFO_DATA_MASK 0xFFFFFFFF > -#define USP_RX_FIFO_DATA_OFFSET 0 > - > -/* > - * When rx thd irq occur, sender just disable tx empty irq, > - * Remaining data in tx fifo wil also be sent out. > - */ > -#define USP_FIFO_SIZE 128 > -#define USP_TX_FIFO_THRESHOLD (USP_FIFO_SIZE/2) > -#define USP_RX_FIFO_THRESHOLD (USP_FIFO_SIZE/2) > - > -/* FIFO_WIDTH for the USP_TX_FIFO_CTRL and USP_RX_FIFO_CTRL registers */ > -#define USP_FIFO_WIDTH_BYTE 0x00 > -#define USP_FIFO_WIDTH_WORD 0x01 > -#define USP_FIFO_WIDTH_DWORD 0x02 > - > -#define USP_ASYNC_DIV2 16 > - > -#define USP_PLUGOUT_RETRY_CNT 2 > - > -#define USP_TX_RX_FIFO_WIDTH_DWORD 2 > - > -#define SIRF_USP_DIV_MCLK 0 > - > -#define SIRF_USP_I2S_TFS_SYNC 0 > -#define SIRF_USP_I2S_RFS_SYNC 1 > -#endif > -- > 2.29.2 > From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-11.2 required=3.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,INCLUDES_CR_TRAILER,INCLUDES_PATCH,MAILING_LIST_MULTI, SPF_HELO_NONE,SPF_PASS,UNWANTED_LANGUAGE_BODY,URIBL_BLOCKED autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 21728C433DB for ; Fri, 22 Jan 2021 07:58:05 +0000 (UTC) Received: from alsa0.perex.cz (alsa0.perex.cz [77.48.224.243]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id 6D48F230F9 for ; Fri, 22 Jan 2021 07:58:03 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 6D48F230F9 Authentication-Results: mail.kernel.org; dmarc=fail (p=none dis=none) header.from=kernel.org Authentication-Results: mail.kernel.org; spf=pass smtp.mailfrom=alsa-devel-bounces@alsa-project.org Received: from alsa1.perex.cz (alsa1.perex.cz [207.180.221.201]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by alsa0.perex.cz (Postfix) with ESMTPS id C1E1B1ABD; Fri, 22 Jan 2021 08:57:11 +0100 (CET) DKIM-Filter: OpenDKIM Filter v2.11.0 alsa0.perex.cz C1E1B1ABD DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=alsa-project.org; s=default; t=1611302282; bh=GJ/aa3jITA+iJw08j/JPDoA0jaJJHC2tggC8gsLSnQE=; h=References:In-Reply-To:From:Date:Subject:To:Cc:List-Id: List-Unsubscribe:List-Archive:List-Post:List-Help:List-Subscribe: From; b=WLGPChaTZ2NYJeVsGvb0B7NBFzo6izU7uCWQ8mFbUnGsTdiWbnr28l1cEOat4lCiE UXNeii5LjB2bMccq7M+RqfHeU2qbvrLWhB7W6PYh1agL65yBPjXVc5wwXEH1rVKxC3 +/XYHOtPHpE9pM83qh/p+wpu7VZlomZVnhXSGX5M= Received: from alsa1.perex.cz (localhost.localdomain [127.0.0.1]) by alsa1.perex.cz (Postfix) with ESMTP id 3E3B8F804E1; Fri, 22 Jan 2021 08:54:57 +0100 (CET) Received: by alsa1.perex.cz (Postfix, from userid 50401) id 850F8F80227; Wed, 20 Jan 2021 22:18:36 +0100 (CET) Received: from mail-ed1-f44.google.com (mail-ed1-f44.google.com [209.85.208.44]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by alsa1.perex.cz (Postfix) with ESMTPS id 84A44F80164 for ; Wed, 20 Jan 2021 22:18:25 +0100 (CET) DKIM-Filter: OpenDKIM Filter v2.11.0 alsa1.perex.cz 84A44F80164 Received: by mail-ed1-f44.google.com with SMTP id g1so23338edu.4 for ; Wed, 20 Jan 2021 13:18:25 -0800 (PST) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:mime-version:references:in-reply-to:from:date :message-id:subject:to:cc:content-transfer-encoding; bh=R+sF0wg3r8XINJntKCq2KV4V+mR8u2K7/6NUXxJfJmY=; b=VAzDIOtmPO/H6G4cTJEJYqb9fIb6/nb9W0gFwjLuarRmdMp36ppef7PcrAJMPWRQa7 XClaStjW4J22YAEvRzOdhUQMRmj2SxtyJhzozEYWwKmvofkIubWKj34zXzw94RI1IXck VH/lYYWUtlYp9bOO68T/vMMUBnK9DlevKj4y/Zj0JIigT2SstCoJMQ/wmFiC/Imme4eR i+dmHFBBI151HCCoHdbn5sa6BG3bRm9CiwAARYCzu39XG9BkXVr7Lc4C0+4nPmQ5lKIz K7kSLzTujBqejR5M0WQ0YxbJr/zMarcy56zvI2J1UjmL3uVh9eGtbDJAOX2RW9GYC8tp 1IVA== X-Gm-Message-State: AOAM533VHlFoETcAt9OaraGJxCiNYGXszet28f7JGlcRczWDuVYIbrK5 BGBSqf4IlbIlbgdnpQpKddmJt9IDPb97W9dJZGA= X-Google-Smtp-Source: ABdhPJyGTRiNEqKZLpSpnoiPmaNeBKxr+8eBMLUjTU/s0fvSxkLQC2K59RrITmCTRRVl6rkbG4LkKiaBDcH7KAkIKWQ= X-Received: by 2002:a50:fd84:: with SMTP id o4mr6474874edt.340.1611177504958; Wed, 20 Jan 2021 13:18:24 -0800 (PST) MIME-Version: 1.0 References: <20210120162553.21666-1-arnd@kernel.org> <20210120162553.21666-2-arnd@kernel.org> In-Reply-To: <20210120162553.21666-2-arnd@kernel.org> From: Barry Song Date: Thu, 21 Jan 2021 10:18:13 +1300 Message-ID: Subject: Re: [PATCH 1/2] ASoC: remove sirf prima/atlas drivers To: Arnd Bergmann Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: quoted-printable X-Mailman-Approved-At: Fri, 22 Jan 2021 08:54:42 +0100 Cc: alsa-devel@alsa-project.org, Arnd Bergmann , LKML , Liam Girdwood , Mark Brown , linux-arm-kernel@lists.infradead.org X-BeenThere: alsa-devel@alsa-project.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: "Alsa-devel mailing list for ALSA developers - http://www.alsa-project.org" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: alsa-devel-bounces@alsa-project.org Sender: "Alsa-devel" Arnd Bergmann =E4=BA=8E2021=E5=B9=B41=E6=9C=8821=E6=97=A5= =E5=91=A8=E5=9B=9B =E4=B8=8A=E5=8D=885:26=E5=86=99=E9=81=93=EF=BC=9A > > From: Arnd Bergmann > > The CSR SiRF prima2/atlas platforms are getting removed, so this driver > is no longer needed. > > Cc: Barry Song > Signed-off-by: Arnd Bergmann Acked-by: Barry Song > --- > .../bindings/sound/sirf-audio-codec.txt | 17 - > .../devicetree/bindings/sound/sirf-usp.txt | 27 - > sound/soc/Kconfig | 1 - > sound/soc/Makefile | 1 - > sound/soc/codecs/Makefile | 2 - > sound/soc/codecs/sirf-audio-codec.c | 575 ------------------ > sound/soc/sirf/Kconfig | 21 - > sound/soc/sirf/Makefile | 8 - > sound/soc/sirf/sirf-audio-port.c | 86 --- > sound/soc/sirf/sirf-audio.c | 160 ----- > sound/soc/sirf/sirf-usp.c | 435 ------------- > sound/soc/sirf/sirf-usp.h | 292 --------- > 12 files changed, 1625 deletions(-) > delete mode 100644 Documentation/devicetree/bindings/sound/sirf-audio-co= dec.txt > delete mode 100644 Documentation/devicetree/bindings/sound/sirf-usp.txt > delete mode 100644 sound/soc/codecs/sirf-audio-codec.c > delete mode 100644 sound/soc/sirf/Kconfig > delete mode 100644 sound/soc/sirf/Makefile > delete mode 100644 sound/soc/sirf/sirf-audio-port.c > delete mode 100644 sound/soc/sirf/sirf-audio.c > delete mode 100644 sound/soc/sirf/sirf-usp.c > delete mode 100644 sound/soc/sirf/sirf-usp.h > > diff --git a/Documentation/devicetree/bindings/sound/sirf-audio-codec.txt= b/Documentation/devicetree/bindings/sound/sirf-audio-codec.txt > deleted file mode 100644 > index 062f5ec36f9b..000000000000 > --- a/Documentation/devicetree/bindings/sound/sirf-audio-codec.txt > +++ /dev/null > @@ -1,17 +0,0 @@ > -SiRF internal audio CODEC > - > -Required properties: > - > - - compatible : "sirf,atlas6-audio-codec" or "sirf,prima2-audio-codec" > - > - - reg : the register address of the device. > - > - - clocks: the clock of SiRF internal audio codec > - > -Example: > - > -audiocodec: audiocodec@b0040000 { > - compatible =3D "sirf,atlas6-audio-codec"; > - reg =3D <0xb0040000 0x10000>; > - clocks =3D <&clks 27>; > -}; > diff --git a/Documentation/devicetree/bindings/sound/sirf-usp.txt b/Docum= entation/devicetree/bindings/sound/sirf-usp.txt > deleted file mode 100644 > index 02f85b32d359..000000000000 > --- a/Documentation/devicetree/bindings/sound/sirf-usp.txt > +++ /dev/null > @@ -1,27 +0,0 @@ > -* SiRF SoC USP module > - > -Required properties: > -- compatible: "sirf,prima2-usp-pcm" > -- reg: Base address and size entries: > -- dmas: List of DMA controller phandle and DMA request line ordered pair= s. > -- dma-names: Identifier string for each DMA request line in the dmas pro= perty. > - These strings correspond 1:1 with the ordered pairs in dmas. > - > - One of the DMA channels will be responsible for transmission (should b= e > - named "tx") and one for reception (should be named "rx"). > - > -- clocks: USP controller clock source > -- pinctrl-names: Must contain a "default" entry. > -- pinctrl-NNN: One property must exist for each entry in pinctrl-names. > - > -Example: > -usp0: usp@b0080000 { > - compatible =3D "sirf,prima2-usp-pcm"; > - reg =3D <0xb0080000 0x10000>; > - clocks =3D <&clks 28>; > - dmas =3D <&dmac1 1>, <&dmac1 2>; > - dma-names =3D "rx", "tx"; > - pinctrl-names =3D "default"; > - pinctrl-0 =3D <&usp0_only_utfs_pins_a>; > -}; > - > diff --git a/sound/soc/Kconfig b/sound/soc/Kconfig > index 71a6fe87d1a1..1fb61e689031 100644 > --- a/sound/soc/Kconfig > +++ b/sound/soc/Kconfig > @@ -62,7 +62,6 @@ source "sound/soc/qcom/Kconfig" > source "sound/soc/rockchip/Kconfig" > source "sound/soc/samsung/Kconfig" > source "sound/soc/sh/Kconfig" > -source "sound/soc/sirf/Kconfig" > source "sound/soc/sof/Kconfig" > source "sound/soc/spear/Kconfig" > source "sound/soc/sprd/Kconfig" > diff --git a/sound/soc/Makefile b/sound/soc/Makefile > index ddbac3a2169f..d2b7a23f0e7b 100644 > --- a/sound/soc/Makefile > +++ b/sound/soc/Makefile > @@ -45,7 +45,6 @@ obj-$(CONFIG_SND_SOC) +=3D qcom/ > obj-$(CONFIG_SND_SOC) +=3D rockchip/ > obj-$(CONFIG_SND_SOC) +=3D samsung/ > obj-$(CONFIG_SND_SOC) +=3D sh/ > -obj-$(CONFIG_SND_SOC) +=3D sirf/ > obj-$(CONFIG_SND_SOC) +=3D sof/ > obj-$(CONFIG_SND_SOC) +=3D spear/ > obj-$(CONFIG_SND_SOC) +=3D sprd/ > diff --git a/sound/soc/codecs/Makefile b/sound/soc/codecs/Makefile > index d277f0366e09..c30762fc9b87 100644 > --- a/sound/soc/codecs/Makefile > +++ b/sound/soc/codecs/Makefile > @@ -201,7 +201,6 @@ snd-soc-sigmadsp-objs :=3D sigmadsp.o > snd-soc-sigmadsp-i2c-objs :=3D sigmadsp-i2c.o > snd-soc-sigmadsp-regmap-objs :=3D sigmadsp-regmap.o > snd-soc-si476x-objs :=3D si476x.o > -snd-soc-sirf-audio-codec-objs :=3D sirf-audio-codec.o > snd-soc-spdif-tx-objs :=3D spdif_transmitter.o > snd-soc-spdif-rx-objs :=3D spdif_receiver.o > snd-soc-ssm2305-objs :=3D ssm2305.o > @@ -516,7 +515,6 @@ obj-$(CONFIG_SND_SOC_SIGMADSP_I2C) +=3D snd-soc-sigm= adsp-i2c.o > obj-$(CONFIG_SND_SOC_SIGMADSP_REGMAP) +=3D snd-soc-sigmadsp-regmap.o > obj-$(CONFIG_SND_SOC_SI476X) +=3D snd-soc-si476x.o > obj-$(CONFIG_SND_SOC_SPDIF) +=3D snd-soc-spdif-rx.o snd-soc-spdif-tx.= o > -obj-$(CONFIG_SND_SOC_SIRF_AUDIO_CODEC) +=3D sirf-audio-codec.o > obj-$(CONFIG_SND_SOC_SSM2305) +=3D snd-soc-ssm2305.o > obj-$(CONFIG_SND_SOC_SSM2518) +=3D snd-soc-ssm2518.o > obj-$(CONFIG_SND_SOC_SSM2602) +=3D snd-soc-ssm2602.o > diff --git a/sound/soc/codecs/sirf-audio-codec.c b/sound/soc/codecs/sirf-= audio-codec.c > deleted file mode 100644 > index a061d78473ac..000000000000 > --- a/sound/soc/codecs/sirf-audio-codec.c > +++ /dev/null > @@ -1,575 +0,0 @@ > -// SPDX-License-Identifier: GPL-2.0-or-later > -/* > - * SiRF audio codec driver > - * > - * Copyright (c) 2011 Cambridge Silicon Radio Limited, a CSR plc group c= ompany. > - */ > - > -#include > -#include > -#include > -#include > -#include > -#include > -#include > -#include > -#include > -#include > -#include > -#include > -#include > -#include > -#include > -#include > - > -#include "sirf-audio-codec.h" > - > -struct sirf_audio_codec { > - struct clk *clk; > - struct regmap *regmap; > - u32 reg_ctrl0, reg_ctrl1; > -}; > - > -static const char * const input_mode_mux[] =3D {"Single-ended", > - "Differential"}; > - > -static const struct soc_enum input_mode_mux_enum =3D > - SOC_ENUM_SINGLE(AUDIO_IC_CODEC_CTRL1, 4, 2, input_mode_mux); > - > -static const struct snd_kcontrol_new sirf_audio_codec_input_mode_control= =3D > - SOC_DAPM_ENUM("Route", input_mode_mux_enum); > - > -static const DECLARE_TLV_DB_SCALE(playback_vol_tlv, -12400, 100, 0); > -static const DECLARE_TLV_DB_SCALE(capture_vol_tlv_prima2, 500, 100, 0); > -static const DECLARE_TLV_DB_RANGE(capture_vol_tlv_atlas6, > - 0, 7, TLV_DB_SCALE_ITEM(-100, 100, 0), > - 0x22, 0x3F, TLV_DB_SCALE_ITEM(700, 100, 0), > -); > - > -static struct snd_kcontrol_new volume_controls_atlas6[] =3D { > - SOC_DOUBLE_TLV("Playback Volume", AUDIO_IC_CODEC_CTRL0, 21, 14, > - 0x7F, 0, playback_vol_tlv), > - SOC_DOUBLE_TLV("Capture Volume", AUDIO_IC_CODEC_CTRL1, 16, 10, > - 0x3F, 0, capture_vol_tlv_atlas6), > -}; > - > -static struct snd_kcontrol_new volume_controls_prima2[] =3D { > - SOC_DOUBLE_TLV("Speaker Volume", AUDIO_IC_CODEC_CTRL0, 21, 14, > - 0x7F, 0, playback_vol_tlv), > - SOC_DOUBLE_TLV("Capture Volume", AUDIO_IC_CODEC_CTRL1, 15, 10, > - 0x1F, 0, capture_vol_tlv_prima2), > -}; > - > -static struct snd_kcontrol_new left_input_path_controls[] =3D { > - SOC_DAPM_SINGLE("Line Left Switch", AUDIO_IC_CODEC_CTRL1, 6, 1, 0= ), > - SOC_DAPM_SINGLE("Mic Left Switch", AUDIO_IC_CODEC_CTRL1, 3, 1, 0)= , > -}; > - > -static struct snd_kcontrol_new right_input_path_controls[] =3D { > - SOC_DAPM_SINGLE("Line Right Switch", AUDIO_IC_CODEC_CTRL1, 5, 1, = 0), > - SOC_DAPM_SINGLE("Mic Right Switch", AUDIO_IC_CODEC_CTRL1, 2, 1, 0= ), > -}; > - > -static struct snd_kcontrol_new left_dac_to_hp_left_amp_switch_control = =3D > - SOC_DAPM_SINGLE("Switch", AUDIO_IC_CODEC_CTRL0, 9, 1, 0); > - > -static struct snd_kcontrol_new left_dac_to_hp_right_amp_switch_control = =3D > - SOC_DAPM_SINGLE("Switch", AUDIO_IC_CODEC_CTRL0, 8, 1, 0); > - > -static struct snd_kcontrol_new right_dac_to_hp_left_amp_switch_control = =3D > - SOC_DAPM_SINGLE("Switch", AUDIO_IC_CODEC_CTRL0, 7, 1, 0); > - > -static struct snd_kcontrol_new right_dac_to_hp_right_amp_switch_control = =3D > - SOC_DAPM_SINGLE("Switch", AUDIO_IC_CODEC_CTRL0, 6, 1, 0); > - > -static struct snd_kcontrol_new left_dac_to_speaker_lineout_switch_contro= l =3D > - SOC_DAPM_SINGLE("Switch", AUDIO_IC_CODEC_CTRL0, 11, 1, 0); > - > -static struct snd_kcontrol_new right_dac_to_speaker_lineout_switch_contr= ol =3D > - SOC_DAPM_SINGLE("Switch", AUDIO_IC_CODEC_CTRL0, 10, 1, 0); > - > -/* After enable adc, Delay 200ms to avoid pop noise */ > -static int adc_enable_delay_event(struct snd_soc_dapm_widget *w, > - struct snd_kcontrol *kcontrol, int event) > -{ > - switch (event) { > - case SND_SOC_DAPM_POST_PMU: > - msleep(200); > - break; > - default: > - break; > - } > - > - return 0; > -} > - > -static void enable_and_reset_codec(struct regmap *regmap, > - u32 codec_enable_bits, u32 codec_reset_bits) > -{ > - regmap_update_bits(regmap, AUDIO_IC_CODEC_CTRL1, > - codec_enable_bits | codec_reset_bits, > - codec_enable_bits); > - msleep(20); > - regmap_update_bits(regmap, AUDIO_IC_CODEC_CTRL1, > - codec_reset_bits, codec_reset_bits); > -} > - > -static int atlas6_codec_enable_and_reset_event(struct snd_soc_dapm_widge= t *w, > - struct snd_kcontrol *kcontrol, int event) > -{ > -#define ATLAS6_CODEC_ENABLE_BITS (1 << 29) > -#define ATLAS6_CODEC_RESET_BITS (1 << 28) > - struct snd_soc_component *component =3D snd_soc_dapm_to_component= (w->dapm); > - struct sirf_audio_codec *sirf_audio_codec =3D snd_soc_component_g= et_drvdata(component); > - switch (event) { > - case SND_SOC_DAPM_PRE_PMU: > - enable_and_reset_codec(sirf_audio_codec->regmap, > - ATLAS6_CODEC_ENABLE_BITS, ATLAS6_CODEC_RESET_BITS= ); > - break; > - case SND_SOC_DAPM_POST_PMD: > - regmap_update_bits(sirf_audio_codec->regmap, > - AUDIO_IC_CODEC_CTRL1, ATLAS6_CODEC_ENABLE_BITS, 0= ); > - break; > - default: > - break; > - } > - > - return 0; > -} > - > -static int prima2_codec_enable_and_reset_event(struct snd_soc_dapm_widge= t *w, > - struct snd_kcontrol *kcontrol, int event) > -{ > -#define PRIMA2_CODEC_ENABLE_BITS (1 << 27) > -#define PRIMA2_CODEC_RESET_BITS (1 << 26) > - struct snd_soc_component *component =3D snd_soc_dapm_to_component= (w->dapm); > - struct sirf_audio_codec *sirf_audio_codec =3D snd_soc_component_g= et_drvdata(component); > - switch (event) { > - case SND_SOC_DAPM_POST_PMU: > - enable_and_reset_codec(sirf_audio_codec->regmap, > - PRIMA2_CODEC_ENABLE_BITS, PRIMA2_CODEC_RESET_BITS= ); > - break; > - case SND_SOC_DAPM_POST_PMD: > - regmap_update_bits(sirf_audio_codec->regmap, > - AUDIO_IC_CODEC_CTRL1, PRIMA2_CODEC_ENABLE_BITS, 0= ); > - break; > - default: > - break; > - } > - > - return 0; > -} > - > -static const struct snd_soc_dapm_widget atlas6_output_driver_dapm_widget= s[] =3D { > - SND_SOC_DAPM_OUT_DRV("HP Left Driver", AUDIO_IC_CODEC_CTRL1, > - 25, 0, NULL, 0), > - SND_SOC_DAPM_OUT_DRV("HP Right Driver", AUDIO_IC_CODEC_CTRL1, > - 26, 0, NULL, 0), > - SND_SOC_DAPM_OUT_DRV("Speaker Driver", AUDIO_IC_CODEC_CTRL1, > - 27, 0, NULL, 0), > -}; > - > -static const struct snd_soc_dapm_widget prima2_output_driver_dapm_widget= s[] =3D { > - SND_SOC_DAPM_OUT_DRV("HP Left Driver", AUDIO_IC_CODEC_CTRL1, > - 23, 0, NULL, 0), > - SND_SOC_DAPM_OUT_DRV("HP Right Driver", AUDIO_IC_CODEC_CTRL1, > - 24, 0, NULL, 0), > - SND_SOC_DAPM_OUT_DRV("Speaker Driver", AUDIO_IC_CODEC_CTRL1, > - 25, 0, NULL, 0), > -}; > - > -static const struct snd_soc_dapm_widget atlas6_codec_clock_dapm_widget = =3D > - SND_SOC_DAPM_SUPPLY("codecclk", SND_SOC_NOPM, 0, 0, > - atlas6_codec_enable_and_reset_event, > - SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD); > - > -static const struct snd_soc_dapm_widget prima2_codec_clock_dapm_widget = =3D > - SND_SOC_DAPM_SUPPLY("codecclk", SND_SOC_NOPM, 0, 0, > - prima2_codec_enable_and_reset_event, > - SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD); > - > -static const struct snd_soc_dapm_widget sirf_audio_codec_dapm_widgets[] = =3D { > - SND_SOC_DAPM_DAC("DAC left", NULL, AUDIO_IC_CODEC_CTRL0, 1, 0), > - SND_SOC_DAPM_DAC("DAC right", NULL, AUDIO_IC_CODEC_CTRL0, 0, 0), > - SND_SOC_DAPM_SWITCH("Left dac to hp left amp", SND_SOC_NOPM, 0, 0= , > - &left_dac_to_hp_left_amp_switch_control), > - SND_SOC_DAPM_SWITCH("Left dac to hp right amp", SND_SOC_NOPM, 0, = 0, > - &left_dac_to_hp_right_amp_switch_control), > - SND_SOC_DAPM_SWITCH("Right dac to hp left amp", SND_SOC_NOPM, 0, = 0, > - &right_dac_to_hp_left_amp_switch_control), > - SND_SOC_DAPM_SWITCH("Right dac to hp right amp", SND_SOC_NOPM, 0,= 0, > - &right_dac_to_hp_right_amp_switch_control), > - SND_SOC_DAPM_OUT_DRV("HP amp left driver", AUDIO_IC_CODEC_CTRL0, = 3, 0, > - NULL, 0), > - SND_SOC_DAPM_OUT_DRV("HP amp right driver", AUDIO_IC_CODEC_CTRL0,= 3, 0, > - NULL, 0), > - > - SND_SOC_DAPM_SWITCH("Left dac to speaker lineout", SND_SOC_NOPM, = 0, 0, > - &left_dac_to_speaker_lineout_switch_control), > - SND_SOC_DAPM_SWITCH("Right dac to speaker lineout", SND_SOC_NOPM,= 0, 0, > - &right_dac_to_speaker_lineout_switch_control), > - SND_SOC_DAPM_OUT_DRV("Speaker amp driver", AUDIO_IC_CODEC_CTRL0, = 4, 0, > - NULL, 0), > - > - SND_SOC_DAPM_OUTPUT("HPOUTL"), > - SND_SOC_DAPM_OUTPUT("HPOUTR"), > - SND_SOC_DAPM_OUTPUT("SPKOUT"), > - > - SND_SOC_DAPM_ADC_E("ADC left", NULL, AUDIO_IC_CODEC_CTRL1, 8, 0, > - adc_enable_delay_event, SND_SOC_DAPM_POST_PMU), > - SND_SOC_DAPM_ADC_E("ADC right", NULL, AUDIO_IC_CODEC_CTRL1, 7, 0, > - adc_enable_delay_event, SND_SOC_DAPM_POST_PMU), > - SND_SOC_DAPM_MIXER("Left PGA mixer", AUDIO_IC_CODEC_CTRL1, 1, 0, > - &left_input_path_controls[0], > - ARRAY_SIZE(left_input_path_controls)), > - SND_SOC_DAPM_MIXER("Right PGA mixer", AUDIO_IC_CODEC_CTRL1, 0, 0, > - &right_input_path_controls[0], > - ARRAY_SIZE(right_input_path_controls)), > - > - SND_SOC_DAPM_MUX("Mic input mode mux", SND_SOC_NOPM, 0, 0, > - &sirf_audio_codec_input_mode_control), > - SND_SOC_DAPM_MICBIAS("Mic Bias", AUDIO_IC_CODEC_PWR, 3, 0), > - SND_SOC_DAPM_INPUT("MICIN1"), > - SND_SOC_DAPM_INPUT("MICIN2"), > - SND_SOC_DAPM_INPUT("LINEIN1"), > - SND_SOC_DAPM_INPUT("LINEIN2"), > - > - SND_SOC_DAPM_SUPPLY("HSL Phase Opposite", AUDIO_IC_CODEC_CTRL0, > - 30, 0, NULL, 0), > -}; > - > -static const struct snd_soc_dapm_route sirf_audio_codec_map[] =3D { > - {"SPKOUT", NULL, "Speaker Driver"}, > - {"Speaker Driver", NULL, "Speaker amp driver"}, > - {"Speaker amp driver", NULL, "Left dac to speaker lineout"}, > - {"Speaker amp driver", NULL, "Right dac to speaker lineout"}, > - {"Left dac to speaker lineout", "Switch", "DAC left"}, > - {"Right dac to speaker lineout", "Switch", "DAC right"}, > - {"HPOUTL", NULL, "HP Left Driver"}, > - {"HPOUTR", NULL, "HP Right Driver"}, > - {"HP Left Driver", NULL, "HP amp left driver"}, > - {"HP Right Driver", NULL, "HP amp right driver"}, > - {"HP amp left driver", NULL, "Right dac to hp left amp"}, > - {"HP amp right driver", NULL , "Right dac to hp right amp"}, > - {"HP amp left driver", NULL, "Left dac to hp left amp"}, > - {"HP amp right driver", NULL , "Right dac to hp right amp"}, > - {"Right dac to hp left amp", "Switch", "DAC left"}, > - {"Right dac to hp right amp", "Switch", "DAC right"}, > - {"Left dac to hp left amp", "Switch", "DAC left"}, > - {"Left dac to hp right amp", "Switch", "DAC right"}, > - {"DAC left", NULL, "codecclk"}, > - {"DAC right", NULL, "codecclk"}, > - {"DAC left", NULL, "Playback"}, > - {"DAC right", NULL, "Playback"}, > - {"DAC left", NULL, "HSL Phase Opposite"}, > - {"DAC right", NULL, "HSL Phase Opposite"}, > - > - {"Capture", NULL, "ADC left"}, > - {"Capture", NULL, "ADC right"}, > - {"ADC left", NULL, "codecclk"}, > - {"ADC right", NULL, "codecclk"}, > - {"ADC left", NULL, "Left PGA mixer"}, > - {"ADC right", NULL, "Right PGA mixer"}, > - {"Left PGA mixer", "Line Left Switch", "LINEIN2"}, > - {"Right PGA mixer", "Line Right Switch", "LINEIN1"}, > - {"Left PGA mixer", "Mic Left Switch", "MICIN2"}, > - {"Right PGA mixer", "Mic Right Switch", "Mic input mode mux"}, > - {"Mic input mode mux", "Single-ended", "MICIN1"}, > - {"Mic input mode mux", "Differential", "MICIN1"}, > -}; > - > -static void sirf_audio_codec_tx_enable(struct sirf_audio_codec *sirf_aud= io_codec) > -{ > - regmap_update_bits(sirf_audio_codec->regmap, AUDIO_PORT_IC_TXFIFO= _OP, > - AUDIO_FIFO_RESET, AUDIO_FIFO_RESET); > - regmap_update_bits(sirf_audio_codec->regmap, AUDIO_PORT_IC_TXFIFO= _OP, > - AUDIO_FIFO_RESET, ~AUDIO_FIFO_RESET); > - regmap_write(sirf_audio_codec->regmap, AUDIO_PORT_IC_TXFIFO_INT_M= SK, 0); > - regmap_write(sirf_audio_codec->regmap, AUDIO_PORT_IC_TXFIFO_OP, 0= ); > - regmap_update_bits(sirf_audio_codec->regmap, AUDIO_PORT_IC_TXFIFO= _OP, > - AUDIO_FIFO_START, AUDIO_FIFO_START); > - regmap_update_bits(sirf_audio_codec->regmap, > - AUDIO_PORT_IC_CODEC_TX_CTRL, IC_TX_ENABLE, IC_TX_ENABLE); > -} > - > -static void sirf_audio_codec_tx_disable(struct sirf_audio_codec *sirf_au= dio_codec) > -{ > - regmap_write(sirf_audio_codec->regmap, AUDIO_PORT_IC_TXFIFO_OP, 0= ); > - regmap_update_bits(sirf_audio_codec->regmap, > - AUDIO_PORT_IC_CODEC_TX_CTRL, IC_TX_ENABLE, ~IC_TX_ENABLE)= ; > -} > - > -static void sirf_audio_codec_rx_enable(struct sirf_audio_codec *sirf_aud= io_codec, > - int channels) > -{ > - regmap_update_bits(sirf_audio_codec->regmap, AUDIO_PORT_IC_RXFIFO= _OP, > - AUDIO_FIFO_RESET, AUDIO_FIFO_RESET); > - regmap_update_bits(sirf_audio_codec->regmap, AUDIO_PORT_IC_RXFIFO= _OP, > - AUDIO_FIFO_RESET, ~AUDIO_FIFO_RESET); > - regmap_write(sirf_audio_codec->regmap, > - AUDIO_PORT_IC_RXFIFO_INT_MSK, 0); > - regmap_write(sirf_audio_codec->regmap, AUDIO_PORT_IC_RXFIFO_OP, 0= ); > - regmap_update_bits(sirf_audio_codec->regmap, AUDIO_PORT_IC_RXFIFO= _OP, > - AUDIO_FIFO_START, AUDIO_FIFO_START); > - if (channels =3D=3D 1) > - regmap_update_bits(sirf_audio_codec->regmap, > - AUDIO_PORT_IC_CODEC_RX_CTRL, > - IC_RX_ENABLE_MONO, IC_RX_ENABLE_MONO); > - else > - regmap_update_bits(sirf_audio_codec->regmap, > - AUDIO_PORT_IC_CODEC_RX_CTRL, > - IC_RX_ENABLE_STEREO, IC_RX_ENABLE_STEREO); > -} > - > -static void sirf_audio_codec_rx_disable(struct sirf_audio_codec *sirf_au= dio_codec) > -{ > - regmap_update_bits(sirf_audio_codec->regmap, > - AUDIO_PORT_IC_CODEC_RX_CTRL, > - IC_RX_ENABLE_STEREO, ~IC_RX_ENABLE_STEREO); > -} > - > -static int sirf_audio_codec_trigger(struct snd_pcm_substream *substream, > - int cmd, > - struct snd_soc_dai *dai) > -{ > - struct snd_soc_component *component =3D dai->component; > - struct sirf_audio_codec *sirf_audio_codec =3D snd_soc_component_g= et_drvdata(component); > - int playback =3D substream->stream =3D=3D SNDRV_PCM_STREAM_PLAYBA= CK; > - > - /* > - * This is a workaround, When stop playback, > - * need disable HP amp, avoid the current noise. > - */ > - switch (cmd) { > - case SNDRV_PCM_TRIGGER_STOP: > - case SNDRV_PCM_TRIGGER_SUSPEND: > - case SNDRV_PCM_TRIGGER_PAUSE_PUSH: > - if (playback) { > - snd_soc_component_update_bits(component, AUDIO_IC= _CODEC_CTRL0, > - IC_HSLEN | IC_HSREN, 0); > - sirf_audio_codec_tx_disable(sirf_audio_codec); > - } else > - sirf_audio_codec_rx_disable(sirf_audio_codec); > - break; > - case SNDRV_PCM_TRIGGER_START: > - case SNDRV_PCM_TRIGGER_RESUME: > - case SNDRV_PCM_TRIGGER_PAUSE_RELEASE: > - if (playback) { > - sirf_audio_codec_tx_enable(sirf_audio_codec); > - snd_soc_component_update_bits(component, AUDIO_IC= _CODEC_CTRL0, > - IC_HSLEN | IC_HSREN, IC_HSLEN | IC_HSREN)= ; > - } else > - sirf_audio_codec_rx_enable(sirf_audio_codec, > - substream->runtime->channels); > - break; > - default: > - return -EINVAL; > - } > - > - return 0; > -} > - > -static const struct snd_soc_dai_ops sirf_audio_codec_dai_ops =3D { > - .trigger =3D sirf_audio_codec_trigger, > -}; > - > -static struct snd_soc_dai_driver sirf_audio_codec_dai =3D { > - .name =3D "sirf-audio-codec", > - .playback =3D { > - .stream_name =3D "Playback", > - .channels_min =3D 2, > - .channels_max =3D 2, > - .rates =3D SNDRV_PCM_RATE_48000, > - .formats =3D SNDRV_PCM_FMTBIT_S16_LE, > - }, > - .capture =3D { > - .stream_name =3D "Capture", > - .channels_min =3D 1, > - .channels_max =3D 2, > - .rates =3D SNDRV_PCM_RATE_48000, > - .formats =3D SNDRV_PCM_FMTBIT_S16_LE, > - }, > - .ops =3D &sirf_audio_codec_dai_ops, > -}; > - > -static int sirf_audio_codec_probe(struct snd_soc_component *component) > -{ > - struct snd_soc_dapm_context *dapm =3D snd_soc_component_get_dapm(= component); > - > - pm_runtime_enable(component->dev); > - > - if (of_device_is_compatible(component->dev->of_node, "sirf,prima2= -audio-codec")) { > - snd_soc_dapm_new_controls(dapm, > - prima2_output_driver_dapm_widgets, > - ARRAY_SIZE(prima2_output_driver_dapm_widgets)); > - snd_soc_dapm_new_controls(dapm, > - &prima2_codec_clock_dapm_widget, 1); > - return snd_soc_add_component_controls(component, > - volume_controls_prima2, > - ARRAY_SIZE(volume_controls_prima2)); > - } > - if (of_device_is_compatible(component->dev->of_node, "sirf,atlas6= -audio-codec")) { > - snd_soc_dapm_new_controls(dapm, > - atlas6_output_driver_dapm_widgets, > - ARRAY_SIZE(atlas6_output_driver_dapm_widgets)); > - snd_soc_dapm_new_controls(dapm, > - &atlas6_codec_clock_dapm_widget, 1); > - return snd_soc_add_component_controls(component, > - volume_controls_atlas6, > - ARRAY_SIZE(volume_controls_atlas6)); > - } > - > - return -EINVAL; > -} > - > -static void sirf_audio_codec_remove(struct snd_soc_component *component) > -{ > - pm_runtime_disable(component->dev); > -} > - > -static const struct snd_soc_component_driver soc_codec_device_sirf_audio= _codec =3D { > - .probe =3D sirf_audio_codec_probe, > - .remove =3D sirf_audio_codec_remove, > - .dapm_widgets =3D sirf_audio_codec_dapm_widgets, > - .num_dapm_widgets =3D ARRAY_SIZE(sirf_audio_codec_dapm_widg= ets), > - .dapm_routes =3D sirf_audio_codec_map, > - .num_dapm_routes =3D ARRAY_SIZE(sirf_audio_codec_map), > - .use_pmdown_time =3D 1, > - .endianness =3D 1, > - .non_legacy_dai_naming =3D 1, > -}; > - > -static const struct of_device_id sirf_audio_codec_of_match[] =3D { > - { .compatible =3D "sirf,prima2-audio-codec" }, > - { .compatible =3D "sirf,atlas6-audio-codec" }, > - {} > -}; > -MODULE_DEVICE_TABLE(of, sirf_audio_codec_of_match); > - > -static const struct regmap_config sirf_audio_codec_regmap_config =3D { > - .reg_bits =3D 32, > - .reg_stride =3D 4, > - .val_bits =3D 32, > - .max_register =3D AUDIO_PORT_IC_RXFIFO_INT_MSK, > - .cache_type =3D REGCACHE_NONE, > -}; > - > -static int sirf_audio_codec_driver_probe(struct platform_device *pdev) > -{ > - int ret; > - struct sirf_audio_codec *sirf_audio_codec; > - void __iomem *base; > - > - sirf_audio_codec =3D devm_kzalloc(&pdev->dev, > - sizeof(struct sirf_audio_codec), GFP_KERNEL); > - if (!sirf_audio_codec) > - return -ENOMEM; > - > - platform_set_drvdata(pdev, sirf_audio_codec); > - > - base =3D devm_platform_ioremap_resource(pdev, 0); > - if (IS_ERR(base)) > - return PTR_ERR(base); > - > - sirf_audio_codec->regmap =3D devm_regmap_init_mmio(&pdev->dev, ba= se, > - &sirf_audio_codec_regmap_conf= ig); > - if (IS_ERR(sirf_audio_codec->regmap)) > - return PTR_ERR(sirf_audio_codec->regmap); > - > - sirf_audio_codec->clk =3D devm_clk_get(&pdev->dev, NULL); > - if (IS_ERR(sirf_audio_codec->clk)) { > - dev_err(&pdev->dev, "Get clock failed.\n"); > - return PTR_ERR(sirf_audio_codec->clk); > - } > - > - ret =3D clk_prepare_enable(sirf_audio_codec->clk); > - if (ret) { > - dev_err(&pdev->dev, "Enable clock failed.\n"); > - return ret; > - } > - > - ret =3D devm_snd_soc_register_component(&(pdev->dev), > - &soc_codec_device_sirf_audio_codec, > - &sirf_audio_codec_dai, 1); > - if (ret) { > - dev_err(&pdev->dev, "Register Audio Codec dai failed.\n")= ; > - goto err_clk_put; > - } > - > - /* > - * Always open charge pump, if not, when the charge pump closed t= he > - * adc will not stable > - */ > - regmap_update_bits(sirf_audio_codec->regmap, AUDIO_IC_CODEC_CTRL0= , > - IC_CPFREQ, IC_CPFREQ); > - > - if (of_device_is_compatible(pdev->dev.of_node, "sirf,atlas6-audio= -codec")) > - regmap_update_bits(sirf_audio_codec->regmap, > - AUDIO_IC_CODEC_CTRL0, IC_CPEN, IC_CPEN); > - return 0; > - > -err_clk_put: > - clk_disable_unprepare(sirf_audio_codec->clk); > - return ret; > -} > - > -static int sirf_audio_codec_driver_remove(struct platform_device *pdev) > -{ > - struct sirf_audio_codec *sirf_audio_codec =3D platform_get_drvdat= a(pdev); > - > - clk_disable_unprepare(sirf_audio_codec->clk); > - > - return 0; > -} > - > -#ifdef CONFIG_PM_SLEEP > -static int sirf_audio_codec_suspend(struct device *dev) > -{ > - struct sirf_audio_codec *sirf_audio_codec =3D dev_get_drvdata(dev= ); > - > - regmap_read(sirf_audio_codec->regmap, AUDIO_IC_CODEC_CTRL0, > - &sirf_audio_codec->reg_ctrl0); > - regmap_read(sirf_audio_codec->regmap, AUDIO_IC_CODEC_CTRL1, > - &sirf_audio_codec->reg_ctrl1); > - clk_disable_unprepare(sirf_audio_codec->clk); > - > - return 0; > -} > - > -static int sirf_audio_codec_resume(struct device *dev) > -{ > - struct sirf_audio_codec *sirf_audio_codec =3D dev_get_drvdata(dev= ); > - int ret; > - > - ret =3D clk_prepare_enable(sirf_audio_codec->clk); > - if (ret) > - return ret; > - > - regmap_write(sirf_audio_codec->regmap, AUDIO_IC_CODEC_CTRL0, > - sirf_audio_codec->reg_ctrl0); > - regmap_write(sirf_audio_codec->regmap, AUDIO_IC_CODEC_CTRL1, > - sirf_audio_codec->reg_ctrl1); > - > - return 0; > -} > -#endif > - > -static const struct dev_pm_ops sirf_audio_codec_pm_ops =3D { > - SET_SYSTEM_SLEEP_PM_OPS(sirf_audio_codec_suspend, sirf_audio_code= c_resume) > -}; > - > -static struct platform_driver sirf_audio_codec_driver =3D { > - .driver =3D { > - .name =3D "sirf-audio-codec", > - .of_match_table =3D sirf_audio_codec_of_match, > - .pm =3D &sirf_audio_codec_pm_ops, > - }, > - .probe =3D sirf_audio_codec_driver_probe, > - .remove =3D sirf_audio_codec_driver_remove, > -}; > - > -module_platform_driver(sirf_audio_codec_driver); > - > -MODULE_DESCRIPTION("SiRF audio codec driver"); > -MODULE_AUTHOR("RongJun Ying "); > -MODULE_LICENSE("GPL v2"); > diff --git a/sound/soc/sirf/Kconfig b/sound/soc/sirf/Kconfig > deleted file mode 100644 > index 094a1c89c59d..000000000000 > --- a/sound/soc/sirf/Kconfig > +++ /dev/null > @@ -1,21 +0,0 @@ > -# SPDX-License-Identifier: GPL-2.0-only > -config SND_SOC_SIRF > - tristate "SoC Audio for the SiRF SoC chips" > - depends on ARCH_SIRF || COMPILE_TEST > - select SND_SOC_GENERIC_DMAENGINE_PCM > - > -config SND_SOC_SIRF_AUDIO > - tristate "SoC Audio support for SiRF internal audio codec" > - depends on SND_SOC_SIRF > - select SND_SOC_SIRF_AUDIO_CODEC > - select SND_SOC_SIRF_AUDIO_PORT > - > -config SND_SOC_SIRF_AUDIO_PORT > - select REGMAP_MMIO > - tristate > - > -config SND_SOC_SIRF_USP > - tristate "SoC Audio (I2S protocol) for SiRF SoC USP interface" > - depends on SND_SOC_SIRF > - select REGMAP_MMIO > - tristate > diff --git a/sound/soc/sirf/Makefile b/sound/soc/sirf/Makefile > deleted file mode 100644 > index 16ed11965ff9..000000000000 > --- a/sound/soc/sirf/Makefile > +++ /dev/null > @@ -1,8 +0,0 @@ > -# SPDX-License-Identifier: GPL-2.0 > -snd-soc-sirf-audio-objs :=3D sirf-audio.o > -snd-soc-sirf-audio-port-objs :=3D sirf-audio-port.o > -snd-soc-sirf-usp-objs :=3D sirf-usp.o > - > -obj-$(CONFIG_SND_SOC_SIRF_AUDIO) +=3D snd-soc-sirf-audio.o > -obj-$(CONFIG_SND_SOC_SIRF_AUDIO_PORT) +=3D snd-soc-sirf-audio-port.o > -obj-$(CONFIG_SND_SOC_SIRF_USP) +=3D snd-soc-sirf-usp.o > diff --git a/sound/soc/sirf/sirf-audio-port.c b/sound/soc/sirf/sirf-audio= -port.c > deleted file mode 100644 > index 8be2f0bc477b..000000000000 > --- a/sound/soc/sirf/sirf-audio-port.c > +++ /dev/null > @@ -1,86 +0,0 @@ > -// SPDX-License-Identifier: GPL-2.0-or-later > -/* > - * SiRF Audio port driver > - * > - * Copyright (c) 2011 Cambridge Silicon Radio Limited, a CSR plc group c= ompany. > - */ > -#include > -#include > -#include > - > -struct sirf_audio_port { > - struct regmap *regmap; > - struct snd_dmaengine_dai_dma_data playback_dma_data; > - struct snd_dmaengine_dai_dma_data capture_dma_data; > -}; > - > - > -static int sirf_audio_port_dai_probe(struct snd_soc_dai *dai) > -{ > - struct sirf_audio_port *port =3D snd_soc_dai_get_drvdata(dai); > - > - snd_soc_dai_init_dma_data(dai, &port->playback_dma_data, > - &port->capture_dma_data); > - return 0; > -} > - > -static struct snd_soc_dai_driver sirf_audio_port_dai =3D { > - .probe =3D sirf_audio_port_dai_probe, > - .name =3D "sirf-audio-port", > - .id =3D 0, > - .playback =3D { > - .channels_min =3D 2, > - .channels_max =3D 2, > - .rates =3D SNDRV_PCM_RATE_48000, > - .formats =3D SNDRV_PCM_FMTBIT_S16_LE, > - }, > - .capture =3D { > - .channels_min =3D 1, > - .channels_max =3D 2, > - .rates =3D SNDRV_PCM_RATE_48000, > - .formats =3D SNDRV_PCM_FMTBIT_S16_LE, > - }, > -}; > - > -static const struct snd_soc_component_driver sirf_audio_port_component = =3D { > - .name =3D "sirf-audio-port", > -}; > - > -static int sirf_audio_port_probe(struct platform_device *pdev) > -{ > - int ret; > - struct sirf_audio_port *port; > - > - port =3D devm_kzalloc(&pdev->dev, > - sizeof(struct sirf_audio_port), GFP_KERNEL); > - if (!port) > - return -ENOMEM; > - > - ret =3D devm_snd_soc_register_component(&pdev->dev, > - &sirf_audio_port_component, &sirf_audio_port_dai,= 1); > - if (ret) > - return ret; > - > - platform_set_drvdata(pdev, port); > - return devm_snd_dmaengine_pcm_register(&pdev->dev, NULL, 0); > -} > - > -static const struct of_device_id sirf_audio_port_of_match[] =3D { > - { .compatible =3D "sirf,audio-port", }, > - {} > -}; > -MODULE_DEVICE_TABLE(of, sirf_audio_port_of_match); > - > -static struct platform_driver sirf_audio_port_driver =3D { > - .driver =3D { > - .name =3D "sirf-audio-port", > - .of_match_table =3D sirf_audio_port_of_match, > - }, > - .probe =3D sirf_audio_port_probe, > -}; > - > -module_platform_driver(sirf_audio_port_driver); > - > -MODULE_DESCRIPTION("SiRF Audio Port driver"); > -MODULE_AUTHOR("RongJun Ying "); > -MODULE_LICENSE("GPL v2"); > diff --git a/sound/soc/sirf/sirf-audio.c b/sound/soc/sirf/sirf-audio.c > deleted file mode 100644 > index c923b6772b22..000000000000 > --- a/sound/soc/sirf/sirf-audio.c > +++ /dev/null > @@ -1,160 +0,0 @@ > -// SPDX-License-Identifier: GPL-2.0-or-later > -/* > - * SiRF audio card driver > - * > - * Copyright (c) 2011 Cambridge Silicon Radio Limited, a CSR plc group c= ompany. > - */ > - > -#include > -#include > -#include > -#include > -#include > -#include > -#include > -#include > - > -struct sirf_audio_card { > - unsigned int gpio_hp_pa; > - unsigned int gpio_spk_pa; > -}; > - > -static int sirf_audio_hp_event(struct snd_soc_dapm_widget *w, > - struct snd_kcontrol *ctrl, int event) > -{ > - struct snd_soc_dapm_context *dapm =3D w->dapm; > - struct snd_soc_card *card =3D dapm->card; > - struct sirf_audio_card *sirf_audio_card =3D snd_soc_card_get_drvd= ata(card); > - int on =3D !SND_SOC_DAPM_EVENT_OFF(event); > - > - if (gpio_is_valid(sirf_audio_card->gpio_hp_pa)) > - gpio_set_value(sirf_audio_card->gpio_hp_pa, on); > - return 0; > -} > - > -static int sirf_audio_spk_event(struct snd_soc_dapm_widget *w, > - struct snd_kcontrol *ctrl, int event) > -{ > - struct snd_soc_dapm_context *dapm =3D w->dapm; > - struct snd_soc_card *card =3D dapm->card; > - struct sirf_audio_card *sirf_audio_card =3D snd_soc_card_get_drvd= ata(card); > - int on =3D !SND_SOC_DAPM_EVENT_OFF(event); > - > - if (gpio_is_valid(sirf_audio_card->gpio_spk_pa)) > - gpio_set_value(sirf_audio_card->gpio_spk_pa, on); > - > - return 0; > -} > -static const struct snd_soc_dapm_widget sirf_audio_dapm_widgets[] =3D { > - SND_SOC_DAPM_HP("Hp", sirf_audio_hp_event), > - SND_SOC_DAPM_SPK("Ext Spk", sirf_audio_spk_event), > - SND_SOC_DAPM_MIC("Ext Mic", NULL), > -}; > - > -static const struct snd_soc_dapm_route intercon[] =3D { > - {"Hp", NULL, "HPOUTL"}, > - {"Hp", NULL, "HPOUTR"}, > - {"Ext Spk", NULL, "SPKOUT"}, > - {"MICIN1", NULL, "Mic Bias"}, > - {"Mic Bias", NULL, "Ext Mic"}, > -}; > - > -/* Digital audio interface glue - connects codec <--> CPU */ > -SND_SOC_DAILINK_DEFS(sirf, > - DAILINK_COMP_ARRAY(COMP_EMPTY()), > - DAILINK_COMP_ARRAY(COMP_CODEC(NULL, "sirf-audio-codec")), > - DAILINK_COMP_ARRAY(COMP_EMPTY())); > - > -static struct snd_soc_dai_link sirf_audio_dai_link[] =3D { > - { > - .name =3D "SiRF audio card", > - .stream_name =3D "SiRF audio HiFi", > - SND_SOC_DAILINK_REG(sirf), > - }, > -}; > - > -/* Audio machine driver */ > -static struct snd_soc_card snd_soc_sirf_audio_card =3D { > - .name =3D "SiRF audio card", > - .owner =3D THIS_MODULE, > - .dai_link =3D sirf_audio_dai_link, > - .num_links =3D ARRAY_SIZE(sirf_audio_dai_link), > - .dapm_widgets =3D sirf_audio_dapm_widgets, > - .num_dapm_widgets =3D ARRAY_SIZE(sirf_audio_dapm_widgets), > - .dapm_routes =3D intercon, > - .num_dapm_routes =3D ARRAY_SIZE(intercon), > -}; > - > -static int sirf_audio_probe(struct platform_device *pdev) > -{ > - struct snd_soc_card *card =3D &snd_soc_sirf_audio_card; > - struct sirf_audio_card *sirf_audio_card; > - int ret; > - > - sirf_audio_card =3D devm_kzalloc(&pdev->dev, sizeof(struct sirf_a= udio_card), > - GFP_KERNEL); > - if (sirf_audio_card =3D=3D NULL) > - return -ENOMEM; > - > - sirf_audio_dai_link[0].cpus->of_node =3D > - of_parse_phandle(pdev->dev.of_node, "sirf,audio-platform"= , 0); > - sirf_audio_dai_link[0].platforms->of_node =3D > - of_parse_phandle(pdev->dev.of_node, "sirf,audio-platform"= , 0); > - sirf_audio_dai_link[0].codecs->of_node =3D > - of_parse_phandle(pdev->dev.of_node, "sirf,audio-codec", 0= ); > - sirf_audio_card->gpio_spk_pa =3D of_get_named_gpio(pdev->dev.of_n= ode, > - "spk-pa-gpios", 0); > - sirf_audio_card->gpio_hp_pa =3D of_get_named_gpio(pdev->dev.of_n= ode, > - "hp-pa-gpios", 0); > - if (gpio_is_valid(sirf_audio_card->gpio_spk_pa)) { > - ret =3D devm_gpio_request_one(&pdev->dev, > - sirf_audio_card->gpio_spk_pa, > - GPIOF_OUT_INIT_LOW, "SPA_PA_SD"); > - if (ret) { > - dev_err(&pdev->dev, > - "Failed to request GPIO_%d for reset: %d\= n", > - sirf_audio_card->gpio_spk_pa, ret); > - return ret; > - } > - } > - if (gpio_is_valid(sirf_audio_card->gpio_hp_pa)) { > - ret =3D devm_gpio_request_one(&pdev->dev, > - sirf_audio_card->gpio_hp_pa, > - GPIOF_OUT_INIT_LOW, "HP_PA_SD"); > - if (ret) { > - dev_err(&pdev->dev, > - "Failed to request GPIO_%d for reset: %d\= n", > - sirf_audio_card->gpio_hp_pa, ret); > - return ret; > - } > - } > - > - card->dev =3D &pdev->dev; > - snd_soc_card_set_drvdata(card, sirf_audio_card); > - > - ret =3D devm_snd_soc_register_card(&pdev->dev, card); > - if (ret) > - dev_err(&pdev->dev, "snd_soc_register_card() failed:%d\n"= , ret); > - > - return ret; > -} > - > -static const struct of_device_id sirf_audio_of_match[] =3D { > - {.compatible =3D "sirf,sirf-audio-card", }, > - { }, > -}; > -MODULE_DEVICE_TABLE(of, sirf_audio_of_match); > - > -static struct platform_driver sirf_audio_driver =3D { > - .driver =3D { > - .name =3D "sirf-audio-card", > - .pm =3D &snd_soc_pm_ops, > - .of_match_table =3D sirf_audio_of_match, > - }, > - .probe =3D sirf_audio_probe, > -}; > -module_platform_driver(sirf_audio_driver); > - > -MODULE_AUTHOR("RongJun Ying "); > -MODULE_DESCRIPTION("ALSA SoC SIRF audio card driver"); > -MODULE_LICENSE("GPL v2"); > diff --git a/sound/soc/sirf/sirf-usp.c b/sound/soc/sirf/sirf-usp.c > deleted file mode 100644 > index 2af0c6f14ee6..000000000000 > --- a/sound/soc/sirf/sirf-usp.c > +++ /dev/null > @@ -1,435 +0,0 @@ > -// SPDX-License-Identifier: GPL-2.0-or-later > -/* > - * SiRF USP in I2S/DSP mode > - * > - * Copyright (c) 2011 Cambridge Silicon Radio Limited, a CSR plc group c= ompany. > - */ > -#include > -#include > -#include > -#include > -#include > -#include > -#include > -#include > - > -#include "sirf-usp.h" > - > -struct sirf_usp { > - struct regmap *regmap; > - struct clk *clk; > - u32 mode1_reg; > - u32 mode2_reg; > - int daifmt_format; > - struct snd_dmaengine_dai_dma_data playback_dma_data; > - struct snd_dmaengine_dai_dma_data capture_dma_data; > -}; > - > -static void sirf_usp_tx_enable(struct sirf_usp *usp) > -{ > - regmap_update_bits(usp->regmap, USP_TX_FIFO_OP, > - USP_TX_FIFO_RESET, USP_TX_FIFO_RESET); > - regmap_write(usp->regmap, USP_TX_FIFO_OP, 0); > - > - regmap_update_bits(usp->regmap, USP_TX_FIFO_OP, > - USP_TX_FIFO_START, USP_TX_FIFO_START); > - > - regmap_update_bits(usp->regmap, USP_TX_RX_ENABLE, > - USP_TX_ENA, USP_TX_ENA); > -} > - > -static void sirf_usp_tx_disable(struct sirf_usp *usp) > -{ > - regmap_update_bits(usp->regmap, USP_TX_RX_ENABLE, > - USP_TX_ENA, ~USP_TX_ENA); > - /* FIFO stop */ > - regmap_write(usp->regmap, USP_TX_FIFO_OP, 0); > -} > - > -static void sirf_usp_rx_enable(struct sirf_usp *usp) > -{ > - regmap_update_bits(usp->regmap, USP_RX_FIFO_OP, > - USP_RX_FIFO_RESET, USP_RX_FIFO_RESET); > - regmap_write(usp->regmap, USP_RX_FIFO_OP, 0); > - > - regmap_update_bits(usp->regmap, USP_RX_FIFO_OP, > - USP_RX_FIFO_START, USP_RX_FIFO_START); > - > - regmap_update_bits(usp->regmap, USP_TX_RX_ENABLE, > - USP_RX_ENA, USP_RX_ENA); > -} > - > -static void sirf_usp_rx_disable(struct sirf_usp *usp) > -{ > - regmap_update_bits(usp->regmap, USP_TX_RX_ENABLE, > - USP_RX_ENA, ~USP_RX_ENA); > - /* FIFO stop */ > - regmap_write(usp->regmap, USP_RX_FIFO_OP, 0); > -} > - > -static int sirf_usp_pcm_dai_probe(struct snd_soc_dai *dai) > -{ > - struct sirf_usp *usp =3D snd_soc_dai_get_drvdata(dai); > - > - snd_soc_dai_init_dma_data(dai, &usp->playback_dma_data, > - &usp->capture_dma_data); > - return 0; > -} > - > -static int sirf_usp_pcm_set_dai_fmt(struct snd_soc_dai *dai, > - unsigned int fmt) > -{ > - struct sirf_usp *usp =3D snd_soc_dai_get_drvdata(dai); > - > - /* set master/slave audio interface */ > - switch (fmt & SND_SOC_DAIFMT_MASTER_MASK) { > - case SND_SOC_DAIFMT_CBM_CFM: > - break; > - default: > - dev_err(dai->dev, "Only CBM and CFM supported\n"); > - return -EINVAL; > - } > - > - switch (fmt & SND_SOC_DAIFMT_FORMAT_MASK) { > - case SND_SOC_DAIFMT_I2S: > - case SND_SOC_DAIFMT_DSP_A: > - usp->daifmt_format =3D (fmt & SND_SOC_DAIFMT_FORMAT_MASK)= ; > - break; > - default: > - dev_err(dai->dev, "Only I2S and DSP_A format supported\n"= ); > - return -EINVAL; > - } > - > - switch (fmt & SND_SOC_DAIFMT_INV_MASK) { > - case SND_SOC_DAIFMT_NB_NF: > - break; > - case SND_SOC_DAIFMT_IB_NF: > - usp->daifmt_format |=3D (fmt & SND_SOC_DAIFMT_INV_MASK); > - break; > - default: > - return -EINVAL; > - } > - > - return 0; > -} > - > -static void sirf_usp_i2s_init(struct sirf_usp *usp) > -{ > - /* Configure RISC mode */ > - regmap_update_bits(usp->regmap, USP_RISC_DSP_MODE, > - USP_RISC_DSP_SEL, ~USP_RISC_DSP_SEL); > - > - /* > - * Configure DMA IO Length register > - * Set no limit, USP can receive data continuously until it is di= abled > - */ > - regmap_write(usp->regmap, USP_TX_DMA_IO_LEN, 0); > - regmap_write(usp->regmap, USP_RX_DMA_IO_LEN, 0); > - > - /* Configure Mode2 register */ > - regmap_write(usp->regmap, USP_MODE2, (1 << USP_RXD_DELAY_LEN_OFFS= ET) | > - (0 << USP_TXD_DELAY_LEN_OFFSET) | > - USP_TFS_CLK_SLAVE_MODE | USP_RFS_CLK_SLAVE_MODE); > - > - /* Configure Mode1 register */ > - regmap_write(usp->regmap, USP_MODE1, > - USP_SYNC_MODE | USP_EN | USP_TXD_ACT_EDGE_FALLING | > - USP_RFS_ACT_LEVEL_LOGIC1 | USP_TFS_ACT_LEVEL_LOGIC1 | > - USP_TX_UFLOW_REPEAT_ZERO | USP_CLOCK_MODE_SLAVE); > - > - /* Configure RX DMA IO Control register */ > - regmap_write(usp->regmap, USP_RX_DMA_IO_CTRL, 0); > - > - /* Congiure RX FIFO Control register */ > - regmap_write(usp->regmap, USP_RX_FIFO_CTRL, > - (USP_RX_FIFO_THRESHOLD << USP_RX_FIFO_THD_OFFSET) | > - (USP_TX_RX_FIFO_WIDTH_DWORD << USP_RX_FIFO_WIDTH_OFFSET))= ; > - > - /* Congiure RX FIFO Level Check register */ > - regmap_write(usp->regmap, USP_RX_FIFO_LEVEL_CHK, > - RX_FIFO_SC(0x04) | RX_FIFO_LC(0x0E) | RX_FIFO_HC(0x1B)); > - > - /* Configure TX DMA IO Control register*/ > - regmap_write(usp->regmap, USP_TX_DMA_IO_CTRL, 0); > - > - /* Configure TX FIFO Control register */ > - regmap_write(usp->regmap, USP_TX_FIFO_CTRL, > - (USP_TX_FIFO_THRESHOLD << USP_TX_FIFO_THD_OFFSET) | > - (USP_TX_RX_FIFO_WIDTH_DWORD << USP_TX_FIFO_WIDTH_OFFSET))= ; > - /* Congiure TX FIFO Level Check register */ > - regmap_write(usp->regmap, USP_TX_FIFO_LEVEL_CHK, > - TX_FIFO_SC(0x1B) | TX_FIFO_LC(0x0E) | TX_FIFO_HC(0x04)); > -} > - > -static int sirf_usp_pcm_hw_params(struct snd_pcm_substream *substream, > - struct snd_pcm_hw_params *params, struct snd_soc_dai *dai= ) > -{ > - struct sirf_usp *usp =3D snd_soc_dai_get_drvdata(dai); > - u32 data_len, frame_len, shifter_len; > - > - switch (params_format(params)) { > - case SNDRV_PCM_FORMAT_S16_LE: > - data_len =3D 16; > - frame_len =3D 16; > - break; > - case SNDRV_PCM_FORMAT_S24_LE: > - data_len =3D 24; > - frame_len =3D 32; > - break; > - case SNDRV_PCM_FORMAT_S24_3LE: > - data_len =3D 24; > - frame_len =3D 24; > - break; > - default: > - dev_err(dai->dev, "Format unsupported\n"); > - return -EINVAL; > - } > - > - shifter_len =3D data_len; > - > - switch (usp->daifmt_format & SND_SOC_DAIFMT_FORMAT_MASK) { > - case SND_SOC_DAIFMT_I2S: > - regmap_update_bits(usp->regmap, USP_RX_FRAME_CTRL, > - USP_I2S_SYNC_CHG, USP_I2S_SYNC_CHG); > - break; > - case SND_SOC_DAIFMT_DSP_A: > - regmap_update_bits(usp->regmap, USP_RX_FRAME_CTRL, > - USP_I2S_SYNC_CHG, 0); > - frame_len =3D data_len * params_channels(params); > - data_len =3D frame_len; > - break; > - default: > - dev_err(dai->dev, "Only support I2S and DSP_A mode\n"); > - return -EINVAL; > - } > - > - switch (usp->daifmt_format & SND_SOC_DAIFMT_INV_MASK) { > - case SND_SOC_DAIFMT_NB_NF: > - break; > - case SND_SOC_DAIFMT_IB_NF: > - regmap_update_bits(usp->regmap, USP_MODE1, > - USP_RXD_ACT_EDGE_FALLING | USP_TXD_ACT_EDGE_FALLI= NG, > - USP_RXD_ACT_EDGE_FALLING); > - break; > - default: > - return -EINVAL; > - } > - > - if (substream->stream =3D=3D SNDRV_PCM_STREAM_PLAYBACK) > - regmap_update_bits(usp->regmap, USP_TX_FRAME_CTRL, > - USP_TXC_DATA_LEN_MASK | USP_TXC_FRAME_LEN_MASK > - | USP_TXC_SHIFTER_LEN_MASK | USP_TXC_SLAVE_CLK_SA= MPLE, > - ((data_len - 1) << USP_TXC_DATA_LEN_OFFSET) > - | ((frame_len - 1) << USP_TXC_FRAME_LEN_OFFSET) > - | ((shifter_len - 1) << USP_TXC_SHIFTER_LEN_OFFSE= T) > - | USP_TXC_SLAVE_CLK_SAMPLE); > - else > - regmap_update_bits(usp->regmap, USP_RX_FRAME_CTRL, > - USP_RXC_DATA_LEN_MASK | USP_RXC_FRAME_LEN_MASK > - | USP_RXC_SHIFTER_LEN_MASK | USP_SINGLE_SYNC_MODE= , > - ((data_len - 1) << USP_RXC_DATA_LEN_OFFSET) > - | ((frame_len - 1) << USP_RXC_FRAME_LEN_OFFSET) > - | ((shifter_len - 1) << USP_RXC_SHIFTER_LEN_OFFSE= T) > - | USP_SINGLE_SYNC_MODE); > - > - return 0; > -} > - > -static int sirf_usp_pcm_trigger(struct snd_pcm_substream *substream, int= cmd, > - struct snd_soc_dai *dai) > -{ > - struct sirf_usp *usp =3D snd_soc_dai_get_drvdata(dai); > - > - switch (cmd) { > - case SNDRV_PCM_TRIGGER_START: > - case SNDRV_PCM_TRIGGER_RESUME: > - case SNDRV_PCM_TRIGGER_PAUSE_RELEASE: > - if (substream->stream =3D=3D SNDRV_PCM_STREAM_PLAYBACK) > - sirf_usp_tx_enable(usp); > - else > - sirf_usp_rx_enable(usp); > - break; > - case SNDRV_PCM_TRIGGER_STOP: > - case SNDRV_PCM_TRIGGER_SUSPEND: > - case SNDRV_PCM_TRIGGER_PAUSE_PUSH: > - if (substream->stream =3D=3D SNDRV_PCM_STREAM_PLAYBACK) > - sirf_usp_tx_disable(usp); > - else > - sirf_usp_rx_disable(usp); > - break; > - } > - > - return 0; > -} > - > -static const struct snd_soc_dai_ops sirf_usp_pcm_dai_ops =3D { > - .trigger =3D sirf_usp_pcm_trigger, > - .set_fmt =3D sirf_usp_pcm_set_dai_fmt, > - .hw_params =3D sirf_usp_pcm_hw_params, > -}; > - > -static struct snd_soc_dai_driver sirf_usp_pcm_dai =3D { > - .probe =3D sirf_usp_pcm_dai_probe, > - .name =3D "sirf-usp-pcm", > - .id =3D 0, > - .playback =3D { > - .stream_name =3D "SiRF USP PCM Playback", > - .channels_min =3D 1, > - .channels_max =3D 2, > - .rates =3D SNDRV_PCM_RATE_8000_192000, > - .formats =3D SNDRV_PCM_FMTBIT_S16_LE | SNDRV_PCM_FMTBIT_S= 24_LE | > - SNDRV_PCM_FMTBIT_S24_3LE, > - }, > - .capture =3D { > - .stream_name =3D "SiRF USP PCM Capture", > - .channels_min =3D 1, > - .channels_max =3D 2, > - .rates =3D SNDRV_PCM_RATE_8000_192000, > - .formats =3D SNDRV_PCM_FMTBIT_S16_LE | SNDRV_PCM_FMTBIT_S= 24_LE | > - SNDRV_PCM_FMTBIT_S24_3LE, > - }, > - .ops =3D &sirf_usp_pcm_dai_ops, > -}; > - > -static int sirf_usp_pcm_runtime_suspend(struct device *dev) > -{ > - struct sirf_usp *usp =3D dev_get_drvdata(dev); > - > - clk_disable_unprepare(usp->clk); > - return 0; > -} > - > -static int sirf_usp_pcm_runtime_resume(struct device *dev) > -{ > - struct sirf_usp *usp =3D dev_get_drvdata(dev); > - int ret; > - > - ret =3D clk_prepare_enable(usp->clk); > - if (ret) { > - dev_err(dev, "clk_enable failed: %d\n", ret); > - return ret; > - } > - sirf_usp_i2s_init(usp); > - return 0; > -} > - > -#ifdef CONFIG_PM_SLEEP > -static int sirf_usp_pcm_suspend(struct device *dev) > -{ > - struct sirf_usp *usp =3D dev_get_drvdata(dev); > - > - if (!pm_runtime_status_suspended(dev)) { > - regmap_read(usp->regmap, USP_MODE1, &usp->mode1_reg); > - regmap_read(usp->regmap, USP_MODE2, &usp->mode2_reg); > - sirf_usp_pcm_runtime_suspend(dev); > - } > - return 0; > -} > - > -static int sirf_usp_pcm_resume(struct device *dev) > -{ > - struct sirf_usp *usp =3D dev_get_drvdata(dev); > - int ret; > - > - if (!pm_runtime_status_suspended(dev)) { > - ret =3D sirf_usp_pcm_runtime_resume(dev); > - if (ret) > - return ret; > - regmap_write(usp->regmap, USP_MODE1, usp->mode1_reg); > - regmap_write(usp->regmap, USP_MODE2, usp->mode2_reg); > - } > - return 0; > -} > -#endif > - > -static const struct snd_soc_component_driver sirf_usp_component =3D { > - .name =3D "sirf-usp", > -}; > - > -static const struct regmap_config sirf_usp_regmap_config =3D { > - .reg_bits =3D 32, > - .reg_stride =3D 4, > - .val_bits =3D 32, > - .max_register =3D USP_RX_FIFO_DATA, > - .cache_type =3D REGCACHE_NONE, > -}; > - > -static int sirf_usp_pcm_probe(struct platform_device *pdev) > -{ > - int ret; > - struct sirf_usp *usp; > - void __iomem *base; > - > - usp =3D devm_kzalloc(&pdev->dev, sizeof(struct sirf_usp), > - GFP_KERNEL); > - if (!usp) > - return -ENOMEM; > - > - platform_set_drvdata(pdev, usp); > - > - base =3D devm_platform_ioremap_resource(pdev, 0); > - if (IS_ERR(base)) > - return PTR_ERR(base); > - usp->regmap =3D devm_regmap_init_mmio(&pdev->dev, base, > - &sirf_usp_regmap_config); > - if (IS_ERR(usp->regmap)) > - return PTR_ERR(usp->regmap); > - > - usp->clk =3D devm_clk_get(&pdev->dev, NULL); > - if (IS_ERR(usp->clk)) { > - dev_err(&pdev->dev, "Get clock failed.\n"); > - return PTR_ERR(usp->clk); > - } > - > - pm_runtime_enable(&pdev->dev); > - if (!pm_runtime_enabled(&pdev->dev)) { > - ret =3D sirf_usp_pcm_runtime_resume(&pdev->dev); > - if (ret) > - return ret; > - } > - > - ret =3D devm_snd_soc_register_component(&pdev->dev, &sirf_usp_com= ponent, > - &sirf_usp_pcm_dai, 1); > - if (ret) { > - dev_err(&pdev->dev, "Register Audio SoC dai failed.\n"); > - return ret; > - } > - return devm_snd_dmaengine_pcm_register(&pdev->dev, NULL, 0); > -} > - > -static int sirf_usp_pcm_remove(struct platform_device *pdev) > -{ > - if (!pm_runtime_enabled(&pdev->dev)) > - sirf_usp_pcm_runtime_suspend(&pdev->dev); > - else > - pm_runtime_disable(&pdev->dev); > - return 0; > -} > - > -static const struct of_device_id sirf_usp_pcm_of_match[] =3D { > - { .compatible =3D "sirf,prima2-usp-pcm", }, > - {} > -}; > -MODULE_DEVICE_TABLE(of, sirf_usp_pcm_of_match); > - > -static const struct dev_pm_ops sirf_usp_pcm_pm_ops =3D { > - SET_RUNTIME_PM_OPS(sirf_usp_pcm_runtime_suspend, > - sirf_usp_pcm_runtime_resume, NULL) > - SET_SYSTEM_SLEEP_PM_OPS(sirf_usp_pcm_suspend, sirf_usp_pcm_resume= ) > -}; > - > -static struct platform_driver sirf_usp_pcm_driver =3D { > - .driver =3D { > - .name =3D "sirf-usp-pcm", > - .of_match_table =3D sirf_usp_pcm_of_match, > - .pm =3D &sirf_usp_pcm_pm_ops, > - }, > - .probe =3D sirf_usp_pcm_probe, > - .remove =3D sirf_usp_pcm_remove, > -}; > - > -module_platform_driver(sirf_usp_pcm_driver); > - > -MODULE_DESCRIPTION("SiRF SoC USP PCM bus driver"); > -MODULE_AUTHOR("RongJun Ying "); > -MODULE_LICENSE("GPL v2"); > diff --git a/sound/soc/sirf/sirf-usp.h b/sound/soc/sirf/sirf-usp.h > deleted file mode 100644 > index 08993b5992c4..000000000000 > --- a/sound/soc/sirf/sirf-usp.h > +++ /dev/null > @@ -1,292 +0,0 @@ > -/* SPDX-License-Identifier: GPL-2.0-or-later */ > -/* > - * arch/arm/mach-prima2/include/mach/sirfsoc_usp.h > - * > - * Copyright (c) 2011 Cambridge Silicon Radio Limited, a CSR plc group c= ompany. > - */ > - > -#ifndef _SIRF_USP_H > -#define _SIRF_USP_H > - > -/* USP Registers */ > -#define USP_MODE1 0x00 > -#define USP_MODE2 0x04 > -#define USP_TX_FRAME_CTRL 0x08 > -#define USP_RX_FRAME_CTRL 0x0C > -#define USP_TX_RX_ENABLE 0x10 > -#define USP_INT_ENABLE 0x14 > -#define USP_INT_STATUS 0x18 > -#define USP_PIN_IO_DATA 0x1C > -#define USP_RISC_DSP_MODE 0x20 > -#define USP_AYSNC_PARAM_REG 0x24 > -#define USP_IRDA_X_MODE_DIV 0x28 > -#define USP_SM_CFG 0x2C > -#define USP_TX_DMA_IO_CTRL 0x100 > -#define USP_TX_DMA_IO_LEN 0x104 > -#define USP_TX_FIFO_CTRL 0x108 > -#define USP_TX_FIFO_LEVEL_CHK 0x10C > -#define USP_TX_FIFO_OP 0x110 > -#define USP_TX_FIFO_STATUS 0x114 > -#define USP_TX_FIFO_DATA 0x118 > -#define USP_RX_DMA_IO_CTRL 0x120 > -#define USP_RX_DMA_IO_LEN 0x124 > -#define USP_RX_FIFO_CTRL 0x128 > -#define USP_RX_FIFO_LEVEL_CHK 0x12C > -#define USP_RX_FIFO_OP 0x130 > -#define USP_RX_FIFO_STATUS 0x134 > -#define USP_RX_FIFO_DATA 0x138 > - > -/* USP MODE register-1 */ > -#define USP_SYNC_MODE 0x00000001 > -#define USP_CLOCK_MODE_SLAVE 0x00000002 > -#define USP_LOOP_BACK_EN 0x00000004 > -#define USP_HPSIR_EN 0x00000008 > -#define USP_ENDIAN_CTRL_LSBF 0x00000010 > -#define USP_EN 0x00000020 > -#define USP_RXD_ACT_EDGE_FALLING 0x00000040 > -#define USP_TXD_ACT_EDGE_FALLING 0x00000080 > -#define USP_RFS_ACT_LEVEL_LOGIC1 0x00000100 > -#define USP_TFS_ACT_LEVEL_LOGIC1 0x00000200 > -#define USP_SCLK_IDLE_MODE_TOGGLE 0x00000400 > -#define USP_SCLK_IDLE_LEVEL_LOGIC1 0x00000800 > -#define USP_SCLK_PIN_MODE_IO 0x00001000 > -#define USP_RFS_PIN_MODE_IO 0x00002000 > -#define USP_TFS_PIN_MODE_IO 0x00004000 > -#define USP_RXD_PIN_MODE_IO 0x00008000 > -#define USP_TXD_PIN_MODE_IO 0x00010000 > -#define USP_SCLK_IO_MODE_INPUT 0x00020000 > -#define USP_RFS_IO_MODE_INPUT 0x00040000 > -#define USP_TFS_IO_MODE_INPUT 0x00080000 > -#define USP_RXD_IO_MODE_INPUT 0x00100000 > -#define USP_TXD_IO_MODE_INPUT 0x00200000 > -#define USP_IRDA_WIDTH_DIV_MASK 0x3FC00000 > -#define USP_IRDA_WIDTH_DIV_OFFSET 0 > -#define USP_IRDA_IDLE_LEVEL_HIGH 0x40000000 > -#define USP_TX_UFLOW_REPEAT_ZERO 0x80000000 > -#define USP_TX_ENDIAN_MODE 0x00000020 > -#define USP_RX_ENDIAN_MODE 0x00000020 > - > -/* USP Mode Register-2 */ > -#define USP_RXD_DELAY_LEN_MASK 0x000000FF > -#define USP_RXD_DELAY_LEN_OFFSET 0 > - > -#define USP_TXD_DELAY_LEN_MASK 0x0000FF00 > -#define USP_TXD_DELAY_LEN_OFFSET 8 > - > -#define USP_ENA_CTRL_MODE 0x00010000 > -#define USP_FRAME_CTRL_MODE 0x00020000 > -#define USP_TFS_SOURCE_MODE 0x00040000 > -#define USP_TFS_MS_MODE 0x00080000 > -#define USP_CLK_DIVISOR_MASK 0x7FE00000 > -#define USP_CLK_DIVISOR_OFFSET 21 > - > -#define USP_TFS_CLK_SLAVE_MODE (1<<20) > -#define USP_RFS_CLK_SLAVE_MODE (1<<19) > - > -#define USP_IRDA_DATA_WIDTH 0x80000000 > - > -/* USP Transmit Frame Control Register */ > - > -#define USP_TXC_DATA_LEN_MASK 0x000000FF > -#define USP_TXC_DATA_LEN_OFFSET 0 > - > -#define USP_TXC_SYNC_LEN_MASK 0x0000FF00 > -#define USP_TXC_SYNC_LEN_OFFSET 8 > - > -#define USP_TXC_FRAME_LEN_MASK 0x00FF0000 > -#define USP_TXC_FRAME_LEN_OFFSET 16 > - > -#define USP_TXC_SHIFTER_LEN_MASK 0x1F000000 > -#define USP_TXC_SHIFTER_LEN_OFFSET 24 > - > -#define USP_TXC_SLAVE_CLK_SAMPLE 0x20000000 > - > -#define USP_TXC_CLK_DIVISOR_MASK 0xC0000000 > -#define USP_TXC_CLK_DIVISOR_OFFSET 30 > - > -/* USP Receive Frame Control Register */ > - > -#define USP_RXC_DATA_LEN_MASK 0x000000FF > -#define USP_RXC_DATA_LEN_OFFSET 0 > - > -#define USP_RXC_FRAME_LEN_MASK 0x0000FF00 > -#define USP_RXC_FRAME_LEN_OFFSET 8 > - > -#define USP_RXC_SHIFTER_LEN_MASK 0x001F0000 > -#define USP_RXC_SHIFTER_LEN_OFFSET 16 > - > -#define USP_START_EDGE_MODE 0x00800000 > -#define USP_I2S_SYNC_CHG 0x00200000 > - > -#define USP_RXC_CLK_DIVISOR_MASK 0x0F000000 > -#define USP_RXC_CLK_DIVISOR_OFFSET 24 > -#define USP_SINGLE_SYNC_MODE 0x00400000 > - > -/* Tx - RX Enable Register */ > - > -#define USP_RX_ENA 0x00000001 > -#define USP_TX_ENA 0x00000002 > - > -/* USP Interrupt Enable and status Register */ > -#define USP_RX_DONE_INT 0x00000001 > -#define USP_TX_DONE_INT 0x00000002 > -#define USP_RX_OFLOW_INT 0x00000004 > -#define USP_TX_UFLOW_INT 0x00000008 > -#define USP_RX_IO_DMA_INT 0x00000010 > -#define USP_TX_IO_DMA_INT 0x00000020 > -#define USP_RXFIFO_FULL_INT 0x00000040 > -#define USP_TXFIFO_EMPTY_INT 0x00000080 > -#define USP_RXFIFO_THD_INT 0x00000100 > -#define USP_TXFIFO_THD_INT 0x00000200 > -#define USP_UART_FRM_ERR_INT 0x00000400 > -#define USP_RX_TIMEOUT_INT 0x00000800 > -#define USP_TX_ALLOUT_INT 0x00001000 > -#define USP_RXD_BREAK_INT 0x00008000 > - > -/* All possible TX interruots */ > -#define USP_TX_INTERRUPT (USP_TX_DONE_INT|USP_TX_UFLOW_INT= |\ > - USP_TX_IO_DMA_INT|\ > - USP_TXFIFO_EMPTY_INT|\ > - USP_TXFIFO_THD_INT) > -/* All possible RX interruots */ > -#define USP_RX_INTERRUPT (USP_RX_DONE_INT|USP_RX_OFLOW_INT= |\ > - USP_RX_IO_DMA_INT|\ > - USP_RXFIFO_FULL_INT|\ > - USP_RXFIFO_THD_INT|\ > - USP_RX_TIMEOUT_INT) > - > -#define USP_INT_ALL 0x1FFF > - > -/* USP Pin I/O Data Register */ > - > -#define USP_RFS_PIN_VALUE_MASK 0x00000001 > -#define USP_TFS_PIN_VALUE_MASK 0x00000002 > -#define USP_RXD_PIN_VALUE_MASK 0x00000004 > -#define USP_TXD_PIN_VALUE_MASK 0x00000008 > -#define USP_SCLK_PIN_VALUE_MASK 0x00000010 > - > -/* USP RISC/DSP Mode Register */ > -#define USP_RISC_DSP_SEL 0x00000001 > - > -/* USP ASYNC PARAMETER Register*/ > - > -#define USP_ASYNC_TIMEOUT_MASK 0x0000FFFF > -#define USP_ASYNC_TIMEOUT_OFFSET 0 > -#define USP_ASYNC_TIMEOUT(x) (((x)&USP_ASYNC_TIMEOUT_MASK) \ > - < - > -#define USP_ASYNC_DIV2_MASK 0x003F0000 > -#define USP_ASYNC_DIV2_OFFSET 16 > - > -/* USP TX DMA I/O MODE Register */ > -#define USP_TX_MODE_IO 0x00000001 > - > -/* USP TX DMA I/O Length Register */ > -#define USP_TX_DATA_LEN_MASK 0xFFFFFFFF > -#define USP_TX_DATA_LEN_OFFSET 0 > - > -/* USP TX FIFO Control Register */ > -#define USP_TX_FIFO_WIDTH_MASK 0x00000003 > -#define USP_TX_FIFO_WIDTH_OFFSET 0 > - > -#define USP_TX_FIFO_THD_MASK 0x000001FC > -#define USP_TX_FIFO_THD_OFFSET 2 > - > -/* USP TX FIFO Level Check Register */ > -#define USP_TX_FIFO_LEVEL_CHECK_MASK 0x1F > -#define USP_TX_FIFO_SC_OFFSET 0 > -#define USP_TX_FIFO_LC_OFFSET 10 > -#define USP_TX_FIFO_HC_OFFSET 20 > - > -#define TX_FIFO_SC(x) (((x) & USP_TX_FIFO_LEVEL_CHECK_MASK) \ > - << USP_TX_FIFO_SC_OFFSET) > -#define TX_FIFO_LC(x) (((x) & USP_TX_FIFO_LEVEL_CHECK_MASK) \ > - << USP_TX_FIFO_LC_OFFSET) > -#define TX_FIFO_HC(x) (((x) & USP_TX_FIFO_LEVEL_CHECK_MASK) \ > - << USP_TX_FIFO_HC_OFFSET) > - > -/* USP TX FIFO Operation Register */ > -#define USP_TX_FIFO_RESET 0x00000001 > -#define USP_TX_FIFO_START 0x00000002 > - > -/* USP TX FIFO Status Register */ > -#define USP_TX_FIFO_LEVEL_MASK 0x0000007F > -#define USP_TX_FIFO_LEVEL_OFFSET 0 > - > -#define USP_TX_FIFO_FULL 0x00000080 > -#define USP_TX_FIFO_EMPTY 0x00000100 > - > -/* USP TX FIFO Data Register */ > -#define USP_TX_FIFO_DATA_MASK 0xFFFFFFFF > -#define USP_TX_FIFO_DATA_OFFSET 0 > - > -/* USP RX DMA I/O MODE Register */ > -#define USP_RX_MODE_IO 0x00000001 > -#define USP_RX_DMA_FLUSH 0x00000004 > - > -/* USP RX DMA I/O Length Register */ > -#define USP_RX_DATA_LEN_MASK 0xFFFFFFFF > -#define USP_RX_DATA_LEN_OFFSET 0 > - > -/* USP RX FIFO Control Register */ > -#define USP_RX_FIFO_WIDTH_MASK 0x00000003 > -#define USP_RX_FIFO_WIDTH_OFFSET 0 > - > -#define USP_RX_FIFO_THD_MASK 0x000001FC > -#define USP_RX_FIFO_THD_OFFSET 2 > - > -/* USP RX FIFO Level Check Register */ > - > -#define USP_RX_FIFO_LEVEL_CHECK_MASK 0x1F > -#define USP_RX_FIFO_SC_OFFSET 0 > -#define USP_RX_FIFO_LC_OFFSET 10 > -#define USP_RX_FIFO_HC_OFFSET 20 > - > -#define RX_FIFO_SC(x) (((x) & USP_RX_FIFO_LEVEL_CHECK_MASK) \ > - << USP_RX_FIFO_SC_OFFSET) > -#define RX_FIFO_LC(x) (((x) & USP_RX_FIFO_LEVEL_CHECK_MASK) \ > - << USP_RX_FIFO_LC_OFFSET) > -#define RX_FIFO_HC(x) (((x) & USP_RX_FIFO_LEVEL_CHECK_MASK) \ > - << USP_RX_FIFO_HC_OFFSET) > - > -/* USP RX FIFO Operation Register */ > -#define USP_RX_FIFO_RESET 0x00000001 > -#define USP_RX_FIFO_START 0x00000002 > - > -/* USP RX FIFO Status Register */ > - > -#define USP_RX_FIFO_LEVEL_MASK 0x0000007F > -#define USP_RX_FIFO_LEVEL_OFFSET 0 > - > -#define USP_RX_FIFO_FULL 0x00000080 > -#define USP_RX_FIFO_EMPTY 0x00000100 > - > -/* USP RX FIFO Data Register */ > - > -#define USP_RX_FIFO_DATA_MASK 0xFFFFFFFF > -#define USP_RX_FIFO_DATA_OFFSET 0 > - > -/* > - * When rx thd irq occur, sender just disable tx empty irq, > - * Remaining data in tx fifo wil also be sent out. > - */ > -#define USP_FIFO_SIZE 128 > -#define USP_TX_FIFO_THRESHOLD (USP_FIFO_SIZE/2) > -#define USP_RX_FIFO_THRESHOLD (USP_FIFO_SIZE/2) > - > -/* FIFO_WIDTH for the USP_TX_FIFO_CTRL and USP_RX_FIFO_CTRL registers */ > -#define USP_FIFO_WIDTH_BYTE 0x00 > -#define USP_FIFO_WIDTH_WORD 0x01 > -#define USP_FIFO_WIDTH_DWORD 0x02 > - > -#define USP_ASYNC_DIV2 16 > - > -#define USP_PLUGOUT_RETRY_CNT 2 > - > -#define USP_TX_RX_FIFO_WIDTH_DWORD 2 > - > -#define SIRF_USP_DIV_MCLK 0 > - > -#define SIRF_USP_I2S_TFS_SYNC 0 > -#define SIRF_USP_I2S_RFS_SYNC 1 > -#endif > -- > 2.29.2 > From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-11.4 required=3.0 tests=BAYES_00,DKIMWL_WL_HIGH, DKIM_SIGNED,DKIM_VALID,INCLUDES_CR_TRAILER,INCLUDES_PATCH,MAILING_LIST_MULTI, SPF_HELO_NONE,SPF_PASS,UNWANTED_LANGUAGE_BODY,URIBL_BLOCKED autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 8898CC433E0 for ; Wed, 20 Jan 2021 21:23:14 +0000 (UTC) Received: from merlin.infradead.org (merlin.infradead.org [205.233.59.134]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id 2A3D923444 for ; Wed, 20 Jan 2021 21:23:14 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 2A3D923444 Authentication-Results: mail.kernel.org; dmarc=fail (p=none dis=none) header.from=kernel.org Authentication-Results: mail.kernel.org; spf=none smtp.mailfrom=linux-arm-kernel-bounces+linux-arm-kernel=archiver.kernel.org@lists.infradead.org DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=merlin.20170209; h=Sender:Content-Transfer-Encoding: Content-Type:Cc:List-Subscribe:List-Help:List-Post:List-Archive: List-Unsubscribe:List-Id:To:Subject:Message-ID:Date:From:In-Reply-To: References:MIME-Version:Reply-To:Content-ID:Content-Description:Resent-Date: Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID:List-Owner; bh=a68zhyvKhWHXgHi+v3a6n2CGTh57vztIUmsuqhuMlKQ=; b=BUTUw2jAhGb7j2MOaLcFgcbQV X6LGog/jsyBCDOxMOBhUXK/D/M5ZBI/cs6VFM5Sp3QmXspnjCucAUqOgMHNl3sCQtWE43xRPPEPdn KzBRWWodndp7OmSjFQdOer3jvVeRo/R6q/MdwIO5e/XuvGJ/+bsU0ZN3qbNsZeOucGszwkB9eC0O8 CPZVWsb/UmSGueCfgJFaAgcb/UflfJDfBByj98ss+mCpWdYhBF0ODuQQO1nKxTeVxPvH+ZYf4SUbq +t0RKHJhDj4YGGFAO8hX2UsgdJGNHd8i6wo2BUDq038OAmEJWtqji95etLViPFYt5j8gQ/JHq7Rhu JvXr4vhGA==; Received: from localhost ([::1] helo=merlin.infradead.org) by merlin.infradead.org with esmtp (Exim 4.92.3 #3 (Red Hat Linux)) id 1l2Ktx-0005Nc-Az; Wed, 20 Jan 2021 21:20:29 +0000 Received: from mail-ed1-f43.google.com ([209.85.208.43]) by merlin.infradead.org with esmtps (Exim 4.92.3 #3 (Red Hat Linux)) id 1l2Kry-0004YF-PR for linux-arm-kernel@lists.infradead.org; Wed, 20 Jan 2021 21:18:30 +0000 Received: by mail-ed1-f43.google.com with SMTP id s11so17138edd.5 for ; Wed, 20 Jan 2021 13:18:26 -0800 (PST) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:mime-version:references:in-reply-to:from:date :message-id:subject:to:cc:content-transfer-encoding; bh=R+sF0wg3r8XINJntKCq2KV4V+mR8u2K7/6NUXxJfJmY=; b=JDiUyiS67XDAAYcOVmrLp0qucq0S3UlgKAm/N66sx4clQIITOQna8tdyW8m/aJfOUK O2w1kJSQnwXO7wFt3jdIZQNgMjwLW0ox99Zav8tK64ryd+6E2WbfhsX5V99iMe6JYzc+ YjuoGgbXiIM+Q0lsGvDckqdIOuTE0N3SRgdeXvUND7TIn1f0vOs8mt9DUJ2aLttlyyGO L3Rr2FxSIihXEATk5m+6/60d9pY+JfA1lYfsansE5x4KySx4RmIyqbRW5/yEv0ZG92Nz CR0hh7gQyXMf6aotiHfe1CjfnmMOHJJZVIQh16oagQ4eJ1rZFwG2xe8QQPr7Ya3AUfuB LlAg== X-Gm-Message-State: AOAM5334fzRBDCHE+fr6zBl/+jdtPuJQTJ3u3T/cw2HKU89/EjprCnTs p2TJsh2edzKY2SpZnU832zKt6Bsf3ozX9IANigE= X-Google-Smtp-Source: ABdhPJyGTRiNEqKZLpSpnoiPmaNeBKxr+8eBMLUjTU/s0fvSxkLQC2K59RrITmCTRRVl6rkbG4LkKiaBDcH7KAkIKWQ= X-Received: by 2002:a50:fd84:: with SMTP id o4mr6474874edt.340.1611177504958; Wed, 20 Jan 2021 13:18:24 -0800 (PST) MIME-Version: 1.0 References: <20210120162553.21666-1-arnd@kernel.org> <20210120162553.21666-2-arnd@kernel.org> In-Reply-To: <20210120162553.21666-2-arnd@kernel.org> From: Barry Song Date: Thu, 21 Jan 2021 10:18:13 +1300 Message-ID: Subject: Re: [PATCH 1/2] ASoC: remove sirf prima/atlas drivers To: Arnd Bergmann X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20210120_161826_974133_E16CCF90 X-CRM114-Status: GOOD ( 20.81 ) X-BeenThere: linux-arm-kernel@lists.infradead.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: alsa-devel@alsa-project.org, Arnd Bergmann , LKML , Liam Girdwood , Mark Brown , linux-arm-kernel@lists.infradead.org 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 QXJuZCBCZXJnbWFubiA8YXJuZEBrZXJuZWwub3JnPiDkuo4yMDIx5bm0MeaciDIx5pel5ZGo5Zub IOS4iuWNiDU6MjblhpnpgZPvvJoKPgo+IEZyb206IEFybmQgQmVyZ21hbm4gPGFybmRAYXJuZGIu ZGU+Cj4KPiBUaGUgQ1NSIFNpUkYgcHJpbWEyL2F0bGFzIHBsYXRmb3JtcyBhcmUgZ2V0dGluZyBy ZW1vdmVkLCBzbyB0aGlzIGRyaXZlcgo+IGlzIG5vIGxvbmdlciBuZWVkZWQuCj4KPiBDYzogQmFy cnkgU29uZyA8YmFvaHVhQGtlcm5lbC5vcmc+Cj4gU2lnbmVkLW9mZi1ieTogQXJuZCBCZXJnbWFu biA8YXJuZEBhcm5kYi5kZT4KCkFja2VkLWJ5OiBCYXJyeSBTb25nIDxiYW9odWFAa2VybmVsLm9y Zz4KCj4gLS0tCj4gIC4uLi9iaW5kaW5ncy9zb3VuZC9zaXJmLWF1ZGlvLWNvZGVjLnR4dCAgICAg ICB8ICAxNyAtCj4gIC4uLi9kZXZpY2V0cmVlL2JpbmRpbmdzL3NvdW5kL3NpcmYtdXNwLnR4dCAg ICB8ICAyNyAtCj4gIHNvdW5kL3NvYy9LY29uZmlnICAgICAgICAgICAgICAgICAgICAgICAgICAg ICB8ICAgMSAtCj4gIHNvdW5kL3NvYy9NYWtlZmlsZSAgICAgICAgICAgICAgICAgICAgICAgICAg ICB8ICAgMSAtCj4gIHNvdW5kL3NvYy9jb2RlY3MvTWFrZWZpbGUgICAgICAgICAgICAgICAgICAg ICB8ICAgMiAtCj4gIHNvdW5kL3NvYy9jb2RlY3Mvc2lyZi1hdWRpby1jb2RlYy5jICAgICAgICAg ICB8IDU3NSAtLS0tLS0tLS0tLS0tLS0tLS0KPiAgc291bmQvc29jL3NpcmYvS2NvbmZpZyAgICAg ICAgICAgICAgICAgICAgICAgIHwgIDIxIC0KPiAgc291bmQvc29jL3NpcmYvTWFrZWZpbGUgICAg ICAgICAgICAgICAgICAgICAgIHwgICA4IC0KPiAgc291bmQvc29jL3NpcmYvc2lyZi1hdWRpby1w b3J0LmMgICAgICAgICAgICAgIHwgIDg2IC0tLQo+ICBzb3VuZC9zb2Mvc2lyZi9zaXJmLWF1ZGlv LmMgICAgICAgICAgICAgICAgICAgfCAxNjAgLS0tLS0KPiAgc291bmQvc29jL3NpcmYvc2lyZi11 c3AuYyAgICAgICAgICAgICAgICAgICAgIHwgNDM1IC0tLS0tLS0tLS0tLS0KPiAgc291bmQvc29j L3NpcmYvc2lyZi11c3AuaCAgICAgICAgICAgICAgICAgICAgIHwgMjkyIC0tLS0tLS0tLQo+ICAx MiBmaWxlcyBjaGFuZ2VkLCAxNjI1IGRlbGV0aW9ucygtKQo+ICBkZWxldGUgbW9kZSAxMDA2NDQg RG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3NvdW5kL3NpcmYtYXVkaW8tY29kZWMu dHh0Cj4gIGRlbGV0ZSBtb2RlIDEwMDY0NCBEb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGlu Z3Mvc291bmQvc2lyZi11c3AudHh0Cj4gIGRlbGV0ZSBtb2RlIDEwMDY0NCBzb3VuZC9zb2MvY29k ZWNzL3NpcmYtYXVkaW8tY29kZWMuYwo+ICBkZWxldGUgbW9kZSAxMDA2NDQgc291bmQvc29jL3Np cmYvS2NvbmZpZwo+ICBkZWxldGUgbW9kZSAxMDA2NDQgc291bmQvc29jL3NpcmYvTWFrZWZpbGUK PiAgZGVsZXRlIG1vZGUgMTAwNjQ0IHNvdW5kL3NvYy9zaXJmL3NpcmYtYXVkaW8tcG9ydC5jCj4g IGRlbGV0ZSBtb2RlIDEwMDY0NCBzb3VuZC9zb2Mvc2lyZi9zaXJmLWF1ZGlvLmMKPiAgZGVsZXRl IG1vZGUgMTAwNjQ0IHNvdW5kL3NvYy9zaXJmL3NpcmYtdXNwLmMKPiAgZGVsZXRlIG1vZGUgMTAw NjQ0IHNvdW5kL3NvYy9zaXJmL3NpcmYtdXNwLmgKPgo+IGRpZmYgLS1naXQgYS9Eb2N1bWVudGF0 aW9uL2RldmljZXRyZWUvYmluZGluZ3Mvc291bmQvc2lyZi1hdWRpby1jb2RlYy50eHQgYi9Eb2N1 bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3Mvc291bmQvc2lyZi1hdWRpby1jb2RlYy50eHQK PiBkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKPiBpbmRleCAwNjJmNWVjMzZmOWIuLjAwMDAwMDAw MDAwMAo+IC0tLSBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9zb3VuZC9zaXJm LWF1ZGlvLWNvZGVjLnR4dAo+ICsrKyAvZGV2L251bGwKPiBAQCAtMSwxNyArMCwwIEBACj4gLVNp UkYgaW50ZXJuYWwgYXVkaW8gQ09ERUMKPiAtCj4gLVJlcXVpcmVkIHByb3BlcnRpZXM6Cj4gLQo+ IC0gIC0gY29tcGF0aWJsZSA6ICJzaXJmLGF0bGFzNi1hdWRpby1jb2RlYyIgb3IgInNpcmYscHJp bWEyLWF1ZGlvLWNvZGVjIgo+IC0KPiAtICAtIHJlZyA6IHRoZSByZWdpc3RlciBhZGRyZXNzIG9m IHRoZSBkZXZpY2UuCj4gLQo+IC0gIC0gY2xvY2tzOiB0aGUgY2xvY2sgb2YgU2lSRiBpbnRlcm5h bCBhdWRpbyBjb2RlYwo+IC0KPiAtRXhhbXBsZToKPiAtCj4gLWF1ZGlvY29kZWM6IGF1ZGlvY29k ZWNAYjAwNDAwMDAgewo+IC0gICAgICAgY29tcGF0aWJsZSA9ICJzaXJmLGF0bGFzNi1hdWRpby1j b2RlYyI7Cj4gLSAgICAgICByZWcgPSA8MHhiMDA0MDAwMCAweDEwMDAwPjsKPiAtICAgICAgIGNs b2NrcyA9IDwmY2xrcyAyNz47Cj4gLX07Cj4gZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZGV2 aWNldHJlZS9iaW5kaW5ncy9zb3VuZC9zaXJmLXVzcC50eHQgYi9Eb2N1bWVudGF0aW9uL2Rldmlj ZXRyZWUvYmluZGluZ3Mvc291bmQvc2lyZi11c3AudHh0Cj4gZGVsZXRlZCBmaWxlIG1vZGUgMTAw NjQ0Cj4gaW5kZXggMDJmODViMzJkMzU5Li4wMDAwMDAwMDAwMDAKPiAtLS0gYS9Eb2N1bWVudGF0 aW9uL2RldmljZXRyZWUvYmluZGluZ3Mvc291bmQvc2lyZi11c3AudHh0Cj4gKysrIC9kZXYvbnVs bAo+IEBAIC0xLDI3ICswLDAgQEAKPiAtKiBTaVJGIFNvQyBVU1AgbW9kdWxlCj4gLQo+IC1SZXF1 aXJlZCBwcm9wZXJ0aWVzOgo+IC0tIGNvbXBhdGlibGU6ICJzaXJmLHByaW1hMi11c3AtcGNtIgo+ IC0tIHJlZzogQmFzZSBhZGRyZXNzIGFuZCBzaXplIGVudHJpZXM6Cj4gLS0gZG1hczogTGlzdCBv ZiBETUEgY29udHJvbGxlciBwaGFuZGxlIGFuZCBETUEgcmVxdWVzdCBsaW5lIG9yZGVyZWQgcGFp cnMuCj4gLS0gZG1hLW5hbWVzOiBJZGVudGlmaWVyIHN0cmluZyBmb3IgZWFjaCBETUEgcmVxdWVz dCBsaW5lIGluIHRoZSBkbWFzIHByb3BlcnR5Lgo+IC0gIFRoZXNlIHN0cmluZ3MgY29ycmVzcG9u ZCAxOjEgd2l0aCB0aGUgb3JkZXJlZCBwYWlycyBpbiBkbWFzLgo+IC0KPiAtICBPbmUgb2YgdGhl IERNQSBjaGFubmVscyB3aWxsIGJlIHJlc3BvbnNpYmxlIGZvciB0cmFuc21pc3Npb24gKHNob3Vs ZCBiZQo+IC0gIG5hbWVkICJ0eCIpIGFuZCBvbmUgZm9yIHJlY2VwdGlvbiAoc2hvdWxkIGJlIG5h bWVkICJyeCIpLgo+IC0KPiAtLSBjbG9ja3M6IFVTUCBjb250cm9sbGVyIGNsb2NrIHNvdXJjZQo+ IC0tIHBpbmN0cmwtbmFtZXM6IE11c3QgY29udGFpbiBhICJkZWZhdWx0IiBlbnRyeS4KPiAtLSBw aW5jdHJsLU5OTjogT25lIHByb3BlcnR5IG11c3QgZXhpc3QgZm9yIGVhY2ggZW50cnkgaW4gcGlu Y3RybC1uYW1lcy4KPiAtCj4gLUV4YW1wbGU6Cj4gLXVzcDA6IHVzcEBiMDA4MDAwMCB7Cj4gLSAg ICAgICBjb21wYXRpYmxlID0gInNpcmYscHJpbWEyLXVzcC1wY20iOwo+IC0gICAgICAgcmVnID0g PDB4YjAwODAwMDAgMHgxMDAwMD47Cj4gLSAgICAgICBjbG9ja3MgPSA8JmNsa3MgMjg+Owo+IC0g ICAgICAgZG1hcyA9IDwmZG1hYzEgMT4sIDwmZG1hYzEgMj47Cj4gLSAgICAgICBkbWEtbmFtZXMg PSAicngiLCAidHgiOwo+IC0gICAgICAgcGluY3RybC1uYW1lcyA9ICJkZWZhdWx0IjsKPiAtICAg ICAgIHBpbmN0cmwtMCA9IDwmdXNwMF9vbmx5X3V0ZnNfcGluc19hPjsKPiAtfTsKPiAtCj4gZGlm ZiAtLWdpdCBhL3NvdW5kL3NvYy9LY29uZmlnIGIvc291bmQvc29jL0tjb25maWcKPiBpbmRleCA3 MWE2ZmU4N2QxYTEuLjFmYjYxZTY4OTAzMSAxMDA2NDQKPiAtLS0gYS9zb3VuZC9zb2MvS2NvbmZp Zwo+ICsrKyBiL3NvdW5kL3NvYy9LY29uZmlnCj4gQEAgLTYyLDcgKzYyLDYgQEAgc291cmNlICJz b3VuZC9zb2MvcWNvbS9LY29uZmlnIgo+ICBzb3VyY2UgInNvdW5kL3NvYy9yb2NrY2hpcC9LY29u ZmlnIgo+ICBzb3VyY2UgInNvdW5kL3NvYy9zYW1zdW5nL0tjb25maWciCj4gIHNvdXJjZSAic291 bmQvc29jL3NoL0tjb25maWciCj4gLXNvdXJjZSAic291bmQvc29jL3NpcmYvS2NvbmZpZyIKPiAg c291cmNlICJzb3VuZC9zb2Mvc29mL0tjb25maWciCj4gIHNvdXJjZSAic291bmQvc29jL3NwZWFy L0tjb25maWciCj4gIHNvdXJjZSAic291bmQvc29jL3NwcmQvS2NvbmZpZyIKPiBkaWZmIC0tZ2l0 IGEvc291bmQvc29jL01ha2VmaWxlIGIvc291bmQvc29jL01ha2VmaWxlCj4gaW5kZXggZGRiYWMz YTIxNjlmLi5kMmI3YTIzZjBlN2IgMTAwNjQ0Cj4gLS0tIGEvc291bmQvc29jL01ha2VmaWxlCj4g KysrIGIvc291bmQvc29jL01ha2VmaWxlCj4gQEAgLTQ1LDcgKzQ1LDYgQEAgb2JqLSQoQ09ORklH X1NORF9TT0MpICs9IHFjb20vCj4gIG9iai0kKENPTkZJR19TTkRfU09DKSAgKz0gcm9ja2NoaXAv Cj4gIG9iai0kKENPTkZJR19TTkRfU09DKSAgKz0gc2Ftc3VuZy8KPiAgb2JqLSQoQ09ORklHX1NO RF9TT0MpICArPSBzaC8KPiAtb2JqLSQoQ09ORklHX1NORF9TT0MpICArPSBzaXJmLwo+ICBvYmot JChDT05GSUdfU05EX1NPQykgICs9IHNvZi8KPiAgb2JqLSQoQ09ORklHX1NORF9TT0MpICArPSBz cGVhci8KPiAgb2JqLSQoQ09ORklHX1NORF9TT0MpICArPSBzcHJkLwo+IGRpZmYgLS1naXQgYS9z b3VuZC9zb2MvY29kZWNzL01ha2VmaWxlIGIvc291bmQvc29jL2NvZGVjcy9NYWtlZmlsZQo+IGlu ZGV4IGQyNzdmMDM2NmUwOS4uYzMwNzYyZmM5Yjg3IDEwMDY0NAo+IC0tLSBhL3NvdW5kL3NvYy9j b2RlY3MvTWFrZWZpbGUKPiArKysgYi9zb3VuZC9zb2MvY29kZWNzL01ha2VmaWxlCj4gQEAgLTIw MSw3ICsyMDEsNiBAQCBzbmQtc29jLXNpZ21hZHNwLW9ianMgOj0gc2lnbWFkc3Aubwo+ICBzbmQt c29jLXNpZ21hZHNwLWkyYy1vYmpzIDo9IHNpZ21hZHNwLWkyYy5vCj4gIHNuZC1zb2Mtc2lnbWFk c3AtcmVnbWFwLW9ianMgOj0gc2lnbWFkc3AtcmVnbWFwLm8KPiAgc25kLXNvYy1zaTQ3Nngtb2Jq cyA6PSBzaTQ3Nngubwo+IC1zbmQtc29jLXNpcmYtYXVkaW8tY29kZWMtb2JqcyA6PSBzaXJmLWF1 ZGlvLWNvZGVjLm8KPiAgc25kLXNvYy1zcGRpZi10eC1vYmpzIDo9IHNwZGlmX3RyYW5zbWl0dGVy Lm8KPiAgc25kLXNvYy1zcGRpZi1yeC1vYmpzIDo9IHNwZGlmX3JlY2VpdmVyLm8KPiAgc25kLXNv Yy1zc20yMzA1LW9ianMgOj0gc3NtMjMwNS5vCj4gQEAgLTUxNiw3ICs1MTUsNiBAQCBvYmotJChD T05GSUdfU05EX1NPQ19TSUdNQURTUF9JMkMpICArPSBzbmQtc29jLXNpZ21hZHNwLWkyYy5vCj4g IG9iai0kKENPTkZJR19TTkRfU09DX1NJR01BRFNQX1JFR01BUCkgICs9IHNuZC1zb2Mtc2lnbWFk c3AtcmVnbWFwLm8KPiAgb2JqLSQoQ09ORklHX1NORF9TT0NfU0k0NzZYKSAgICs9IHNuZC1zb2Mt c2k0NzZ4Lm8KPiAgb2JqLSQoQ09ORklHX1NORF9TT0NfU1BESUYpICAgICs9IHNuZC1zb2Mtc3Bk aWYtcngubyBzbmQtc29jLXNwZGlmLXR4Lm8KPiAtb2JqLSQoQ09ORklHX1NORF9TT0NfU0lSRl9B VURJT19DT0RFQykgKz0gc2lyZi1hdWRpby1jb2RlYy5vCj4gIG9iai0kKENPTkZJR19TTkRfU09D X1NTTTIzMDUpICArPSBzbmQtc29jLXNzbTIzMDUubwo+ICBvYmotJChDT05GSUdfU05EX1NPQ19T U00yNTE4KSAgKz0gc25kLXNvYy1zc20yNTE4Lm8KPiAgb2JqLSQoQ09ORklHX1NORF9TT0NfU1NN MjYwMikgICs9IHNuZC1zb2Mtc3NtMjYwMi5vCj4gZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9jb2Rl Y3Mvc2lyZi1hdWRpby1jb2RlYy5jIGIvc291bmQvc29jL2NvZGVjcy9zaXJmLWF1ZGlvLWNvZGVj LmMKPiBkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKPiBpbmRleCBhMDYxZDc4NDczYWMuLjAwMDAw MDAwMDAwMAo+IC0tLSBhL3NvdW5kL3NvYy9jb2RlY3Mvc2lyZi1hdWRpby1jb2RlYy5jCj4gKysr IC9kZXYvbnVsbAo+IEBAIC0xLDU3NSArMCwwIEBACj4gLS8vIFNQRFgtTGljZW5zZS1JZGVudGlm aWVyOiBHUEwtMi4wLW9yLWxhdGVyCj4gLS8qCj4gLSAqIFNpUkYgYXVkaW8gY29kZWMgZHJpdmVy Cj4gLSAqCj4gLSAqIENvcHlyaWdodCAoYykgMjAxMSBDYW1icmlkZ2UgU2lsaWNvbiBSYWRpbyBM aW1pdGVkLCBhIENTUiBwbGMgZ3JvdXAgY29tcGFueS4KPiAtICovCj4gLQo+IC0jaW5jbHVkZSA8 bGludXgvbW9kdWxlLmg+Cj4gLSNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KPiAt I2luY2x1ZGUgPGxpbnV4L3BtX3J1bnRpbWUuaD4KPiAtI2luY2x1ZGUgPGxpbnV4L29mLmg+Cj4g LSNpbmNsdWRlIDxsaW51eC9vZl9kZXZpY2UuaD4KPiAtI2luY2x1ZGUgPGxpbnV4L2Nsay5oPgo+ IC0jaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KPiAtI2luY2x1ZGUgPGxpbnV4L2lvLmg+Cj4gLSNp bmNsdWRlIDxsaW51eC9yZWdtYXAuaD4KPiAtI2luY2x1ZGUgPHNvdW5kL2NvcmUuaD4KPiAtI2lu Y2x1ZGUgPHNvdW5kL3BjbS5oPgo+IC0jaW5jbHVkZSA8c291bmQvcGNtX3BhcmFtcy5oPgo+IC0j aW5jbHVkZSA8c291bmQvaW5pdHZhbC5oPgo+IC0jaW5jbHVkZSA8c291bmQvdGx2Lmg+Cj4gLSNp bmNsdWRlIDxzb3VuZC9zb2MuaD4KPiAtI2luY2x1ZGUgPHNvdW5kL2RtYWVuZ2luZV9wY20uaD4K PiAtCj4gLSNpbmNsdWRlICJzaXJmLWF1ZGlvLWNvZGVjLmgiCj4gLQo+IC1zdHJ1Y3Qgc2lyZl9h dWRpb19jb2RlYyB7Cj4gLSAgICAgICBzdHJ1Y3QgY2xrICpjbGs7Cj4gLSAgICAgICBzdHJ1Y3Qg cmVnbWFwICpyZWdtYXA7Cj4gLSAgICAgICB1MzIgcmVnX2N0cmwwLCByZWdfY3RybDE7Cj4gLX07 Cj4gLQo+IC1zdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGlucHV0X21vZGVfbXV4W10gPSB7IlNp bmdsZS1lbmRlZCIsCj4gLSAgICAgICAiRGlmZmVyZW50aWFsIn07Cj4gLQo+IC1zdGF0aWMgY29u c3Qgc3RydWN0IHNvY19lbnVtIGlucHV0X21vZGVfbXV4X2VudW0gPQo+IC0gICAgICAgU09DX0VO VU1fU0lOR0xFKEFVRElPX0lDX0NPREVDX0NUUkwxLCA0LCAyLCBpbnB1dF9tb2RlX211eCk7Cj4g LQo+IC1zdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgc2lyZl9hdWRpb19jb2Rl Y19pbnB1dF9tb2RlX2NvbnRyb2wgPQo+IC0gICAgICAgU09DX0RBUE1fRU5VTSgiUm91dGUiLCBp bnB1dF9tb2RlX211eF9lbnVtKTsKPiAtCj4gLXN0YXRpYyBjb25zdCBERUNMQVJFX1RMVl9EQl9T Q0FMRShwbGF5YmFja192b2xfdGx2LCAtMTI0MDAsIDEwMCwgMCk7Cj4gLXN0YXRpYyBjb25zdCBE RUNMQVJFX1RMVl9EQl9TQ0FMRShjYXB0dXJlX3ZvbF90bHZfcHJpbWEyLCA1MDAsIDEwMCwgMCk7 Cj4gLXN0YXRpYyBjb25zdCBERUNMQVJFX1RMVl9EQl9SQU5HRShjYXB0dXJlX3ZvbF90bHZfYXRs YXM2LAo+IC0gICAgICAgMCwgNywgVExWX0RCX1NDQUxFX0lURU0oLTEwMCwgMTAwLCAwKSwKPiAt ICAgICAgIDB4MjIsIDB4M0YsIFRMVl9EQl9TQ0FMRV9JVEVNKDcwMCwgMTAwLCAwKSwKPiAtKTsK PiAtCj4gLXN0YXRpYyBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyB2b2x1bWVfY29udHJvbHNfYXRs YXM2W10gPSB7Cj4gLSAgICAgICBTT0NfRE9VQkxFX1RMVigiUGxheWJhY2sgVm9sdW1lIiwgQVVE SU9fSUNfQ09ERUNfQ1RSTDAsIDIxLCAxNCwKPiAtICAgICAgICAgICAgICAgICAgICAgICAweDdG LCAwLCBwbGF5YmFja192b2xfdGx2KSwKPiAtICAgICAgIFNPQ19ET1VCTEVfVExWKCJDYXB0dXJl IFZvbHVtZSIsIEFVRElPX0lDX0NPREVDX0NUUkwxLCAxNiwgMTAsCj4gLSAgICAgICAgICAgICAg ICAgICAgICAgMHgzRiwgMCwgY2FwdHVyZV92b2xfdGx2X2F0bGFzNiksCj4gLX07Cj4gLQo+IC1z dGF0aWMgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgdm9sdW1lX2NvbnRyb2xzX3ByaW1hMltdID0g ewo+IC0gICAgICAgU09DX0RPVUJMRV9UTFYoIlNwZWFrZXIgVm9sdW1lIiwgQVVESU9fSUNfQ09E RUNfQ1RSTDAsIDIxLCAxNCwKPiAtICAgICAgICAgICAgICAgICAgICAgICAweDdGLCAwLCBwbGF5 YmFja192b2xfdGx2KSwKPiAtICAgICAgIFNPQ19ET1VCTEVfVExWKCJDYXB0dXJlIFZvbHVtZSIs IEFVRElPX0lDX0NPREVDX0NUUkwxLCAxNSwgMTAsCj4gLSAgICAgICAgICAgICAgICAgICAgICAg MHgxRiwgMCwgY2FwdHVyZV92b2xfdGx2X3ByaW1hMiksCj4gLX07Cj4gLQo+IC1zdGF0aWMgc3Ry dWN0IHNuZF9rY29udHJvbF9uZXcgbGVmdF9pbnB1dF9wYXRoX2NvbnRyb2xzW10gPSB7Cj4gLSAg ICAgICBTT0NfREFQTV9TSU5HTEUoIkxpbmUgTGVmdCBTd2l0Y2giLCBBVURJT19JQ19DT0RFQ19D VFJMMSwgNiwgMSwgMCksCj4gLSAgICAgICBTT0NfREFQTV9TSU5HTEUoIk1pYyBMZWZ0IFN3aXRj aCIsIEFVRElPX0lDX0NPREVDX0NUUkwxLCAzLCAxLCAwKSwKPiAtfTsKPiAtCj4gLXN0YXRpYyBz dHJ1Y3Qgc25kX2tjb250cm9sX25ldyByaWdodF9pbnB1dF9wYXRoX2NvbnRyb2xzW10gPSB7Cj4g LSAgICAgICBTT0NfREFQTV9TSU5HTEUoIkxpbmUgUmlnaHQgU3dpdGNoIiwgQVVESU9fSUNfQ09E RUNfQ1RSTDEsIDUsIDEsIDApLAo+IC0gICAgICAgU09DX0RBUE1fU0lOR0xFKCJNaWMgUmlnaHQg U3dpdGNoIiwgQVVESU9fSUNfQ09ERUNfQ1RSTDEsIDIsIDEsIDApLAo+IC19Owo+IC0KPiAtc3Rh dGljIHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IGxlZnRfZGFjX3RvX2hwX2xlZnRfYW1wX3N3aXRj aF9jb250cm9sID0KPiAtICAgICAgIFNPQ19EQVBNX1NJTkdMRSgiU3dpdGNoIiwgQVVESU9fSUNf Q09ERUNfQ1RSTDAsIDksIDEsIDApOwo+IC0KPiAtc3RhdGljIHN0cnVjdCBzbmRfa2NvbnRyb2xf bmV3IGxlZnRfZGFjX3RvX2hwX3JpZ2h0X2FtcF9zd2l0Y2hfY29udHJvbCA9Cj4gLSAgICAgICBT T0NfREFQTV9TSU5HTEUoIlN3aXRjaCIsIEFVRElPX0lDX0NPREVDX0NUUkwwLCA4LCAxLCAwKTsK PiAtCj4gLXN0YXRpYyBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyByaWdodF9kYWNfdG9faHBfbGVm dF9hbXBfc3dpdGNoX2NvbnRyb2wgPQo+IC0gICAgICAgU09DX0RBUE1fU0lOR0xFKCJTd2l0Y2gi LCBBVURJT19JQ19DT0RFQ19DVFJMMCwgNywgMSwgMCk7Cj4gLQo+IC1zdGF0aWMgc3RydWN0IHNu ZF9rY29udHJvbF9uZXcgcmlnaHRfZGFjX3RvX2hwX3JpZ2h0X2FtcF9zd2l0Y2hfY29udHJvbCA9 Cj4gLSAgICAgICBTT0NfREFQTV9TSU5HTEUoIlN3aXRjaCIsIEFVRElPX0lDX0NPREVDX0NUUkww LCA2LCAxLCAwKTsKPiAtCj4gLXN0YXRpYyBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBsZWZ0X2Rh Y190b19zcGVha2VyX2xpbmVvdXRfc3dpdGNoX2NvbnRyb2wgPQo+IC0gICAgICAgU09DX0RBUE1f U0lOR0xFKCJTd2l0Y2giLCBBVURJT19JQ19DT0RFQ19DVFJMMCwgMTEsIDEsIDApOwo+IC0KPiAt c3RhdGljIHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHJpZ2h0X2RhY190b19zcGVha2VyX2xpbmVv dXRfc3dpdGNoX2NvbnRyb2wgPQo+IC0gICAgICAgU09DX0RBUE1fU0lOR0xFKCJTd2l0Y2giLCBB VURJT19JQ19DT0RFQ19DVFJMMCwgMTAsIDEsIDApOwo+IC0KPiAtLyogQWZ0ZXIgZW5hYmxlIGFk YywgRGVsYXkgMjAwbXMgdG8gYXZvaWQgcG9wIG5vaXNlICovCj4gLXN0YXRpYyBpbnQgYWRjX2Vu YWJsZV9kZWxheV9ldmVudChzdHJ1Y3Qgc25kX3NvY19kYXBtX3dpZGdldCAqdywKPiAtICAgICAg ICAgICAgICAgc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsIGludCBldmVudCkKPiAtewo+ IC0gICAgICAgc3dpdGNoIChldmVudCkgewo+IC0gICAgICAgY2FzZSBTTkRfU09DX0RBUE1fUE9T VF9QTVU6Cj4gLSAgICAgICAgICAgICAgIG1zbGVlcCgyMDApOwo+IC0gICAgICAgICAgICAgICBi cmVhazsKPiAtICAgICAgIGRlZmF1bHQ6Cj4gLSAgICAgICAgICAgICAgIGJyZWFrOwo+IC0gICAg ICAgfQo+IC0KPiAtICAgICAgIHJldHVybiAwOwo+IC19Cj4gLQo+IC1zdGF0aWMgdm9pZCBlbmFi bGVfYW5kX3Jlc2V0X2NvZGVjKHN0cnVjdCByZWdtYXAgKnJlZ21hcCwKPiAtICAgICAgICAgICAg ICAgdTMyIGNvZGVjX2VuYWJsZV9iaXRzLCB1MzIgY29kZWNfcmVzZXRfYml0cykKPiAtewo+IC0g ICAgICAgcmVnbWFwX3VwZGF0ZV9iaXRzKHJlZ21hcCwgQVVESU9fSUNfQ09ERUNfQ1RSTDEsCj4g LSAgICAgICAgICAgICAgICAgICAgICAgY29kZWNfZW5hYmxlX2JpdHMgfCBjb2RlY19yZXNldF9i aXRzLAo+IC0gICAgICAgICAgICAgICAgICAgICAgIGNvZGVjX2VuYWJsZV9iaXRzKTsKPiAtICAg ICAgIG1zbGVlcCgyMCk7Cj4gLSAgICAgICByZWdtYXBfdXBkYXRlX2JpdHMocmVnbWFwLCBBVURJ T19JQ19DT0RFQ19DVFJMMSwKPiAtICAgICAgICAgICAgICAgICAgICAgICBjb2RlY19yZXNldF9i aXRzLCBjb2RlY19yZXNldF9iaXRzKTsKPiAtfQo+IC0KPiAtc3RhdGljIGludCBhdGxhczZfY29k ZWNfZW5hYmxlX2FuZF9yZXNldF9ldmVudChzdHJ1Y3Qgc25kX3NvY19kYXBtX3dpZGdldCAqdywK PiAtICAgICAgICAgICAgICAgc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsIGludCBldmVu dCkKPiAtewo+IC0jZGVmaW5lIEFUTEFTNl9DT0RFQ19FTkFCTEVfQklUUyAoMSA8PCAyOSkKPiAt I2RlZmluZSBBVExBUzZfQ09ERUNfUkVTRVRfQklUUyAoMSA8PCAyOCkKPiAtICAgICAgIHN0cnVj dCBzbmRfc29jX2NvbXBvbmVudCAqY29tcG9uZW50ID0gc25kX3NvY19kYXBtX3RvX2NvbXBvbmVu dCh3LT5kYXBtKTsKPiAtICAgICAgIHN0cnVjdCBzaXJmX2F1ZGlvX2NvZGVjICpzaXJmX2F1ZGlv X2NvZGVjID0gc25kX3NvY19jb21wb25lbnRfZ2V0X2RydmRhdGEoY29tcG9uZW50KTsKPiAtICAg ICAgIHN3aXRjaCAoZXZlbnQpIHsKPiAtICAgICAgIGNhc2UgU05EX1NPQ19EQVBNX1BSRV9QTVU6 Cj4gLSAgICAgICAgICAgICAgIGVuYWJsZV9hbmRfcmVzZXRfY29kZWMoc2lyZl9hdWRpb19jb2Rl Yy0+cmVnbWFwLAo+IC0gICAgICAgICAgICAgICAgICAgICAgIEFUTEFTNl9DT0RFQ19FTkFCTEVf QklUUywgQVRMQVM2X0NPREVDX1JFU0VUX0JJVFMpOwo+IC0gICAgICAgICAgICAgICBicmVhazsK PiAtICAgICAgIGNhc2UgU05EX1NPQ19EQVBNX1BPU1RfUE1EOgo+IC0gICAgICAgICAgICAgICBy ZWdtYXBfdXBkYXRlX2JpdHMoc2lyZl9hdWRpb19jb2RlYy0+cmVnbWFwLAo+IC0gICAgICAgICAg ICAgICAgICAgICAgIEFVRElPX0lDX0NPREVDX0NUUkwxLCBBVExBUzZfQ09ERUNfRU5BQkxFX0JJ VFMsIDApOwo+IC0gICAgICAgICAgICAgICBicmVhazsKPiAtICAgICAgIGRlZmF1bHQ6Cj4gLSAg ICAgICAgICAgICAgIGJyZWFrOwo+IC0gICAgICAgfQo+IC0KPiAtICAgICAgIHJldHVybiAwOwo+ IC19Cj4gLQo+IC1zdGF0aWMgaW50IHByaW1hMl9jb2RlY19lbmFibGVfYW5kX3Jlc2V0X2V2ZW50 KHN0cnVjdCBzbmRfc29jX2RhcG1fd2lkZ2V0ICp3LAo+IC0gICAgICAgICAgICAgICBzdHJ1Y3Qg c25kX2tjb250cm9sICprY29udHJvbCwgaW50IGV2ZW50KQo+IC17Cj4gLSNkZWZpbmUgUFJJTUEy X0NPREVDX0VOQUJMRV9CSVRTICgxIDw8IDI3KQo+IC0jZGVmaW5lIFBSSU1BMl9DT0RFQ19SRVNF VF9CSVRTICgxIDw8IDI2KQo+IC0gICAgICAgc3RydWN0IHNuZF9zb2NfY29tcG9uZW50ICpjb21w b25lbnQgPSBzbmRfc29jX2RhcG1fdG9fY29tcG9uZW50KHctPmRhcG0pOwo+IC0gICAgICAgc3Ry dWN0IHNpcmZfYXVkaW9fY29kZWMgKnNpcmZfYXVkaW9fY29kZWMgPSBzbmRfc29jX2NvbXBvbmVu dF9nZXRfZHJ2ZGF0YShjb21wb25lbnQpOwo+IC0gICAgICAgc3dpdGNoIChldmVudCkgewo+IC0g ICAgICAgY2FzZSBTTkRfU09DX0RBUE1fUE9TVF9QTVU6Cj4gLSAgICAgICAgICAgICAgIGVuYWJs ZV9hbmRfcmVzZXRfY29kZWMoc2lyZl9hdWRpb19jb2RlYy0+cmVnbWFwLAo+IC0gICAgICAgICAg ICAgICAgICAgICAgIFBSSU1BMl9DT0RFQ19FTkFCTEVfQklUUywgUFJJTUEyX0NPREVDX1JFU0VU X0JJVFMpOwo+IC0gICAgICAgICAgICAgICBicmVhazsKPiAtICAgICAgIGNhc2UgU05EX1NPQ19E QVBNX1BPU1RfUE1EOgo+IC0gICAgICAgICAgICAgICByZWdtYXBfdXBkYXRlX2JpdHMoc2lyZl9h dWRpb19jb2RlYy0+cmVnbWFwLAo+IC0gICAgICAgICAgICAgICAgICAgICAgIEFVRElPX0lDX0NP REVDX0NUUkwxLCBQUklNQTJfQ09ERUNfRU5BQkxFX0JJVFMsIDApOwo+IC0gICAgICAgICAgICAg ICBicmVhazsKPiAtICAgICAgIGRlZmF1bHQ6Cj4gLSAgICAgICAgICAgICAgIGJyZWFrOwo+IC0g ICAgICAgfQo+IC0KPiAtICAgICAgIHJldHVybiAwOwo+IC19Cj4gLQo+IC1zdGF0aWMgY29uc3Qg c3RydWN0IHNuZF9zb2NfZGFwbV93aWRnZXQgYXRsYXM2X291dHB1dF9kcml2ZXJfZGFwbV93aWRn ZXRzW10gPSB7Cj4gLSAgICAgICBTTkRfU09DX0RBUE1fT1VUX0RSVigiSFAgTGVmdCBEcml2ZXIi LCBBVURJT19JQ19DT0RFQ19DVFJMMSwKPiAtICAgICAgICAgICAgICAgICAgICAgICAyNSwgMCwg TlVMTCwgMCksCj4gLSAgICAgICBTTkRfU09DX0RBUE1fT1VUX0RSVigiSFAgUmlnaHQgRHJpdmVy IiwgQVVESU9fSUNfQ09ERUNfQ1RSTDEsCj4gLSAgICAgICAgICAgICAgICAgICAgICAgMjYsIDAs IE5VTEwsIDApLAo+IC0gICAgICAgU05EX1NPQ19EQVBNX09VVF9EUlYoIlNwZWFrZXIgRHJpdmVy IiwgQVVESU9fSUNfQ09ERUNfQ1RSTDEsCj4gLSAgICAgICAgICAgICAgICAgICAgICAgMjcsIDAs IE5VTEwsIDApLAo+IC19Owo+IC0KPiAtc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfc29jX2RhcG1f d2lkZ2V0IHByaW1hMl9vdXRwdXRfZHJpdmVyX2RhcG1fd2lkZ2V0c1tdID0gewo+IC0gICAgICAg U05EX1NPQ19EQVBNX09VVF9EUlYoIkhQIExlZnQgRHJpdmVyIiwgQVVESU9fSUNfQ09ERUNfQ1RS TDEsCj4gLSAgICAgICAgICAgICAgICAgICAgICAgMjMsIDAsIE5VTEwsIDApLAo+IC0gICAgICAg U05EX1NPQ19EQVBNX09VVF9EUlYoIkhQIFJpZ2h0IERyaXZlciIsIEFVRElPX0lDX0NPREVDX0NU UkwxLAo+IC0gICAgICAgICAgICAgICAgICAgICAgIDI0LCAwLCBOVUxMLCAwKSwKPiAtICAgICAg IFNORF9TT0NfREFQTV9PVVRfRFJWKCJTcGVha2VyIERyaXZlciIsIEFVRElPX0lDX0NPREVDX0NU UkwxLAo+IC0gICAgICAgICAgICAgICAgICAgICAgIDI1LCAwLCBOVUxMLCAwKSwKPiAtfTsKPiAt Cj4gLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX3NvY19kYXBtX3dpZGdldCBhdGxhczZfY29kZWNf Y2xvY2tfZGFwbV93aWRnZXQgPQo+IC0gICAgICAgU05EX1NPQ19EQVBNX1NVUFBMWSgiY29kZWNj bGsiLCBTTkRfU09DX05PUE0sIDAsIDAsCj4gLSAgICAgICAgICAgICAgICAgICAgICAgYXRsYXM2 X2NvZGVjX2VuYWJsZV9hbmRfcmVzZXRfZXZlbnQsCj4gLSAgICAgICAgICAgICAgICAgICAgICAg U05EX1NPQ19EQVBNX1BSRV9QTVUgfCBTTkRfU09DX0RBUE1fUE9TVF9QTUQpOwo+IC0KPiAtc3Rh dGljIGNvbnN0IHN0cnVjdCBzbmRfc29jX2RhcG1fd2lkZ2V0IHByaW1hMl9jb2RlY19jbG9ja19k YXBtX3dpZGdldCA9Cj4gLSAgICAgICBTTkRfU09DX0RBUE1fU1VQUExZKCJjb2RlY2NsayIsIFNO RF9TT0NfTk9QTSwgMCwgMCwKPiAtICAgICAgICAgICAgICAgICAgICAgICBwcmltYTJfY29kZWNf ZW5hYmxlX2FuZF9yZXNldF9ldmVudCwKPiAtICAgICAgICAgICAgICAgICAgICAgICBTTkRfU09D X0RBUE1fUFJFX1BNVSB8IFNORF9TT0NfREFQTV9QT1NUX1BNRCk7Cj4gLQo+IC1zdGF0aWMgY29u c3Qgc3RydWN0IHNuZF9zb2NfZGFwbV93aWRnZXQgc2lyZl9hdWRpb19jb2RlY19kYXBtX3dpZGdl dHNbXSA9IHsKPiAtICAgICAgIFNORF9TT0NfREFQTV9EQUMoIkRBQyBsZWZ0IiwgTlVMTCwgQVVE SU9fSUNfQ09ERUNfQ1RSTDAsIDEsIDApLAo+IC0gICAgICAgU05EX1NPQ19EQVBNX0RBQygiREFD IHJpZ2h0IiwgTlVMTCwgQVVESU9fSUNfQ09ERUNfQ1RSTDAsIDAsIDApLAo+IC0gICAgICAgU05E X1NPQ19EQVBNX1NXSVRDSCgiTGVmdCBkYWMgdG8gaHAgbGVmdCBhbXAiLCBTTkRfU09DX05PUE0s IDAsIDAsCj4gLSAgICAgICAgICAgICAgICAgICAgICAgJmxlZnRfZGFjX3RvX2hwX2xlZnRfYW1w X3N3aXRjaF9jb250cm9sKSwKPiAtICAgICAgIFNORF9TT0NfREFQTV9TV0lUQ0goIkxlZnQgZGFj IHRvIGhwIHJpZ2h0IGFtcCIsIFNORF9TT0NfTk9QTSwgMCwgMCwKPiAtICAgICAgICAgICAgICAg ICAgICAgICAmbGVmdF9kYWNfdG9faHBfcmlnaHRfYW1wX3N3aXRjaF9jb250cm9sKSwKPiAtICAg ICAgIFNORF9TT0NfREFQTV9TV0lUQ0goIlJpZ2h0IGRhYyB0byBocCBsZWZ0IGFtcCIsIFNORF9T T0NfTk9QTSwgMCwgMCwKPiAtICAgICAgICAgICAgICAgICAgICAgICAmcmlnaHRfZGFjX3RvX2hw X2xlZnRfYW1wX3N3aXRjaF9jb250cm9sKSwKPiAtICAgICAgIFNORF9TT0NfREFQTV9TV0lUQ0go IlJpZ2h0IGRhYyB0byBocCByaWdodCBhbXAiLCBTTkRfU09DX05PUE0sIDAsIDAsCj4gLSAgICAg ICAgICAgICAgICAgICAgICAgJnJpZ2h0X2RhY190b19ocF9yaWdodF9hbXBfc3dpdGNoX2NvbnRy b2wpLAo+IC0gICAgICAgU05EX1NPQ19EQVBNX09VVF9EUlYoIkhQIGFtcCBsZWZ0IGRyaXZlciIs IEFVRElPX0lDX0NPREVDX0NUUkwwLCAzLCAwLAo+IC0gICAgICAgICAgICAgICAgICAgICAgIE5V TEwsIDApLAo+IC0gICAgICAgU05EX1NPQ19EQVBNX09VVF9EUlYoIkhQIGFtcCByaWdodCBkcml2 ZXIiLCBBVURJT19JQ19DT0RFQ19DVFJMMCwgMywgMCwKPiAtICAgICAgICAgICAgICAgICAgICAg ICBOVUxMLCAwKSwKPiAtCj4gLSAgICAgICBTTkRfU09DX0RBUE1fU1dJVENIKCJMZWZ0IGRhYyB0 byBzcGVha2VyIGxpbmVvdXQiLCBTTkRfU09DX05PUE0sIDAsIDAsCj4gLSAgICAgICAgICAgICAg ICAgICAgICAgJmxlZnRfZGFjX3RvX3NwZWFrZXJfbGluZW91dF9zd2l0Y2hfY29udHJvbCksCj4g LSAgICAgICBTTkRfU09DX0RBUE1fU1dJVENIKCJSaWdodCBkYWMgdG8gc3BlYWtlciBsaW5lb3V0 IiwgU05EX1NPQ19OT1BNLCAwLCAwLAo+IC0gICAgICAgICAgICAgICAgICAgICAgICZyaWdodF9k YWNfdG9fc3BlYWtlcl9saW5lb3V0X3N3aXRjaF9jb250cm9sKSwKPiAtICAgICAgIFNORF9TT0Nf REFQTV9PVVRfRFJWKCJTcGVha2VyIGFtcCBkcml2ZXIiLCBBVURJT19JQ19DT0RFQ19DVFJMMCwg NCwgMCwKPiAtICAgICAgICAgICAgICAgICAgICAgICBOVUxMLCAwKSwKPiAtCj4gLSAgICAgICBT TkRfU09DX0RBUE1fT1VUUFVUKCJIUE9VVEwiKSwKPiAtICAgICAgIFNORF9TT0NfREFQTV9PVVRQ VVQoIkhQT1VUUiIpLAo+IC0gICAgICAgU05EX1NPQ19EQVBNX09VVFBVVCgiU1BLT1VUIiksCj4g LQo+IC0gICAgICAgU05EX1NPQ19EQVBNX0FEQ19FKCJBREMgbGVmdCIsIE5VTEwsIEFVRElPX0lD X0NPREVDX0NUUkwxLCA4LCAwLAo+IC0gICAgICAgICAgICAgICAgICAgICAgIGFkY19lbmFibGVf ZGVsYXlfZXZlbnQsIFNORF9TT0NfREFQTV9QT1NUX1BNVSksCj4gLSAgICAgICBTTkRfU09DX0RB UE1fQURDX0UoIkFEQyByaWdodCIsIE5VTEwsIEFVRElPX0lDX0NPREVDX0NUUkwxLCA3LCAwLAo+ IC0gICAgICAgICAgICAgICAgICAgICAgIGFkY19lbmFibGVfZGVsYXlfZXZlbnQsIFNORF9TT0Nf REFQTV9QT1NUX1BNVSksCj4gLSAgICAgICBTTkRfU09DX0RBUE1fTUlYRVIoIkxlZnQgUEdBIG1p eGVyIiwgQVVESU9fSUNfQ09ERUNfQ1RSTDEsIDEsIDAsCj4gLSAgICAgICAgICAgICAgICZsZWZ0 X2lucHV0X3BhdGhfY29udHJvbHNbMF0sCj4gLSAgICAgICAgICAgICAgIEFSUkFZX1NJWkUobGVm dF9pbnB1dF9wYXRoX2NvbnRyb2xzKSksCj4gLSAgICAgICBTTkRfU09DX0RBUE1fTUlYRVIoIlJp Z2h0IFBHQSBtaXhlciIsIEFVRElPX0lDX0NPREVDX0NUUkwxLCAwLCAwLAo+IC0gICAgICAgICAg ICAgICAmcmlnaHRfaW5wdXRfcGF0aF9jb250cm9sc1swXSwKPiAtICAgICAgICAgICAgICAgQVJS QVlfU0laRShyaWdodF9pbnB1dF9wYXRoX2NvbnRyb2xzKSksCj4gLQo+IC0gICAgICAgU05EX1NP Q19EQVBNX01VWCgiTWljIGlucHV0IG1vZGUgbXV4IiwgU05EX1NPQ19OT1BNLCAwLCAwLAo+IC0g ICAgICAgICAgICAgICAgICAgICAgICZzaXJmX2F1ZGlvX2NvZGVjX2lucHV0X21vZGVfY29udHJv bCksCj4gLSAgICAgICBTTkRfU09DX0RBUE1fTUlDQklBUygiTWljIEJpYXMiLCBBVURJT19JQ19D T0RFQ19QV1IsIDMsIDApLAo+IC0gICAgICAgU05EX1NPQ19EQVBNX0lOUFVUKCJNSUNJTjEiKSwK PiAtICAgICAgIFNORF9TT0NfREFQTV9JTlBVVCgiTUlDSU4yIiksCj4gLSAgICAgICBTTkRfU09D X0RBUE1fSU5QVVQoIkxJTkVJTjEiKSwKPiAtICAgICAgIFNORF9TT0NfREFQTV9JTlBVVCgiTElO RUlOMiIpLAo+IC0KPiAtICAgICAgIFNORF9TT0NfREFQTV9TVVBQTFkoIkhTTCBQaGFzZSBPcHBv c2l0ZSIsIEFVRElPX0lDX0NPREVDX0NUUkwwLAo+IC0gICAgICAgICAgICAgICAgICAgICAgIDMw LCAwLCBOVUxMLCAwKSwKPiAtfTsKPiAtCj4gLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX3NvY19k YXBtX3JvdXRlIHNpcmZfYXVkaW9fY29kZWNfbWFwW10gPSB7Cj4gLSAgICAgICB7IlNQS09VVCIs IE5VTEwsICJTcGVha2VyIERyaXZlciJ9LAo+IC0gICAgICAgeyJTcGVha2VyIERyaXZlciIsIE5V TEwsICJTcGVha2VyIGFtcCBkcml2ZXIifSwKPiAtICAgICAgIHsiU3BlYWtlciBhbXAgZHJpdmVy IiwgTlVMTCwgIkxlZnQgZGFjIHRvIHNwZWFrZXIgbGluZW91dCJ9LAo+IC0gICAgICAgeyJTcGVh a2VyIGFtcCBkcml2ZXIiLCBOVUxMLCAiUmlnaHQgZGFjIHRvIHNwZWFrZXIgbGluZW91dCJ9LAo+ IC0gICAgICAgeyJMZWZ0IGRhYyB0byBzcGVha2VyIGxpbmVvdXQiLCAiU3dpdGNoIiwgIkRBQyBs ZWZ0In0sCj4gLSAgICAgICB7IlJpZ2h0IGRhYyB0byBzcGVha2VyIGxpbmVvdXQiLCAiU3dpdGNo IiwgIkRBQyByaWdodCJ9LAo+IC0gICAgICAgeyJIUE9VVEwiLCBOVUxMLCAiSFAgTGVmdCBEcml2 ZXIifSwKPiAtICAgICAgIHsiSFBPVVRSIiwgTlVMTCwgIkhQIFJpZ2h0IERyaXZlciJ9LAo+IC0g ICAgICAgeyJIUCBMZWZ0IERyaXZlciIsIE5VTEwsICJIUCBhbXAgbGVmdCBkcml2ZXIifSwKPiAt ICAgICAgIHsiSFAgUmlnaHQgRHJpdmVyIiwgTlVMTCwgIkhQIGFtcCByaWdodCBkcml2ZXIifSwK PiAtICAgICAgIHsiSFAgYW1wIGxlZnQgZHJpdmVyIiwgTlVMTCwgIlJpZ2h0IGRhYyB0byBocCBs ZWZ0IGFtcCJ9LAo+IC0gICAgICAgeyJIUCBhbXAgcmlnaHQgZHJpdmVyIiwgTlVMTCAsICJSaWdo dCBkYWMgdG8gaHAgcmlnaHQgYW1wIn0sCj4gLSAgICAgICB7IkhQIGFtcCBsZWZ0IGRyaXZlciIs IE5VTEwsICJMZWZ0IGRhYyB0byBocCBsZWZ0IGFtcCJ9LAo+IC0gICAgICAgeyJIUCBhbXAgcmln aHQgZHJpdmVyIiwgTlVMTCAsICJSaWdodCBkYWMgdG8gaHAgcmlnaHQgYW1wIn0sCj4gLSAgICAg ICB7IlJpZ2h0IGRhYyB0byBocCBsZWZ0IGFtcCIsICJTd2l0Y2giLCAiREFDIGxlZnQifSwKPiAt ICAgICAgIHsiUmlnaHQgZGFjIHRvIGhwIHJpZ2h0IGFtcCIsICJTd2l0Y2giLCAiREFDIHJpZ2h0 In0sCj4gLSAgICAgICB7IkxlZnQgZGFjIHRvIGhwIGxlZnQgYW1wIiwgIlN3aXRjaCIsICJEQUMg bGVmdCJ9LAo+IC0gICAgICAgeyJMZWZ0IGRhYyB0byBocCByaWdodCBhbXAiLCAiU3dpdGNoIiwg IkRBQyByaWdodCJ9LAo+IC0gICAgICAgeyJEQUMgbGVmdCIsIE5VTEwsICJjb2RlY2NsayJ9LAo+ IC0gICAgICAgeyJEQUMgcmlnaHQiLCBOVUxMLCAiY29kZWNjbGsifSwKPiAtICAgICAgIHsiREFD IGxlZnQiLCBOVUxMLCAiUGxheWJhY2sifSwKPiAtICAgICAgIHsiREFDIHJpZ2h0IiwgTlVMTCwg IlBsYXliYWNrIn0sCj4gLSAgICAgICB7IkRBQyBsZWZ0IiwgTlVMTCwgIkhTTCBQaGFzZSBPcHBv c2l0ZSJ9LAo+IC0gICAgICAgeyJEQUMgcmlnaHQiLCBOVUxMLCAiSFNMIFBoYXNlIE9wcG9zaXRl In0sCj4gLQo+IC0gICAgICAgeyJDYXB0dXJlIiwgTlVMTCwgIkFEQyBsZWZ0In0sCj4gLSAgICAg ICB7IkNhcHR1cmUiLCBOVUxMLCAiQURDIHJpZ2h0In0sCj4gLSAgICAgICB7IkFEQyBsZWZ0Iiwg TlVMTCwgImNvZGVjY2xrIn0sCj4gLSAgICAgICB7IkFEQyByaWdodCIsIE5VTEwsICJjb2RlY2Ns ayJ9LAo+IC0gICAgICAgeyJBREMgbGVmdCIsIE5VTEwsICJMZWZ0IFBHQSBtaXhlciJ9LAo+IC0g ICAgICAgeyJBREMgcmlnaHQiLCBOVUxMLCAiUmlnaHQgUEdBIG1peGVyIn0sCj4gLSAgICAgICB7 IkxlZnQgUEdBIG1peGVyIiwgIkxpbmUgTGVmdCBTd2l0Y2giLCAiTElORUlOMiJ9LAo+IC0gICAg ICAgeyJSaWdodCBQR0EgbWl4ZXIiLCAiTGluZSBSaWdodCBTd2l0Y2giLCAiTElORUlOMSJ9LAo+ IC0gICAgICAgeyJMZWZ0IFBHQSBtaXhlciIsICJNaWMgTGVmdCBTd2l0Y2giLCAiTUlDSU4yIn0s Cj4gLSAgICAgICB7IlJpZ2h0IFBHQSBtaXhlciIsICJNaWMgUmlnaHQgU3dpdGNoIiwgIk1pYyBp bnB1dCBtb2RlIG11eCJ9LAo+IC0gICAgICAgeyJNaWMgaW5wdXQgbW9kZSBtdXgiLCAiU2luZ2xl LWVuZGVkIiwgIk1JQ0lOMSJ9LAo+IC0gICAgICAgeyJNaWMgaW5wdXQgbW9kZSBtdXgiLCAiRGlm ZmVyZW50aWFsIiwgIk1JQ0lOMSJ9LAo+IC19Owo+IC0KPiAtc3RhdGljIHZvaWQgc2lyZl9hdWRp b19jb2RlY190eF9lbmFibGUoc3RydWN0IHNpcmZfYXVkaW9fY29kZWMgKnNpcmZfYXVkaW9fY29k ZWMpCj4gLXsKPiAtICAgICAgIHJlZ21hcF91cGRhdGVfYml0cyhzaXJmX2F1ZGlvX2NvZGVjLT5y ZWdtYXAsIEFVRElPX1BPUlRfSUNfVFhGSUZPX09QLAo+IC0gICAgICAgICAgICAgICBBVURJT19G SUZPX1JFU0VULCBBVURJT19GSUZPX1JFU0VUKTsKPiAtICAgICAgIHJlZ21hcF91cGRhdGVfYml0 cyhzaXJmX2F1ZGlvX2NvZGVjLT5yZWdtYXAsIEFVRElPX1BPUlRfSUNfVFhGSUZPX09QLAo+IC0g ICAgICAgICAgICAgICBBVURJT19GSUZPX1JFU0VULCB+QVVESU9fRklGT19SRVNFVCk7Cj4gLSAg ICAgICByZWdtYXBfd3JpdGUoc2lyZl9hdWRpb19jb2RlYy0+cmVnbWFwLCBBVURJT19QT1JUX0lD X1RYRklGT19JTlRfTVNLLCAwKTsKPiAtICAgICAgIHJlZ21hcF93cml0ZShzaXJmX2F1ZGlvX2Nv ZGVjLT5yZWdtYXAsIEFVRElPX1BPUlRfSUNfVFhGSUZPX09QLCAwKTsKPiAtICAgICAgIHJlZ21h cF91cGRhdGVfYml0cyhzaXJmX2F1ZGlvX2NvZGVjLT5yZWdtYXAsIEFVRElPX1BPUlRfSUNfVFhG SUZPX09QLAo+IC0gICAgICAgICAgICAgICBBVURJT19GSUZPX1NUQVJULCBBVURJT19GSUZPX1NU QVJUKTsKPiAtICAgICAgIHJlZ21hcF91cGRhdGVfYml0cyhzaXJmX2F1ZGlvX2NvZGVjLT5yZWdt YXAsCj4gLSAgICAgICAgICAgICAgIEFVRElPX1BPUlRfSUNfQ09ERUNfVFhfQ1RSTCwgSUNfVFhf RU5BQkxFLCBJQ19UWF9FTkFCTEUpOwo+IC19Cj4gLQo+IC1zdGF0aWMgdm9pZCBzaXJmX2F1ZGlv X2NvZGVjX3R4X2Rpc2FibGUoc3RydWN0IHNpcmZfYXVkaW9fY29kZWMgKnNpcmZfYXVkaW9fY29k ZWMpCj4gLXsKPiAtICAgICAgIHJlZ21hcF93cml0ZShzaXJmX2F1ZGlvX2NvZGVjLT5yZWdtYXAs IEFVRElPX1BPUlRfSUNfVFhGSUZPX09QLCAwKTsKPiAtICAgICAgIHJlZ21hcF91cGRhdGVfYml0 cyhzaXJmX2F1ZGlvX2NvZGVjLT5yZWdtYXAsCj4gLSAgICAgICAgICAgICAgIEFVRElPX1BPUlRf SUNfQ09ERUNfVFhfQ1RSTCwgSUNfVFhfRU5BQkxFLCB+SUNfVFhfRU5BQkxFKTsKPiAtfQo+IC0K PiAtc3RhdGljIHZvaWQgc2lyZl9hdWRpb19jb2RlY19yeF9lbmFibGUoc3RydWN0IHNpcmZfYXVk aW9fY29kZWMgKnNpcmZfYXVkaW9fY29kZWMsCj4gLSAgICAgICBpbnQgY2hhbm5lbHMpCj4gLXsK PiAtICAgICAgIHJlZ21hcF91cGRhdGVfYml0cyhzaXJmX2F1ZGlvX2NvZGVjLT5yZWdtYXAsIEFV RElPX1BPUlRfSUNfUlhGSUZPX09QLAo+IC0gICAgICAgICAgICAgICBBVURJT19GSUZPX1JFU0VU LCBBVURJT19GSUZPX1JFU0VUKTsKPiAtICAgICAgIHJlZ21hcF91cGRhdGVfYml0cyhzaXJmX2F1 ZGlvX2NvZGVjLT5yZWdtYXAsIEFVRElPX1BPUlRfSUNfUlhGSUZPX09QLAo+IC0gICAgICAgICAg ICAgICBBVURJT19GSUZPX1JFU0VULCB+QVVESU9fRklGT19SRVNFVCk7Cj4gLSAgICAgICByZWdt YXBfd3JpdGUoc2lyZl9hdWRpb19jb2RlYy0+cmVnbWFwLAo+IC0gICAgICAgICAgICAgICBBVURJ T19QT1JUX0lDX1JYRklGT19JTlRfTVNLLCAwKTsKPiAtICAgICAgIHJlZ21hcF93cml0ZShzaXJm X2F1ZGlvX2NvZGVjLT5yZWdtYXAsIEFVRElPX1BPUlRfSUNfUlhGSUZPX09QLCAwKTsKPiAtICAg ICAgIHJlZ21hcF91cGRhdGVfYml0cyhzaXJmX2F1ZGlvX2NvZGVjLT5yZWdtYXAsIEFVRElPX1BP UlRfSUNfUlhGSUZPX09QLAo+IC0gICAgICAgICAgICAgICBBVURJT19GSUZPX1NUQVJULCBBVURJ T19GSUZPX1NUQVJUKTsKPiAtICAgICAgIGlmIChjaGFubmVscyA9PSAxKQo+IC0gICAgICAgICAg ICAgICByZWdtYXBfdXBkYXRlX2JpdHMoc2lyZl9hdWRpb19jb2RlYy0+cmVnbWFwLAo+IC0gICAg ICAgICAgICAgICAgICAgICAgIEFVRElPX1BPUlRfSUNfQ09ERUNfUlhfQ1RSTCwKPiAtICAgICAg ICAgICAgICAgICAgICAgICBJQ19SWF9FTkFCTEVfTU9OTywgSUNfUlhfRU5BQkxFX01PTk8pOwo+ IC0gICAgICAgZWxzZQo+IC0gICAgICAgICAgICAgICByZWdtYXBfdXBkYXRlX2JpdHMoc2lyZl9h dWRpb19jb2RlYy0+cmVnbWFwLAo+IC0gICAgICAgICAgICAgICAgICAgICAgIEFVRElPX1BPUlRf SUNfQ09ERUNfUlhfQ1RSTCwKPiAtICAgICAgICAgICAgICAgICAgICAgICBJQ19SWF9FTkFCTEVf U1RFUkVPLCBJQ19SWF9FTkFCTEVfU1RFUkVPKTsKPiAtfQo+IC0KPiAtc3RhdGljIHZvaWQgc2ly Zl9hdWRpb19jb2RlY19yeF9kaXNhYmxlKHN0cnVjdCBzaXJmX2F1ZGlvX2NvZGVjICpzaXJmX2F1 ZGlvX2NvZGVjKQo+IC17Cj4gLSAgICAgICByZWdtYXBfdXBkYXRlX2JpdHMoc2lyZl9hdWRpb19j b2RlYy0+cmVnbWFwLAo+IC0gICAgICAgICAgICAgICAgICAgICAgIEFVRElPX1BPUlRfSUNfQ09E RUNfUlhfQ1RSTCwKPiAtICAgICAgICAgICAgICAgICAgICAgICBJQ19SWF9FTkFCTEVfU1RFUkVP LCB+SUNfUlhfRU5BQkxFX1NURVJFTyk7Cj4gLX0KPiAtCj4gLXN0YXRpYyBpbnQgc2lyZl9hdWRp b19jb2RlY190cmlnZ2VyKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtLAo+IC0g ICAgICAgICAgICAgICBpbnQgY21kLAo+IC0gICAgICAgICAgICAgICBzdHJ1Y3Qgc25kX3NvY19k YWkgKmRhaSkKPiAtewo+IC0gICAgICAgc3RydWN0IHNuZF9zb2NfY29tcG9uZW50ICpjb21wb25l bnQgPSBkYWktPmNvbXBvbmVudDsKPiAtICAgICAgIHN0cnVjdCBzaXJmX2F1ZGlvX2NvZGVjICpz aXJmX2F1ZGlvX2NvZGVjID0gc25kX3NvY19jb21wb25lbnRfZ2V0X2RydmRhdGEoY29tcG9uZW50 KTsKPiAtICAgICAgIGludCBwbGF5YmFjayA9IHN1YnN0cmVhbS0+c3RyZWFtID09IFNORFJWX1BD TV9TVFJFQU1fUExBWUJBQ0s7Cj4gLQo+IC0gICAgICAgLyoKPiAtICAgICAgICAqIFRoaXMgaXMg YSB3b3JrYXJvdW5kLCBXaGVuIHN0b3AgcGxheWJhY2ssCj4gLSAgICAgICAgKiBuZWVkIGRpc2Fi bGUgSFAgYW1wLCBhdm9pZCB0aGUgY3VycmVudCBub2lzZS4KPiAtICAgICAgICAqLwo+IC0gICAg ICAgc3dpdGNoIChjbWQpIHsKPiAtICAgICAgIGNhc2UgU05EUlZfUENNX1RSSUdHRVJfU1RPUDoK PiAtICAgICAgIGNhc2UgU05EUlZfUENNX1RSSUdHRVJfU1VTUEVORDoKPiAtICAgICAgIGNhc2Ug U05EUlZfUENNX1RSSUdHRVJfUEFVU0VfUFVTSDoKPiAtICAgICAgICAgICAgICAgaWYgKHBsYXli YWNrKSB7Cj4gLSAgICAgICAgICAgICAgICAgICAgICAgc25kX3NvY19jb21wb25lbnRfdXBkYXRl X2JpdHMoY29tcG9uZW50LCBBVURJT19JQ19DT0RFQ19DVFJMMCwKPiAtICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgIElDX0hTTEVOIHwgSUNfSFNSRU4sIDApOwo+IC0gICAgICAgICAgICAg ICAgICAgICAgIHNpcmZfYXVkaW9fY29kZWNfdHhfZGlzYWJsZShzaXJmX2F1ZGlvX2NvZGVjKTsK PiAtICAgICAgICAgICAgICAgfSBlbHNlCj4gLSAgICAgICAgICAgICAgICAgICAgICAgc2lyZl9h dWRpb19jb2RlY19yeF9kaXNhYmxlKHNpcmZfYXVkaW9fY29kZWMpOwo+IC0gICAgICAgICAgICAg ICBicmVhazsKPiAtICAgICAgIGNhc2UgU05EUlZfUENNX1RSSUdHRVJfU1RBUlQ6Cj4gLSAgICAg ICBjYXNlIFNORFJWX1BDTV9UUklHR0VSX1JFU1VNRToKPiAtICAgICAgIGNhc2UgU05EUlZfUENN X1RSSUdHRVJfUEFVU0VfUkVMRUFTRToKPiAtICAgICAgICAgICAgICAgaWYgKHBsYXliYWNrKSB7 Cj4gLSAgICAgICAgICAgICAgICAgICAgICAgc2lyZl9hdWRpb19jb2RlY190eF9lbmFibGUoc2ly Zl9hdWRpb19jb2RlYyk7Cj4gLSAgICAgICAgICAgICAgICAgICAgICAgc25kX3NvY19jb21wb25l bnRfdXBkYXRlX2JpdHMoY29tcG9uZW50LCBBVURJT19JQ19DT0RFQ19DVFJMMCwKPiAtICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgIElDX0hTTEVOIHwgSUNfSFNSRU4sIElDX0hTTEVOIHwg SUNfSFNSRU4pOwo+IC0gICAgICAgICAgICAgICB9IGVsc2UKPiAtICAgICAgICAgICAgICAgICAg ICAgICBzaXJmX2F1ZGlvX2NvZGVjX3J4X2VuYWJsZShzaXJmX2F1ZGlvX2NvZGVjLAo+IC0gICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Vic3RyZWFtLT5ydW50aW1lLT5jaGFubmVscyk7 Cj4gLSAgICAgICAgICAgICAgIGJyZWFrOwo+IC0gICAgICAgZGVmYXVsdDoKPiAtICAgICAgICAg ICAgICAgcmV0dXJuIC1FSU5WQUw7Cj4gLSAgICAgICB9Cj4gLQo+IC0gICAgICAgcmV0dXJuIDA7 Cj4gLX0KPiAtCj4gLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX3NvY19kYWlfb3BzIHNpcmZfYXVk aW9fY29kZWNfZGFpX29wcyA9IHsKPiAtICAgICAgIC50cmlnZ2VyID0gc2lyZl9hdWRpb19jb2Rl Y190cmlnZ2VyLAo+IC19Owo+IC0KPiAtc3RhdGljIHN0cnVjdCBzbmRfc29jX2RhaV9kcml2ZXIg c2lyZl9hdWRpb19jb2RlY19kYWkgPSB7Cj4gLSAgICAgICAubmFtZSA9ICJzaXJmLWF1ZGlvLWNv ZGVjIiwKPiAtICAgICAgIC5wbGF5YmFjayA9IHsKPiAtICAgICAgICAgICAgICAgLnN0cmVhbV9u YW1lID0gIlBsYXliYWNrIiwKPiAtICAgICAgICAgICAgICAgLmNoYW5uZWxzX21pbiA9IDIsCj4g LSAgICAgICAgICAgICAgIC5jaGFubmVsc19tYXggPSAyLAo+IC0gICAgICAgICAgICAgICAucmF0 ZXMgPSBTTkRSVl9QQ01fUkFURV80ODAwMCwKPiAtICAgICAgICAgICAgICAgLmZvcm1hdHMgPSBT TkRSVl9QQ01fRk1UQklUX1MxNl9MRSwKPiAtICAgICAgIH0sCj4gLSAgICAgICAuY2FwdHVyZSA9 IHsKPiAtICAgICAgICAgICAgICAgLnN0cmVhbV9uYW1lID0gIkNhcHR1cmUiLAo+IC0gICAgICAg ICAgICAgICAuY2hhbm5lbHNfbWluID0gMSwKPiAtICAgICAgICAgICAgICAgLmNoYW5uZWxzX21h eCA9IDIsCj4gLSAgICAgICAgICAgICAgIC5yYXRlcyA9IFNORFJWX1BDTV9SQVRFXzQ4MDAwLAo+ IC0gICAgICAgICAgICAgICAuZm9ybWF0cyA9IFNORFJWX1BDTV9GTVRCSVRfUzE2X0xFLAo+IC0g ICAgICAgfSwKPiAtICAgICAgIC5vcHMgPSAmc2lyZl9hdWRpb19jb2RlY19kYWlfb3BzLAo+IC19 Owo+IC0KPiAtc3RhdGljIGludCBzaXJmX2F1ZGlvX2NvZGVjX3Byb2JlKHN0cnVjdCBzbmRfc29j X2NvbXBvbmVudCAqY29tcG9uZW50KQo+IC17Cj4gLSAgICAgICBzdHJ1Y3Qgc25kX3NvY19kYXBt X2NvbnRleHQgKmRhcG0gPSBzbmRfc29jX2NvbXBvbmVudF9nZXRfZGFwbShjb21wb25lbnQpOwo+ IC0KPiAtICAgICAgIHBtX3J1bnRpbWVfZW5hYmxlKGNvbXBvbmVudC0+ZGV2KTsKPiAtCj4gLSAg ICAgICBpZiAob2ZfZGV2aWNlX2lzX2NvbXBhdGlibGUoY29tcG9uZW50LT5kZXYtPm9mX25vZGUs ICJzaXJmLHByaW1hMi1hdWRpby1jb2RlYyIpKSB7Cj4gLSAgICAgICAgICAgICAgIHNuZF9zb2Nf ZGFwbV9uZXdfY29udHJvbHMoZGFwbSwKPiAtICAgICAgICAgICAgICAgICAgICAgICBwcmltYTJf b3V0cHV0X2RyaXZlcl9kYXBtX3dpZGdldHMsCj4gLSAgICAgICAgICAgICAgICAgICAgICAgQVJS QVlfU0laRShwcmltYTJfb3V0cHV0X2RyaXZlcl9kYXBtX3dpZGdldHMpKTsKPiAtICAgICAgICAg ICAgICAgc25kX3NvY19kYXBtX25ld19jb250cm9scyhkYXBtLAo+IC0gICAgICAgICAgICAgICAg ICAgICAgICZwcmltYTJfY29kZWNfY2xvY2tfZGFwbV93aWRnZXQsIDEpOwo+IC0gICAgICAgICAg ICAgICByZXR1cm4gc25kX3NvY19hZGRfY29tcG9uZW50X2NvbnRyb2xzKGNvbXBvbmVudCwKPiAt ICAgICAgICAgICAgICAgICAgICAgICB2b2x1bWVfY29udHJvbHNfcHJpbWEyLAo+IC0gICAgICAg ICAgICAgICAgICAgICAgIEFSUkFZX1NJWkUodm9sdW1lX2NvbnRyb2xzX3ByaW1hMikpOwo+IC0g ICAgICAgfQo+IC0gICAgICAgaWYgKG9mX2RldmljZV9pc19jb21wYXRpYmxlKGNvbXBvbmVudC0+ ZGV2LT5vZl9ub2RlLCAic2lyZixhdGxhczYtYXVkaW8tY29kZWMiKSkgewo+IC0gICAgICAgICAg ICAgICBzbmRfc29jX2RhcG1fbmV3X2NvbnRyb2xzKGRhcG0sCj4gLSAgICAgICAgICAgICAgICAg ICAgICAgYXRsYXM2X291dHB1dF9kcml2ZXJfZGFwbV93aWRnZXRzLAo+IC0gICAgICAgICAgICAg ICAgICAgICAgIEFSUkFZX1NJWkUoYXRsYXM2X291dHB1dF9kcml2ZXJfZGFwbV93aWRnZXRzKSk7 Cj4gLSAgICAgICAgICAgICAgIHNuZF9zb2NfZGFwbV9uZXdfY29udHJvbHMoZGFwbSwKPiAtICAg ICAgICAgICAgICAgICAgICAgICAmYXRsYXM2X2NvZGVjX2Nsb2NrX2RhcG1fd2lkZ2V0LCAxKTsK PiAtICAgICAgICAgICAgICAgcmV0dXJuIHNuZF9zb2NfYWRkX2NvbXBvbmVudF9jb250cm9scyhj b21wb25lbnQsCj4gLSAgICAgICAgICAgICAgICAgICAgICAgdm9sdW1lX2NvbnRyb2xzX2F0bGFz NiwKPiAtICAgICAgICAgICAgICAgICAgICAgICBBUlJBWV9TSVpFKHZvbHVtZV9jb250cm9sc19h dGxhczYpKTsKPiAtICAgICAgIH0KPiAtCj4gLSAgICAgICByZXR1cm4gLUVJTlZBTDsKPiAtfQo+ IC0KPiAtc3RhdGljIHZvaWQgc2lyZl9hdWRpb19jb2RlY19yZW1vdmUoc3RydWN0IHNuZF9zb2Nf Y29tcG9uZW50ICpjb21wb25lbnQpCj4gLXsKPiAtICAgICAgIHBtX3J1bnRpbWVfZGlzYWJsZShj b21wb25lbnQtPmRldik7Cj4gLX0KPiAtCj4gLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX3NvY19j b21wb25lbnRfZHJpdmVyIHNvY19jb2RlY19kZXZpY2Vfc2lyZl9hdWRpb19jb2RlYyA9IHsKPiAt ICAgICAgIC5wcm9iZSAgICAgICAgICAgICAgICAgID0gc2lyZl9hdWRpb19jb2RlY19wcm9iZSwK PiAtICAgICAgIC5yZW1vdmUgICAgICAgICAgICAgICAgID0gc2lyZl9hdWRpb19jb2RlY19yZW1v dmUsCj4gLSAgICAgICAuZGFwbV93aWRnZXRzICAgICAgICAgICA9IHNpcmZfYXVkaW9fY29kZWNf ZGFwbV93aWRnZXRzLAo+IC0gICAgICAgLm51bV9kYXBtX3dpZGdldHMgICAgICAgPSBBUlJBWV9T SVpFKHNpcmZfYXVkaW9fY29kZWNfZGFwbV93aWRnZXRzKSwKPiAtICAgICAgIC5kYXBtX3JvdXRl cyAgICAgICAgICAgID0gc2lyZl9hdWRpb19jb2RlY19tYXAsCj4gLSAgICAgICAubnVtX2RhcG1f cm91dGVzICAgICAgICA9IEFSUkFZX1NJWkUoc2lyZl9hdWRpb19jb2RlY19tYXApLAo+IC0gICAg ICAgLnVzZV9wbWRvd25fdGltZSAgICAgICAgPSAxLAo+IC0gICAgICAgLmVuZGlhbm5lc3MgICAg ICAgICAgICAgPSAxLAo+IC0gICAgICAgLm5vbl9sZWdhY3lfZGFpX25hbWluZyAgPSAxLAo+IC19 Owo+IC0KPiAtc3RhdGljIGNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgc2lyZl9hdWRpb19jb2Rl Y19vZl9tYXRjaFtdID0gewo+IC0gICAgICAgeyAuY29tcGF0aWJsZSA9ICJzaXJmLHByaW1hMi1h dWRpby1jb2RlYyIgfSwKPiAtICAgICAgIHsgLmNvbXBhdGlibGUgPSAic2lyZixhdGxhczYtYXVk aW8tY29kZWMiIH0sCj4gLSAgICAgICB7fQo+IC19Owo+IC1NT0RVTEVfREVWSUNFX1RBQkxFKG9m LCBzaXJmX2F1ZGlvX2NvZGVjX29mX21hdGNoKTsKPiAtCj4gLXN0YXRpYyBjb25zdCBzdHJ1Y3Qg cmVnbWFwX2NvbmZpZyBzaXJmX2F1ZGlvX2NvZGVjX3JlZ21hcF9jb25maWcgPSB7Cj4gLSAgICAg ICAucmVnX2JpdHMgPSAzMiwKPiAtICAgICAgIC5yZWdfc3RyaWRlID0gNCwKPiAtICAgICAgIC52 YWxfYml0cyA9IDMyLAo+IC0gICAgICAgLm1heF9yZWdpc3RlciA9IEFVRElPX1BPUlRfSUNfUlhG SUZPX0lOVF9NU0ssCj4gLSAgICAgICAuY2FjaGVfdHlwZSA9IFJFR0NBQ0hFX05PTkUsCj4gLX07 Cj4gLQo+IC1zdGF0aWMgaW50IHNpcmZfYXVkaW9fY29kZWNfZHJpdmVyX3Byb2JlKHN0cnVjdCBw bGF0Zm9ybV9kZXZpY2UgKnBkZXYpCj4gLXsKPiAtICAgICAgIGludCByZXQ7Cj4gLSAgICAgICBz dHJ1Y3Qgc2lyZl9hdWRpb19jb2RlYyAqc2lyZl9hdWRpb19jb2RlYzsKPiAtICAgICAgIHZvaWQg X19pb21lbSAqYmFzZTsKPiAtCj4gLSAgICAgICBzaXJmX2F1ZGlvX2NvZGVjID0gZGV2bV9remFs bG9jKCZwZGV2LT5kZXYsCj4gLSAgICAgICAgICAgICAgIHNpemVvZihzdHJ1Y3Qgc2lyZl9hdWRp b19jb2RlYyksIEdGUF9LRVJORUwpOwo+IC0gICAgICAgaWYgKCFzaXJmX2F1ZGlvX2NvZGVjKQo+ IC0gICAgICAgICAgICAgICByZXR1cm4gLUVOT01FTTsKPiAtCj4gLSAgICAgICBwbGF0Zm9ybV9z ZXRfZHJ2ZGF0YShwZGV2LCBzaXJmX2F1ZGlvX2NvZGVjKTsKPiAtCj4gLSAgICAgICBiYXNlID0g ZGV2bV9wbGF0Zm9ybV9pb3JlbWFwX3Jlc291cmNlKHBkZXYsIDApOwo+IC0gICAgICAgaWYgKElT X0VSUihiYXNlKSkKPiAtICAgICAgICAgICAgICAgcmV0dXJuIFBUUl9FUlIoYmFzZSk7Cj4gLQo+ IC0gICAgICAgc2lyZl9hdWRpb19jb2RlYy0+cmVnbWFwID0gZGV2bV9yZWdtYXBfaW5pdF9tbWlv KCZwZGV2LT5kZXYsIGJhc2UsCj4gLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAmc2lyZl9hdWRpb19jb2RlY19yZWdtYXBfY29uZmlnKTsKPiAtICAgICAgIGlmIChJ U19FUlIoc2lyZl9hdWRpb19jb2RlYy0+cmVnbWFwKSkKPiAtICAgICAgICAgICAgICAgcmV0dXJu IFBUUl9FUlIoc2lyZl9hdWRpb19jb2RlYy0+cmVnbWFwKTsKPiAtCj4gLSAgICAgICBzaXJmX2F1 ZGlvX2NvZGVjLT5jbGsgPSBkZXZtX2Nsa19nZXQoJnBkZXYtPmRldiwgTlVMTCk7Cj4gLSAgICAg ICBpZiAoSVNfRVJSKHNpcmZfYXVkaW9fY29kZWMtPmNsaykpIHsKPiAtICAgICAgICAgICAgICAg ZGV2X2VycigmcGRldi0+ZGV2LCAiR2V0IGNsb2NrIGZhaWxlZC5cbiIpOwo+IC0gICAgICAgICAg ICAgICByZXR1cm4gUFRSX0VSUihzaXJmX2F1ZGlvX2NvZGVjLT5jbGspOwo+IC0gICAgICAgfQo+ IC0KPiAtICAgICAgIHJldCA9IGNsa19wcmVwYXJlX2VuYWJsZShzaXJmX2F1ZGlvX2NvZGVjLT5j bGspOwo+IC0gICAgICAgaWYgKHJldCkgewo+IC0gICAgICAgICAgICAgICBkZXZfZXJyKCZwZGV2 LT5kZXYsICJFbmFibGUgY2xvY2sgZmFpbGVkLlxuIik7Cj4gLSAgICAgICAgICAgICAgIHJldHVy biByZXQ7Cj4gLSAgICAgICB9Cj4gLQo+IC0gICAgICAgcmV0ID0gZGV2bV9zbmRfc29jX3JlZ2lz dGVyX2NvbXBvbmVudCgmKHBkZXYtPmRldiksCj4gLSAgICAgICAgICAgICAgICAgICAgICAgJnNv Y19jb2RlY19kZXZpY2Vfc2lyZl9hdWRpb19jb2RlYywKPiAtICAgICAgICAgICAgICAgICAgICAg ICAmc2lyZl9hdWRpb19jb2RlY19kYWksIDEpOwo+IC0gICAgICAgaWYgKHJldCkgewo+IC0gICAg ICAgICAgICAgICBkZXZfZXJyKCZwZGV2LT5kZXYsICJSZWdpc3RlciBBdWRpbyBDb2RlYyBkYWkg ZmFpbGVkLlxuIik7Cj4gLSAgICAgICAgICAgICAgIGdvdG8gZXJyX2Nsa19wdXQ7Cj4gLSAgICAg ICB9Cj4gLQo+IC0gICAgICAgLyoKPiAtICAgICAgICAqIEFsd2F5cyBvcGVuIGNoYXJnZSBwdW1w LCBpZiBub3QsIHdoZW4gdGhlIGNoYXJnZSBwdW1wIGNsb3NlZCB0aGUKPiAtICAgICAgICAqIGFk YyB3aWxsIG5vdCBzdGFibGUKPiAtICAgICAgICAqLwo+IC0gICAgICAgcmVnbWFwX3VwZGF0ZV9i aXRzKHNpcmZfYXVkaW9fY29kZWMtPnJlZ21hcCwgQVVESU9fSUNfQ09ERUNfQ1RSTDAsCj4gLSAg ICAgICAgICAgICAgIElDX0NQRlJFUSwgSUNfQ1BGUkVRKTsKPiAtCj4gLSAgICAgICBpZiAob2Zf ZGV2aWNlX2lzX2NvbXBhdGlibGUocGRldi0+ZGV2Lm9mX25vZGUsICJzaXJmLGF0bGFzNi1hdWRp by1jb2RlYyIpKQo+IC0gICAgICAgICAgICAgICByZWdtYXBfdXBkYXRlX2JpdHMoc2lyZl9hdWRp b19jb2RlYy0+cmVnbWFwLAo+IC0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9f SUNfQ09ERUNfQ1RSTDAsIElDX0NQRU4sIElDX0NQRU4pOwo+IC0gICAgICAgcmV0dXJuIDA7Cj4g LQo+IC1lcnJfY2xrX3B1dDoKPiAtICAgICAgIGNsa19kaXNhYmxlX3VucHJlcGFyZShzaXJmX2F1 ZGlvX2NvZGVjLT5jbGspOwo+IC0gICAgICAgcmV0dXJuIHJldDsKPiAtfQo+IC0KPiAtc3RhdGlj IGludCBzaXJmX2F1ZGlvX2NvZGVjX2RyaXZlcl9yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2Rldmlj ZSAqcGRldikKPiAtewo+IC0gICAgICAgc3RydWN0IHNpcmZfYXVkaW9fY29kZWMgKnNpcmZfYXVk aW9fY29kZWMgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKPiAtCj4gLSAgICAgICBjbGtf ZGlzYWJsZV91bnByZXBhcmUoc2lyZl9hdWRpb19jb2RlYy0+Y2xrKTsKPiAtCj4gLSAgICAgICBy ZXR1cm4gMDsKPiAtfQo+IC0KPiAtI2lmZGVmIENPTkZJR19QTV9TTEVFUAo+IC1zdGF0aWMgaW50 IHNpcmZfYXVkaW9fY29kZWNfc3VzcGVuZChzdHJ1Y3QgZGV2aWNlICpkZXYpCj4gLXsKPiAtICAg ICAgIHN0cnVjdCBzaXJmX2F1ZGlvX2NvZGVjICpzaXJmX2F1ZGlvX2NvZGVjID0gZGV2X2dldF9k cnZkYXRhKGRldik7Cj4gLQo+IC0gICAgICAgcmVnbWFwX3JlYWQoc2lyZl9hdWRpb19jb2RlYy0+ cmVnbWFwLCBBVURJT19JQ19DT0RFQ19DVFJMMCwKPiAtICAgICAgICAgICAgICAgJnNpcmZfYXVk aW9fY29kZWMtPnJlZ19jdHJsMCk7Cj4gLSAgICAgICByZWdtYXBfcmVhZChzaXJmX2F1ZGlvX2Nv ZGVjLT5yZWdtYXAsIEFVRElPX0lDX0NPREVDX0NUUkwxLAo+IC0gICAgICAgICAgICAgICAmc2ly Zl9hdWRpb19jb2RlYy0+cmVnX2N0cmwxKTsKPiAtICAgICAgIGNsa19kaXNhYmxlX3VucHJlcGFy ZShzaXJmX2F1ZGlvX2NvZGVjLT5jbGspOwo+IC0KPiAtICAgICAgIHJldHVybiAwOwo+IC19Cj4g LQo+IC1zdGF0aWMgaW50IHNpcmZfYXVkaW9fY29kZWNfcmVzdW1lKHN0cnVjdCBkZXZpY2UgKmRl dikKPiAtewo+IC0gICAgICAgc3RydWN0IHNpcmZfYXVkaW9fY29kZWMgKnNpcmZfYXVkaW9fY29k ZWMgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKPiAtICAgICAgIGludCByZXQ7Cj4gLQo+IC0gICAg ICAgcmV0ID0gY2xrX3ByZXBhcmVfZW5hYmxlKHNpcmZfYXVkaW9fY29kZWMtPmNsayk7Cj4gLSAg ICAgICBpZiAocmV0KQo+IC0gICAgICAgICAgICAgICByZXR1cm4gcmV0Owo+IC0KPiAtICAgICAg IHJlZ21hcF93cml0ZShzaXJmX2F1ZGlvX2NvZGVjLT5yZWdtYXAsIEFVRElPX0lDX0NPREVDX0NU UkwwLAo+IC0gICAgICAgICAgICAgICBzaXJmX2F1ZGlvX2NvZGVjLT5yZWdfY3RybDApOwo+IC0g ICAgICAgcmVnbWFwX3dyaXRlKHNpcmZfYXVkaW9fY29kZWMtPnJlZ21hcCwgQVVESU9fSUNfQ09E RUNfQ1RSTDEsCj4gLSAgICAgICAgICAgICAgIHNpcmZfYXVkaW9fY29kZWMtPnJlZ19jdHJsMSk7 Cj4gLQo+IC0gICAgICAgcmV0dXJuIDA7Cj4gLX0KPiAtI2VuZGlmCj4gLQo+IC1zdGF0aWMgY29u c3Qgc3RydWN0IGRldl9wbV9vcHMgc2lyZl9hdWRpb19jb2RlY19wbV9vcHMgPSB7Cj4gLSAgICAg ICBTRVRfU1lTVEVNX1NMRUVQX1BNX09QUyhzaXJmX2F1ZGlvX2NvZGVjX3N1c3BlbmQsIHNpcmZf YXVkaW9fY29kZWNfcmVzdW1lKQo+IC19Owo+IC0KPiAtc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9k cml2ZXIgc2lyZl9hdWRpb19jb2RlY19kcml2ZXIgPSB7Cj4gLSAgICAgICAuZHJpdmVyID0gewo+ IC0gICAgICAgICAgICAgICAubmFtZSA9ICJzaXJmLWF1ZGlvLWNvZGVjIiwKPiAtICAgICAgICAg ICAgICAgLm9mX21hdGNoX3RhYmxlID0gc2lyZl9hdWRpb19jb2RlY19vZl9tYXRjaCwKPiAtICAg ICAgICAgICAgICAgLnBtID0gJnNpcmZfYXVkaW9fY29kZWNfcG1fb3BzLAo+IC0gICAgICAgfSwK PiAtICAgICAgIC5wcm9iZSA9IHNpcmZfYXVkaW9fY29kZWNfZHJpdmVyX3Byb2JlLAo+IC0gICAg ICAgLnJlbW92ZSA9IHNpcmZfYXVkaW9fY29kZWNfZHJpdmVyX3JlbW92ZSwKPiAtfTsKPiAtCj4g LW1vZHVsZV9wbGF0Zm9ybV9kcml2ZXIoc2lyZl9hdWRpb19jb2RlY19kcml2ZXIpOwo+IC0KPiAt TU9EVUxFX0RFU0NSSVBUSU9OKCJTaVJGIGF1ZGlvIGNvZGVjIGRyaXZlciIpOwo+IC1NT0RVTEVf QVVUSE9SKCJSb25nSnVuIFlpbmcgPFJvbmdqdW4uWWluZ0Bjc3IuY29tPiIpOwo+IC1NT0RVTEVf TElDRU5TRSgiR1BMIHYyIik7Cj4gZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9zaXJmL0tjb25maWcg Yi9zb3VuZC9zb2Mvc2lyZi9LY29uZmlnCj4gZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0Cj4gaW5k ZXggMDk0YTFjODljNTlkLi4wMDAwMDAwMDAwMDAKPiAtLS0gYS9zb3VuZC9zb2Mvc2lyZi9LY29u ZmlnCj4gKysrIC9kZXYvbnVsbAo+IEBAIC0xLDIxICswLDAgQEAKPiAtIyBTUERYLUxpY2Vuc2Ut SWRlbnRpZmllcjogR1BMLTIuMC1vbmx5Cj4gLWNvbmZpZyBTTkRfU09DX1NJUkYKPiAtICAgICAg IHRyaXN0YXRlICJTb0MgQXVkaW8gZm9yIHRoZSBTaVJGIFNvQyBjaGlwcyIKPiAtICAgICAgIGRl cGVuZHMgb24gQVJDSF9TSVJGIHx8IENPTVBJTEVfVEVTVAo+IC0gICAgICAgc2VsZWN0IFNORF9T T0NfR0VORVJJQ19ETUFFTkdJTkVfUENNCj4gLQo+IC1jb25maWcgU05EX1NPQ19TSVJGX0FVRElP Cj4gLSAgICAgICB0cmlzdGF0ZSAiU29DIEF1ZGlvIHN1cHBvcnQgZm9yIFNpUkYgaW50ZXJuYWwg YXVkaW8gY29kZWMiCj4gLSAgICAgICBkZXBlbmRzIG9uIFNORF9TT0NfU0lSRgo+IC0gICAgICAg c2VsZWN0IFNORF9TT0NfU0lSRl9BVURJT19DT0RFQwo+IC0gICAgICAgc2VsZWN0IFNORF9TT0Nf U0lSRl9BVURJT19QT1JUCj4gLQo+IC1jb25maWcgU05EX1NPQ19TSVJGX0FVRElPX1BPUlQKPiAt ICAgICAgIHNlbGVjdCBSRUdNQVBfTU1JTwo+IC0gICAgICAgdHJpc3RhdGUKPiAtCj4gLWNvbmZp ZyBTTkRfU09DX1NJUkZfVVNQCj4gLSAgICAgICB0cmlzdGF0ZSAiU29DIEF1ZGlvIChJMlMgcHJv dG9jb2wpIGZvciBTaVJGIFNvQyBVU1AgaW50ZXJmYWNlIgo+IC0gICAgICAgZGVwZW5kcyBvbiBT TkRfU09DX1NJUkYKPiAtICAgICAgIHNlbGVjdCBSRUdNQVBfTU1JTwo+IC0gICAgICAgdHJpc3Rh dGUKPiBkaWZmIC0tZ2l0IGEvc291bmQvc29jL3NpcmYvTWFrZWZpbGUgYi9zb3VuZC9zb2Mvc2ly Zi9NYWtlZmlsZQo+IGRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAo+IGluZGV4IDE2ZWQxMTk2NWZm OS4uMDAwMDAwMDAwMDAwCj4gLS0tIGEvc291bmQvc29jL3NpcmYvTWFrZWZpbGUKPiArKysgL2Rl di9udWxsCj4gQEAgLTEsOCArMCwwIEBACj4gLSMgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQ TC0yLjAKPiAtc25kLXNvYy1zaXJmLWF1ZGlvLW9ianMgOj0gc2lyZi1hdWRpby5vCj4gLXNuZC1z b2Mtc2lyZi1hdWRpby1wb3J0LW9ianMgOj0gc2lyZi1hdWRpby1wb3J0Lm8KPiAtc25kLXNvYy1z aXJmLXVzcC1vYmpzIDo9IHNpcmYtdXNwLm8KPiAtCj4gLW9iai0kKENPTkZJR19TTkRfU09DX1NJ UkZfQVVESU8pICs9IHNuZC1zb2Mtc2lyZi1hdWRpby5vCj4gLW9iai0kKENPTkZJR19TTkRfU09D X1NJUkZfQVVESU9fUE9SVCkgKz0gc25kLXNvYy1zaXJmLWF1ZGlvLXBvcnQubwo+IC1vYmotJChD T05GSUdfU05EX1NPQ19TSVJGX1VTUCkgKz0gc25kLXNvYy1zaXJmLXVzcC5vCj4gZGlmZiAtLWdp dCBhL3NvdW5kL3NvYy9zaXJmL3NpcmYtYXVkaW8tcG9ydC5jIGIvc291bmQvc29jL3NpcmYvc2ly Zi1hdWRpby1wb3J0LmMKPiBkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKPiBpbmRleCA4YmUyZjBi YzQ3N2IuLjAwMDAwMDAwMDAwMAo+IC0tLSBhL3NvdW5kL3NvYy9zaXJmL3NpcmYtYXVkaW8tcG9y dC5jCj4gKysrIC9kZXYvbnVsbAo+IEBAIC0xLDg2ICswLDAgQEAKPiAtLy8gU1BEWC1MaWNlbnNl LUlkZW50aWZpZXI6IEdQTC0yLjAtb3ItbGF0ZXIKPiAtLyoKPiAtICogU2lSRiBBdWRpbyBwb3J0 IGRyaXZlcgo+IC0gKgo+IC0gKiBDb3B5cmlnaHQgKGMpIDIwMTEgQ2FtYnJpZGdlIFNpbGljb24g UmFkaW8gTGltaXRlZCwgYSBDU1IgcGxjIGdyb3VwIGNvbXBhbnkuCj4gLSAqLwo+IC0jaW5jbHVk ZSA8bGludXgvbW9kdWxlLmg+Cj4gLSNpbmNsdWRlIDxzb3VuZC9zb2MuaD4KPiAtI2luY2x1ZGUg PHNvdW5kL2RtYWVuZ2luZV9wY20uaD4KPiAtCj4gLXN0cnVjdCBzaXJmX2F1ZGlvX3BvcnQgewo+ IC0gICAgICAgc3RydWN0IHJlZ21hcCAqcmVnbWFwOwo+IC0gICAgICAgc3RydWN0IHNuZF9kbWFl bmdpbmVfZGFpX2RtYV9kYXRhIHBsYXliYWNrX2RtYV9kYXRhOwo+IC0gICAgICAgc3RydWN0IHNu ZF9kbWFlbmdpbmVfZGFpX2RtYV9kYXRhIGNhcHR1cmVfZG1hX2RhdGE7Cj4gLX07Cj4gLQo+IC0K PiAtc3RhdGljIGludCBzaXJmX2F1ZGlvX3BvcnRfZGFpX3Byb2JlKHN0cnVjdCBzbmRfc29jX2Rh aSAqZGFpKQo+IC17Cj4gLSAgICAgICBzdHJ1Y3Qgc2lyZl9hdWRpb19wb3J0ICpwb3J0ID0gc25k X3NvY19kYWlfZ2V0X2RydmRhdGEoZGFpKTsKPiAtCj4gLSAgICAgICBzbmRfc29jX2RhaV9pbml0 X2RtYV9kYXRhKGRhaSwgJnBvcnQtPnBsYXliYWNrX2RtYV9kYXRhLAo+IC0gICAgICAgICAgICAg ICAgICAgICAgICZwb3J0LT5jYXB0dXJlX2RtYV9kYXRhKTsKPiAtICAgICAgIHJldHVybiAwOwo+ IC19Cj4gLQo+IC1zdGF0aWMgc3RydWN0IHNuZF9zb2NfZGFpX2RyaXZlciBzaXJmX2F1ZGlvX3Bv cnRfZGFpID0gewo+IC0gICAgICAgLnByb2JlID0gc2lyZl9hdWRpb19wb3J0X2RhaV9wcm9iZSwK PiAtICAgICAgIC5uYW1lID0gInNpcmYtYXVkaW8tcG9ydCIsCj4gLSAgICAgICAuaWQgPSAwLAo+ IC0gICAgICAgLnBsYXliYWNrID0gewo+IC0gICAgICAgICAgICAgICAuY2hhbm5lbHNfbWluID0g MiwKPiAtICAgICAgICAgICAgICAgLmNoYW5uZWxzX21heCA9IDIsCj4gLSAgICAgICAgICAgICAg IC5yYXRlcyA9IFNORFJWX1BDTV9SQVRFXzQ4MDAwLAo+IC0gICAgICAgICAgICAgICAuZm9ybWF0 cyA9IFNORFJWX1BDTV9GTVRCSVRfUzE2X0xFLAo+IC0gICAgICAgfSwKPiAtICAgICAgIC5jYXB0 dXJlID0gewo+IC0gICAgICAgICAgICAgICAuY2hhbm5lbHNfbWluID0gMSwKPiAtICAgICAgICAg ICAgICAgLmNoYW5uZWxzX21heCA9IDIsCj4gLSAgICAgICAgICAgICAgIC5yYXRlcyA9IFNORFJW X1BDTV9SQVRFXzQ4MDAwLAo+IC0gICAgICAgICAgICAgICAuZm9ybWF0cyA9IFNORFJWX1BDTV9G TVRCSVRfUzE2X0xFLAo+IC0gICAgICAgfSwKPiAtfTsKPiAtCj4gLXN0YXRpYyBjb25zdCBzdHJ1 Y3Qgc25kX3NvY19jb21wb25lbnRfZHJpdmVyIHNpcmZfYXVkaW9fcG9ydF9jb21wb25lbnQgPSB7 Cj4gLSAgICAgICAubmFtZSAgICAgICA9ICJzaXJmLWF1ZGlvLXBvcnQiLAo+IC19Owo+IC0KPiAt c3RhdGljIGludCBzaXJmX2F1ZGlvX3BvcnRfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAq cGRldikKPiAtewo+IC0gICAgICAgaW50IHJldDsKPiAtICAgICAgIHN0cnVjdCBzaXJmX2F1ZGlv X3BvcnQgKnBvcnQ7Cj4gLQo+IC0gICAgICAgcG9ydCA9IGRldm1fa3phbGxvYygmcGRldi0+ZGV2 LAo+IC0gICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihzdHJ1Y3Qgc2lyZl9hdWRpb19wb3J0 KSwgR0ZQX0tFUk5FTCk7Cj4gLSAgICAgICBpZiAoIXBvcnQpCj4gLSAgICAgICAgICAgICAgIHJl dHVybiAtRU5PTUVNOwo+IC0KPiAtICAgICAgIHJldCA9IGRldm1fc25kX3NvY19yZWdpc3Rlcl9j b21wb25lbnQoJnBkZXYtPmRldiwKPiAtICAgICAgICAgICAgICAgICAgICAgICAmc2lyZl9hdWRp b19wb3J0X2NvbXBvbmVudCwgJnNpcmZfYXVkaW9fcG9ydF9kYWksIDEpOwo+IC0gICAgICAgaWYg KHJldCkKPiAtICAgICAgICAgICAgICAgcmV0dXJuIHJldDsKPiAtCj4gLSAgICAgICBwbGF0Zm9y bV9zZXRfZHJ2ZGF0YShwZGV2LCBwb3J0KTsKPiAtICAgICAgIHJldHVybiBkZXZtX3NuZF9kbWFl bmdpbmVfcGNtX3JlZ2lzdGVyKCZwZGV2LT5kZXYsIE5VTEwsIDApOwo+IC19Cj4gLQo+IC1zdGF0 aWMgY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCBzaXJmX2F1ZGlvX3BvcnRfb2ZfbWF0Y2hbXSA9 IHsKPiAtICAgICAgIHsgLmNvbXBhdGlibGUgPSAic2lyZixhdWRpby1wb3J0IiwgfSwKPiAtICAg ICAgIHt9Cj4gLX07Cj4gLU1PRFVMRV9ERVZJQ0VfVEFCTEUob2YsIHNpcmZfYXVkaW9fcG9ydF9v Zl9tYXRjaCk7Cj4gLQo+IC1zdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciBzaXJmX2F1ZGlv X3BvcnRfZHJpdmVyID0gewo+IC0gICAgICAgLmRyaXZlciA9IHsKPiAtICAgICAgICAgICAgICAg Lm5hbWUgPSAic2lyZi1hdWRpby1wb3J0IiwKPiAtICAgICAgICAgICAgICAgLm9mX21hdGNoX3Rh YmxlID0gc2lyZl9hdWRpb19wb3J0X29mX21hdGNoLAo+IC0gICAgICAgfSwKPiAtICAgICAgIC5w cm9iZSA9IHNpcmZfYXVkaW9fcG9ydF9wcm9iZSwKPiAtfTsKPiAtCj4gLW1vZHVsZV9wbGF0Zm9y bV9kcml2ZXIoc2lyZl9hdWRpb19wb3J0X2RyaXZlcik7Cj4gLQo+IC1NT0RVTEVfREVTQ1JJUFRJ T04oIlNpUkYgQXVkaW8gUG9ydCBkcml2ZXIiKTsKPiAtTU9EVUxFX0FVVEhPUigiUm9uZ0p1biBZ aW5nIDxSb25nanVuLllpbmdAY3NyLmNvbT4iKTsKPiAtTU9EVUxFX0xJQ0VOU0UoIkdQTCB2MiIp Owo+IGRpZmYgLS1naXQgYS9zb3VuZC9zb2Mvc2lyZi9zaXJmLWF1ZGlvLmMgYi9zb3VuZC9zb2Mv c2lyZi9zaXJmLWF1ZGlvLmMKPiBkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKPiBpbmRleCBjOTIz YjY3NzJiMjIuLjAwMDAwMDAwMDAwMAo+IC0tLSBhL3NvdW5kL3NvYy9zaXJmL3NpcmYtYXVkaW8u Ywo+ICsrKyAvZGV2L251bGwKPiBAQCAtMSwxNjAgKzAsMCBAQAo+IC0vLyBTUERYLUxpY2Vuc2Ut SWRlbnRpZmllcjogR1BMLTIuMC1vci1sYXRlcgo+IC0vKgo+IC0gKiBTaVJGIGF1ZGlvIGNhcmQg ZHJpdmVyCj4gLSAqCj4gLSAqIENvcHlyaWdodCAoYykgMjAxMSBDYW1icmlkZ2UgU2lsaWNvbiBS YWRpbyBMaW1pdGVkLCBhIENTUiBwbGMgZ3JvdXAgY29tcGFueS4KPiAtICovCj4gLQo+IC0jaW5j bHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+Cj4gLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUu aD4KPiAtI2luY2x1ZGUgPGxpbnV4L29mLmg+Cj4gLSNpbmNsdWRlIDxsaW51eC9ncGlvLmg+Cj4g LSNpbmNsdWRlIDxsaW51eC9vZl9ncGlvLmg+Cj4gLSNpbmNsdWRlIDxzb3VuZC9jb3JlLmg+Cj4g LSNpbmNsdWRlIDxzb3VuZC9wY20uaD4KPiAtI2luY2x1ZGUgPHNvdW5kL3NvYy5oPgo+IC0KPiAt c3RydWN0IHNpcmZfYXVkaW9fY2FyZCB7Cj4gLSAgICAgICB1bnNpZ25lZCBpbnQgICAgICAgICAg ICBncGlvX2hwX3BhOwo+IC0gICAgICAgdW5zaWduZWQgaW50ICAgICAgICAgICAgZ3Bpb19zcGtf cGE7Cj4gLX07Cj4gLQo+IC1zdGF0aWMgaW50IHNpcmZfYXVkaW9faHBfZXZlbnQoc3RydWN0IHNu ZF9zb2NfZGFwbV93aWRnZXQgKncsCj4gLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBz dHJ1Y3Qgc25kX2tjb250cm9sICpjdHJsLCBpbnQgZXZlbnQpCj4gLXsKPiAtICAgICAgIHN0cnVj dCBzbmRfc29jX2RhcG1fY29udGV4dCAqZGFwbSA9IHctPmRhcG07Cj4gLSAgICAgICBzdHJ1Y3Qg c25kX3NvY19jYXJkICpjYXJkID0gZGFwbS0+Y2FyZDsKPiAtICAgICAgIHN0cnVjdCBzaXJmX2F1 ZGlvX2NhcmQgKnNpcmZfYXVkaW9fY2FyZCA9IHNuZF9zb2NfY2FyZF9nZXRfZHJ2ZGF0YShjYXJk KTsKPiAtICAgICAgIGludCBvbiA9ICFTTkRfU09DX0RBUE1fRVZFTlRfT0ZGKGV2ZW50KTsKPiAt Cj4gLSAgICAgICBpZiAoZ3Bpb19pc192YWxpZChzaXJmX2F1ZGlvX2NhcmQtPmdwaW9faHBfcGEp KQo+IC0gICAgICAgICAgICAgICBncGlvX3NldF92YWx1ZShzaXJmX2F1ZGlvX2NhcmQtPmdwaW9f aHBfcGEsIG9uKTsKPiAtICAgICAgIHJldHVybiAwOwo+IC19Cj4gLQo+IC1zdGF0aWMgaW50IHNp cmZfYXVkaW9fc3BrX2V2ZW50KHN0cnVjdCBzbmRfc29jX2RhcG1fd2lkZ2V0ICp3LAo+IC0gICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IHNuZF9rY29udHJvbCAqY3RybCwgaW50 IGV2ZW50KQo+IC17Cj4gLSAgICAgICBzdHJ1Y3Qgc25kX3NvY19kYXBtX2NvbnRleHQgKmRhcG0g PSB3LT5kYXBtOwo+IC0gICAgICAgc3RydWN0IHNuZF9zb2NfY2FyZCAqY2FyZCA9IGRhcG0tPmNh cmQ7Cj4gLSAgICAgICBzdHJ1Y3Qgc2lyZl9hdWRpb19jYXJkICpzaXJmX2F1ZGlvX2NhcmQgPSBz bmRfc29jX2NhcmRfZ2V0X2RydmRhdGEoY2FyZCk7Cj4gLSAgICAgICBpbnQgb24gPSAhU05EX1NP Q19EQVBNX0VWRU5UX09GRihldmVudCk7Cj4gLQo+IC0gICAgICAgaWYgKGdwaW9faXNfdmFsaWQo c2lyZl9hdWRpb19jYXJkLT5ncGlvX3Nwa19wYSkpCj4gLSAgICAgICAgICAgICAgIGdwaW9fc2V0 X3ZhbHVlKHNpcmZfYXVkaW9fY2FyZC0+Z3Bpb19zcGtfcGEsIG9uKTsKPiAtCj4gLSAgICAgICBy ZXR1cm4gMDsKPiAtfQo+IC1zdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9zb2NfZGFwbV93aWRnZXQg c2lyZl9hdWRpb19kYXBtX3dpZGdldHNbXSA9IHsKPiAtICAgICAgIFNORF9TT0NfREFQTV9IUCgi SHAiLCBzaXJmX2F1ZGlvX2hwX2V2ZW50KSwKPiAtICAgICAgIFNORF9TT0NfREFQTV9TUEsoIkV4 dCBTcGsiLCBzaXJmX2F1ZGlvX3Nwa19ldmVudCksCj4gLSAgICAgICBTTkRfU09DX0RBUE1fTUlD KCJFeHQgTWljIiwgTlVMTCksCj4gLX07Cj4gLQo+IC1zdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9z b2NfZGFwbV9yb3V0ZSBpbnRlcmNvbltdID0gewo+IC0gICAgICAgeyJIcCIsIE5VTEwsICJIUE9V VEwifSwKPiAtICAgICAgIHsiSHAiLCBOVUxMLCAiSFBPVVRSIn0sCj4gLSAgICAgICB7IkV4dCBT cGsiLCBOVUxMLCAiU1BLT1VUIn0sCj4gLSAgICAgICB7Ik1JQ0lOMSIsIE5VTEwsICJNaWMgQmlh cyJ9LAo+IC0gICAgICAgeyJNaWMgQmlhcyIsIE5VTEwsICJFeHQgTWljIn0sCj4gLX07Cj4gLQo+ IC0vKiBEaWdpdGFsIGF1ZGlvIGludGVyZmFjZSBnbHVlIC0gY29ubmVjdHMgY29kZWMgPC0tPiBD UFUgKi8KPiAtU05EX1NPQ19EQUlMSU5LX0RFRlMoc2lyZiwKPiAtICAgICAgIERBSUxJTktfQ09N UF9BUlJBWShDT01QX0VNUFRZKCkpLAo+IC0gICAgICAgREFJTElOS19DT01QX0FSUkFZKENPTVBf Q09ERUMoTlVMTCwgInNpcmYtYXVkaW8tY29kZWMiKSksCj4gLSAgICAgICBEQUlMSU5LX0NPTVBf QVJSQVkoQ09NUF9FTVBUWSgpKSk7Cj4gLQo+IC1zdGF0aWMgc3RydWN0IHNuZF9zb2NfZGFpX2xp bmsgc2lyZl9hdWRpb19kYWlfbGlua1tdID0gewo+IC0gICAgICAgewo+IC0gICAgICAgICAgICAg ICAubmFtZSA9ICJTaVJGIGF1ZGlvIGNhcmQiLAo+IC0gICAgICAgICAgICAgICAuc3RyZWFtX25h bWUgPSAiU2lSRiBhdWRpbyBIaUZpIiwKPiAtICAgICAgICAgICAgICAgU05EX1NPQ19EQUlMSU5L X1JFRyhzaXJmKSwKPiAtICAgICAgIH0sCj4gLX07Cj4gLQo+IC0vKiBBdWRpbyBtYWNoaW5lIGRy aXZlciAqLwo+IC1zdGF0aWMgc3RydWN0IHNuZF9zb2NfY2FyZCBzbmRfc29jX3NpcmZfYXVkaW9f Y2FyZCA9IHsKPiAtICAgICAgIC5uYW1lID0gIlNpUkYgYXVkaW8gY2FyZCIsCj4gLSAgICAgICAu b3duZXIgPSBUSElTX01PRFVMRSwKPiAtICAgICAgIC5kYWlfbGluayA9IHNpcmZfYXVkaW9fZGFp X2xpbmssCj4gLSAgICAgICAubnVtX2xpbmtzID0gQVJSQVlfU0laRShzaXJmX2F1ZGlvX2RhaV9s aW5rKSwKPiAtICAgICAgIC5kYXBtX3dpZGdldHMgPSBzaXJmX2F1ZGlvX2RhcG1fd2lkZ2V0cywK PiAtICAgICAgIC5udW1fZGFwbV93aWRnZXRzID0gQVJSQVlfU0laRShzaXJmX2F1ZGlvX2RhcG1f d2lkZ2V0cyksCj4gLSAgICAgICAuZGFwbV9yb3V0ZXMgPSBpbnRlcmNvbiwKPiAtICAgICAgIC5u dW1fZGFwbV9yb3V0ZXMgPSBBUlJBWV9TSVpFKGludGVyY29uKSwKPiAtfTsKPiAtCj4gLXN0YXRp YyBpbnQgc2lyZl9hdWRpb19wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQo+IC17 Cj4gLSAgICAgICBzdHJ1Y3Qgc25kX3NvY19jYXJkICpjYXJkID0gJnNuZF9zb2Nfc2lyZl9hdWRp b19jYXJkOwo+IC0gICAgICAgc3RydWN0IHNpcmZfYXVkaW9fY2FyZCAqc2lyZl9hdWRpb19jYXJk Owo+IC0gICAgICAgaW50IHJldDsKPiAtCj4gLSAgICAgICBzaXJmX2F1ZGlvX2NhcmQgPSBkZXZt X2t6YWxsb2MoJnBkZXYtPmRldiwgc2l6ZW9mKHN0cnVjdCBzaXJmX2F1ZGlvX2NhcmQpLAo+IC0g ICAgICAgICAgICAgICAgICAgICAgIEdGUF9LRVJORUwpOwo+IC0gICAgICAgaWYgKHNpcmZfYXVk aW9fY2FyZCA9PSBOVUxMKQo+IC0gICAgICAgICAgICAgICByZXR1cm4gLUVOT01FTTsKPiAtCj4g LSAgICAgICBzaXJmX2F1ZGlvX2RhaV9saW5rWzBdLmNwdXMtPm9mX25vZGUgPQo+IC0gICAgICAg ICAgICAgICBvZl9wYXJzZV9waGFuZGxlKHBkZXYtPmRldi5vZl9ub2RlLCAic2lyZixhdWRpby1w bGF0Zm9ybSIsIDApOwo+IC0gICAgICAgc2lyZl9hdWRpb19kYWlfbGlua1swXS5wbGF0Zm9ybXMt Pm9mX25vZGUgPQo+IC0gICAgICAgICAgICAgICBvZl9wYXJzZV9waGFuZGxlKHBkZXYtPmRldi5v Zl9ub2RlLCAic2lyZixhdWRpby1wbGF0Zm9ybSIsIDApOwo+IC0gICAgICAgc2lyZl9hdWRpb19k YWlfbGlua1swXS5jb2RlY3MtPm9mX25vZGUgPQo+IC0gICAgICAgICAgICAgICBvZl9wYXJzZV9w aGFuZGxlKHBkZXYtPmRldi5vZl9ub2RlLCAic2lyZixhdWRpby1jb2RlYyIsIDApOwo+IC0gICAg ICAgc2lyZl9hdWRpb19jYXJkLT5ncGlvX3Nwa19wYSA9IG9mX2dldF9uYW1lZF9ncGlvKHBkZXYt PmRldi5vZl9ub2RlLAo+IC0gICAgICAgICAgICAgICAgICAgICAgICJzcGstcGEtZ3Bpb3MiLCAw KTsKPiAtICAgICAgIHNpcmZfYXVkaW9fY2FyZC0+Z3Bpb19ocF9wYSA9ICBvZl9nZXRfbmFtZWRf Z3BpbyhwZGV2LT5kZXYub2Zfbm9kZSwKPiAtICAgICAgICAgICAgICAgICAgICAgICAiaHAtcGEt Z3Bpb3MiLCAwKTsKPiAtICAgICAgIGlmIChncGlvX2lzX3ZhbGlkKHNpcmZfYXVkaW9fY2FyZC0+ Z3Bpb19zcGtfcGEpKSB7Cj4gLSAgICAgICAgICAgICAgIHJldCA9IGRldm1fZ3Bpb19yZXF1ZXN0 X29uZSgmcGRldi0+ZGV2LAo+IC0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2lyZl9h dWRpb19jYXJkLT5ncGlvX3Nwa19wYSwKPiAtICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg IEdQSU9GX09VVF9JTklUX0xPVywgIlNQQV9QQV9TRCIpOwo+IC0gICAgICAgICAgICAgICBpZiAo cmV0KSB7Cj4gLSAgICAgICAgICAgICAgICAgICAgICAgZGV2X2VycigmcGRldi0+ZGV2LAo+IC0g ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkZhaWxlZCB0byByZXF1ZXN0IEdQSU9fJWQg Zm9yIHJlc2V0OiAlZFxuIiwKPiAtICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpcmZf YXVkaW9fY2FyZC0+Z3Bpb19zcGtfcGEsIHJldCk7Cj4gLSAgICAgICAgICAgICAgICAgICAgICAg cmV0dXJuIHJldDsKPiAtICAgICAgICAgICAgICAgfQo+IC0gICAgICAgfQo+IC0gICAgICAgaWYg KGdwaW9faXNfdmFsaWQoc2lyZl9hdWRpb19jYXJkLT5ncGlvX2hwX3BhKSkgewo+IC0gICAgICAg ICAgICAgICByZXQgPSBkZXZtX2dwaW9fcmVxdWVzdF9vbmUoJnBkZXYtPmRldiwKPiAtICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgIHNpcmZfYXVkaW9fY2FyZC0+Z3Bpb19ocF9wYSwKPiAt ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdQSU9GX09VVF9JTklUX0xPVywgIkhQX1BB X1NEIik7Cj4gLSAgICAgICAgICAgICAgIGlmIChyZXQpIHsKPiAtICAgICAgICAgICAgICAgICAg ICAgICBkZXZfZXJyKCZwZGV2LT5kZXYsCj4gLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAiRmFpbGVkIHRvIHJlcXVlc3QgR1BJT18lZCBmb3IgcmVzZXQ6ICVkXG4iLAo+IC0gICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgc2lyZl9hdWRpb19jYXJkLT5ncGlvX2hwX3BhLCByZXQp Owo+IC0gICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByZXQ7Cj4gLSAgICAgICAgICAgICAg IH0KPiAtICAgICAgIH0KPiAtCj4gLSAgICAgICBjYXJkLT5kZXYgPSAmcGRldi0+ZGV2Owo+IC0g ICAgICAgc25kX3NvY19jYXJkX3NldF9kcnZkYXRhKGNhcmQsIHNpcmZfYXVkaW9fY2FyZCk7Cj4g LQo+IC0gICAgICAgcmV0ID0gZGV2bV9zbmRfc29jX3JlZ2lzdGVyX2NhcmQoJnBkZXYtPmRldiwg Y2FyZCk7Cj4gLSAgICAgICBpZiAocmV0KQo+IC0gICAgICAgICAgICAgICBkZXZfZXJyKCZwZGV2 LT5kZXYsICJzbmRfc29jX3JlZ2lzdGVyX2NhcmQoKSBmYWlsZWQ6JWRcbiIsIHJldCk7Cj4gLQo+ IC0gICAgICAgcmV0dXJuIHJldDsKPiAtfQo+IC0KPiAtc3RhdGljIGNvbnN0IHN0cnVjdCBvZl9k ZXZpY2VfaWQgc2lyZl9hdWRpb19vZl9tYXRjaFtdID0gewo+IC0gICAgICAgey5jb21wYXRpYmxl ID0gInNpcmYsc2lyZi1hdWRpby1jYXJkIiwgfSwKPiAtICAgICAgIHsgfSwKPiAtfTsKPiAtTU9E VUxFX0RFVklDRV9UQUJMRShvZiwgc2lyZl9hdWRpb19vZl9tYXRjaCk7Cj4gLQo+IC1zdGF0aWMg c3RydWN0IHBsYXRmb3JtX2RyaXZlciBzaXJmX2F1ZGlvX2RyaXZlciA9IHsKPiAtICAgICAgIC5k cml2ZXIgPSB7Cj4gLSAgICAgICAgICAgICAgIC5uYW1lID0gInNpcmYtYXVkaW8tY2FyZCIsCj4g LSAgICAgICAgICAgICAgIC5wbSA9ICZzbmRfc29jX3BtX29wcywKPiAtICAgICAgICAgICAgICAg Lm9mX21hdGNoX3RhYmxlID0gc2lyZl9hdWRpb19vZl9tYXRjaCwKPiAtICAgICAgIH0sCj4gLSAg ICAgICAucHJvYmUgPSBzaXJmX2F1ZGlvX3Byb2JlLAo+IC19Owo+IC1tb2R1bGVfcGxhdGZvcm1f ZHJpdmVyKHNpcmZfYXVkaW9fZHJpdmVyKTsKPiAtCj4gLU1PRFVMRV9BVVRIT1IoIlJvbmdKdW4g WWluZyA8Um9uZ0p1bi5ZaW5nQGNzci5jb20+Iik7Cj4gLU1PRFVMRV9ERVNDUklQVElPTigiQUxT QSBTb0MgU0lSRiBhdWRpbyBjYXJkIGRyaXZlciIpOwo+IC1NT0RVTEVfTElDRU5TRSgiR1BMIHYy Iik7Cj4gZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9zaXJmL3NpcmYtdXNwLmMgYi9zb3VuZC9zb2Mv c2lyZi9zaXJmLXVzcC5jCj4gZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0Cj4gaW5kZXggMmFmMGM2 ZjE0ZWU2Li4wMDAwMDAwMDAwMDAKPiAtLS0gYS9zb3VuZC9zb2Mvc2lyZi9zaXJmLXVzcC5jCj4g KysrIC9kZXYvbnVsbAo+IEBAIC0xLDQzNSArMCwwIEBACj4gLS8vIFNQRFgtTGljZW5zZS1JZGVu dGlmaWVyOiBHUEwtMi4wLW9yLWxhdGVyCj4gLS8qCj4gLSAqIFNpUkYgVVNQIGluIEkyUy9EU1Ag bW9kZQo+IC0gKgo+IC0gKiBDb3B5cmlnaHQgKGMpIDIwMTEgQ2FtYnJpZGdlIFNpbGljb24gUmFk aW8gTGltaXRlZCwgYSBDU1IgcGxjIGdyb3VwIGNvbXBhbnkuCj4gLSAqLwo+IC0jaW5jbHVkZSA8 bGludXgvbW9kdWxlLmg+Cj4gLSNpbmNsdWRlIDxsaW51eC9pby5oPgo+IC0jaW5jbHVkZSA8bGlu dXgvb2YuaD4KPiAtI2luY2x1ZGUgPGxpbnV4L2Nsay5oPgo+IC0jaW5jbHVkZSA8bGludXgvcG1f cnVudGltZS5oPgo+IC0jaW5jbHVkZSA8c291bmQvc29jLmg+Cj4gLSNpbmNsdWRlIDxzb3VuZC9w Y21fcGFyYW1zLmg+Cj4gLSNpbmNsdWRlIDxzb3VuZC9kbWFlbmdpbmVfcGNtLmg+Cj4gLQo+IC0j aW5jbHVkZSAic2lyZi11c3AuaCIKPiAtCj4gLXN0cnVjdCBzaXJmX3VzcCB7Cj4gLSAgICAgICBz dHJ1Y3QgcmVnbWFwICpyZWdtYXA7Cj4gLSAgICAgICBzdHJ1Y3QgY2xrICpjbGs7Cj4gLSAgICAg ICB1MzIgbW9kZTFfcmVnOwo+IC0gICAgICAgdTMyIG1vZGUyX3JlZzsKPiAtICAgICAgIGludCBk YWlmbXRfZm9ybWF0Owo+IC0gICAgICAgc3RydWN0IHNuZF9kbWFlbmdpbmVfZGFpX2RtYV9kYXRh IHBsYXliYWNrX2RtYV9kYXRhOwo+IC0gICAgICAgc3RydWN0IHNuZF9kbWFlbmdpbmVfZGFpX2Rt YV9kYXRhIGNhcHR1cmVfZG1hX2RhdGE7Cj4gLX07Cj4gLQo+IC1zdGF0aWMgdm9pZCBzaXJmX3Vz cF90eF9lbmFibGUoc3RydWN0IHNpcmZfdXNwICp1c3ApCj4gLXsKPiAtICAgICAgIHJlZ21hcF91 cGRhdGVfYml0cyh1c3AtPnJlZ21hcCwgVVNQX1RYX0ZJRk9fT1AsCj4gLSAgICAgICAgICAgICAg IFVTUF9UWF9GSUZPX1JFU0VULCBVU1BfVFhfRklGT19SRVNFVCk7Cj4gLSAgICAgICByZWdtYXBf d3JpdGUodXNwLT5yZWdtYXAsIFVTUF9UWF9GSUZPX09QLCAwKTsKPiAtCj4gLSAgICAgICByZWdt YXBfdXBkYXRlX2JpdHModXNwLT5yZWdtYXAsIFVTUF9UWF9GSUZPX09QLAo+IC0gICAgICAgICAg ICAgICBVU1BfVFhfRklGT19TVEFSVCwgVVNQX1RYX0ZJRk9fU1RBUlQpOwo+IC0KPiAtICAgICAg IHJlZ21hcF91cGRhdGVfYml0cyh1c3AtPnJlZ21hcCwgVVNQX1RYX1JYX0VOQUJMRSwKPiAtICAg ICAgICAgICAgICAgVVNQX1RYX0VOQSwgVVNQX1RYX0VOQSk7Cj4gLX0KPiAtCj4gLXN0YXRpYyB2 b2lkIHNpcmZfdXNwX3R4X2Rpc2FibGUoc3RydWN0IHNpcmZfdXNwICp1c3ApCj4gLXsKPiAtICAg ICAgIHJlZ21hcF91cGRhdGVfYml0cyh1c3AtPnJlZ21hcCwgVVNQX1RYX1JYX0VOQUJMRSwKPiAt ICAgICAgICAgICAgICAgVVNQX1RYX0VOQSwgflVTUF9UWF9FTkEpOwo+IC0gICAgICAgLyogRklG TyBzdG9wICovCj4gLSAgICAgICByZWdtYXBfd3JpdGUodXNwLT5yZWdtYXAsIFVTUF9UWF9GSUZP X09QLCAwKTsKPiAtfQo+IC0KPiAtc3RhdGljIHZvaWQgc2lyZl91c3BfcnhfZW5hYmxlKHN0cnVj dCBzaXJmX3VzcCAqdXNwKQo+IC17Cj4gLSAgICAgICByZWdtYXBfdXBkYXRlX2JpdHModXNwLT5y ZWdtYXAsIFVTUF9SWF9GSUZPX09QLAo+IC0gICAgICAgICAgICAgICBVU1BfUlhfRklGT19SRVNF VCwgVVNQX1JYX0ZJRk9fUkVTRVQpOwo+IC0gICAgICAgcmVnbWFwX3dyaXRlKHVzcC0+cmVnbWFw LCBVU1BfUlhfRklGT19PUCwgMCk7Cj4gLQo+IC0gICAgICAgcmVnbWFwX3VwZGF0ZV9iaXRzKHVz cC0+cmVnbWFwLCBVU1BfUlhfRklGT19PUCwKPiAtICAgICAgICAgICAgICAgVVNQX1JYX0ZJRk9f U1RBUlQsIFVTUF9SWF9GSUZPX1NUQVJUKTsKPiAtCj4gLSAgICAgICByZWdtYXBfdXBkYXRlX2Jp dHModXNwLT5yZWdtYXAsIFVTUF9UWF9SWF9FTkFCTEUsCj4gLSAgICAgICAgICAgICAgIFVTUF9S WF9FTkEsIFVTUF9SWF9FTkEpOwo+IC19Cj4gLQo+IC1zdGF0aWMgdm9pZCBzaXJmX3VzcF9yeF9k aXNhYmxlKHN0cnVjdCBzaXJmX3VzcCAqdXNwKQo+IC17Cj4gLSAgICAgICByZWdtYXBfdXBkYXRl X2JpdHModXNwLT5yZWdtYXAsIFVTUF9UWF9SWF9FTkFCTEUsCj4gLSAgICAgICAgICAgICAgIFVT UF9SWF9FTkEsIH5VU1BfUlhfRU5BKTsKPiAtICAgICAgIC8qIEZJRk8gc3RvcCAqLwo+IC0gICAg ICAgcmVnbWFwX3dyaXRlKHVzcC0+cmVnbWFwLCBVU1BfUlhfRklGT19PUCwgMCk7Cj4gLX0KPiAt Cj4gLXN0YXRpYyBpbnQgc2lyZl91c3BfcGNtX2RhaV9wcm9iZShzdHJ1Y3Qgc25kX3NvY19kYWkg KmRhaSkKPiAtewo+IC0gICAgICAgc3RydWN0IHNpcmZfdXNwICp1c3AgPSBzbmRfc29jX2RhaV9n ZXRfZHJ2ZGF0YShkYWkpOwo+IC0KPiAtICAgICAgIHNuZF9zb2NfZGFpX2luaXRfZG1hX2RhdGEo ZGFpLCAmdXNwLT5wbGF5YmFja19kbWFfZGF0YSwKPiAtICAgICAgICAgICAgICAgICAgICAgICAm dXNwLT5jYXB0dXJlX2RtYV9kYXRhKTsKPiAtICAgICAgIHJldHVybiAwOwo+IC19Cj4gLQo+IC1z dGF0aWMgaW50IHNpcmZfdXNwX3BjbV9zZXRfZGFpX2ZtdChzdHJ1Y3Qgc25kX3NvY19kYWkgKmRh aSwKPiAtICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IGZtdCkKPiAtewo+IC0gICAgICAgc3Ry dWN0IHNpcmZfdXNwICp1c3AgPSBzbmRfc29jX2RhaV9nZXRfZHJ2ZGF0YShkYWkpOwo+IC0KPiAt ICAgICAgIC8qIHNldCBtYXN0ZXIvc2xhdmUgYXVkaW8gaW50ZXJmYWNlICovCj4gLSAgICAgICBz d2l0Y2ggKGZtdCAmIFNORF9TT0NfREFJRk1UX01BU1RFUl9NQVNLKSB7Cj4gLSAgICAgICBjYXNl IFNORF9TT0NfREFJRk1UX0NCTV9DRk06Cj4gLSAgICAgICAgICAgICAgIGJyZWFrOwo+IC0gICAg ICAgZGVmYXVsdDoKPiAtICAgICAgICAgICAgICAgZGV2X2VycihkYWktPmRldiwgIk9ubHkgQ0JN IGFuZCBDRk0gc3VwcG9ydGVkXG4iKTsKPiAtICAgICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7 Cj4gLSAgICAgICB9Cj4gLQo+IC0gICAgICAgc3dpdGNoIChmbXQgJiBTTkRfU09DX0RBSUZNVF9G T1JNQVRfTUFTSykgewo+IC0gICAgICAgY2FzZSBTTkRfU09DX0RBSUZNVF9JMlM6Cj4gLSAgICAg ICBjYXNlIFNORF9TT0NfREFJRk1UX0RTUF9BOgo+IC0gICAgICAgICAgICAgICB1c3AtPmRhaWZt dF9mb3JtYXQgPSAoZm10ICYgU05EX1NPQ19EQUlGTVRfRk9STUFUX01BU0spOwo+IC0gICAgICAg ICAgICAgICBicmVhazsKPiAtICAgICAgIGRlZmF1bHQ6Cj4gLSAgICAgICAgICAgICAgIGRldl9l cnIoZGFpLT5kZXYsICJPbmx5IEkyUyBhbmQgRFNQX0EgZm9ybWF0IHN1cHBvcnRlZFxuIik7Cj4g LSAgICAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOwo+IC0gICAgICAgfQo+IC0KPiAtICAgICAg IHN3aXRjaCAoZm10ICYgU05EX1NPQ19EQUlGTVRfSU5WX01BU0spIHsKPiAtICAgICAgIGNhc2Ug U05EX1NPQ19EQUlGTVRfTkJfTkY6Cj4gLSAgICAgICAgICAgICAgIGJyZWFrOwo+IC0gICAgICAg Y2FzZSBTTkRfU09DX0RBSUZNVF9JQl9ORjoKPiAtICAgICAgICAgICAgICAgdXNwLT5kYWlmbXRf Zm9ybWF0IHw9IChmbXQgJiBTTkRfU09DX0RBSUZNVF9JTlZfTUFTSyk7Cj4gLSAgICAgICAgICAg ICAgIGJyZWFrOwo+IC0gICAgICAgZGVmYXVsdDoKPiAtICAgICAgICAgICAgICAgcmV0dXJuIC1F SU5WQUw7Cj4gLSAgICAgICB9Cj4gLQo+IC0gICAgICAgcmV0dXJuIDA7Cj4gLX0KPiAtCj4gLXN0 YXRpYyB2b2lkIHNpcmZfdXNwX2kyc19pbml0KHN0cnVjdCBzaXJmX3VzcCAqdXNwKQo+IC17Cj4g LSAgICAgICAvKiBDb25maWd1cmUgUklTQyBtb2RlICovCj4gLSAgICAgICByZWdtYXBfdXBkYXRl X2JpdHModXNwLT5yZWdtYXAsIFVTUF9SSVNDX0RTUF9NT0RFLAo+IC0gICAgICAgICAgICAgICBV U1BfUklTQ19EU1BfU0VMLCB+VVNQX1JJU0NfRFNQX1NFTCk7Cj4gLQo+IC0gICAgICAgLyoKPiAt ICAgICAgICAqIENvbmZpZ3VyZSBETUEgSU8gTGVuZ3RoIHJlZ2lzdGVyCj4gLSAgICAgICAgKiBT ZXQgbm8gbGltaXQsIFVTUCBjYW4gcmVjZWl2ZSBkYXRhIGNvbnRpbnVvdXNseSB1bnRpbCBpdCBp cyBkaWFibGVkCj4gLSAgICAgICAgKi8KPiAtICAgICAgIHJlZ21hcF93cml0ZSh1c3AtPnJlZ21h cCwgVVNQX1RYX0RNQV9JT19MRU4sIDApOwo+IC0gICAgICAgcmVnbWFwX3dyaXRlKHVzcC0+cmVn bWFwLCBVU1BfUlhfRE1BX0lPX0xFTiwgMCk7Cj4gLQo+IC0gICAgICAgLyogQ29uZmlndXJlIE1v ZGUyIHJlZ2lzdGVyICovCj4gLSAgICAgICByZWdtYXBfd3JpdGUodXNwLT5yZWdtYXAsIFVTUF9N T0RFMiwgKDEgPDwgVVNQX1JYRF9ERUxBWV9MRU5fT0ZGU0VUKSB8Cj4gLSAgICAgICAgICAgICAg ICgwIDw8IFVTUF9UWERfREVMQVlfTEVOX09GRlNFVCkgfAo+IC0gICAgICAgICAgICAgICBVU1Bf VEZTX0NMS19TTEFWRV9NT0RFIHwgVVNQX1JGU19DTEtfU0xBVkVfTU9ERSk7Cj4gLQo+IC0gICAg ICAgLyogQ29uZmlndXJlIE1vZGUxIHJlZ2lzdGVyICovCj4gLSAgICAgICByZWdtYXBfd3JpdGUo dXNwLT5yZWdtYXAsIFVTUF9NT0RFMSwKPiAtICAgICAgICAgICAgICAgVVNQX1NZTkNfTU9ERSB8 IFVTUF9FTiB8IFVTUF9UWERfQUNUX0VER0VfRkFMTElORyB8Cj4gLSAgICAgICAgICAgICAgIFVT UF9SRlNfQUNUX0xFVkVMX0xPR0lDMSB8IFVTUF9URlNfQUNUX0xFVkVMX0xPR0lDMSB8Cj4gLSAg ICAgICAgICAgICAgIFVTUF9UWF9VRkxPV19SRVBFQVRfWkVSTyB8IFVTUF9DTE9DS19NT0RFX1NM QVZFKTsKPiAtCj4gLSAgICAgICAvKiBDb25maWd1cmUgUlggRE1BIElPIENvbnRyb2wgcmVnaXN0 ZXIgKi8KPiAtICAgICAgIHJlZ21hcF93cml0ZSh1c3AtPnJlZ21hcCwgVVNQX1JYX0RNQV9JT19D VFJMLCAwKTsKPiAtCj4gLSAgICAgICAvKiBDb25naXVyZSBSWCBGSUZPIENvbnRyb2wgcmVnaXN0 ZXIgKi8KPiAtICAgICAgIHJlZ21hcF93cml0ZSh1c3AtPnJlZ21hcCwgVVNQX1JYX0ZJRk9fQ1RS TCwKPiAtICAgICAgICAgICAgICAgKFVTUF9SWF9GSUZPX1RIUkVTSE9MRCA8PCBVU1BfUlhfRklG T19USERfT0ZGU0VUKSB8Cj4gLSAgICAgICAgICAgICAgIChVU1BfVFhfUlhfRklGT19XSURUSF9E V09SRCA8PCBVU1BfUlhfRklGT19XSURUSF9PRkZTRVQpKTsKPiAtCj4gLSAgICAgICAvKiBDb25n aXVyZSBSWCBGSUZPIExldmVsIENoZWNrIHJlZ2lzdGVyICovCj4gLSAgICAgICByZWdtYXBfd3Jp dGUodXNwLT5yZWdtYXAsIFVTUF9SWF9GSUZPX0xFVkVMX0NISywKPiAtICAgICAgICAgICAgICAg UlhfRklGT19TQygweDA0KSB8IFJYX0ZJRk9fTEMoMHgwRSkgfCBSWF9GSUZPX0hDKDB4MUIpKTsK PiAtCj4gLSAgICAgICAvKiBDb25maWd1cmUgVFggRE1BIElPIENvbnRyb2wgcmVnaXN0ZXIqLwo+ IC0gICAgICAgcmVnbWFwX3dyaXRlKHVzcC0+cmVnbWFwLCBVU1BfVFhfRE1BX0lPX0NUUkwsIDAp Owo+IC0KPiAtICAgICAgIC8qIENvbmZpZ3VyZSBUWCBGSUZPIENvbnRyb2wgcmVnaXN0ZXIgKi8K PiAtICAgICAgIHJlZ21hcF93cml0ZSh1c3AtPnJlZ21hcCwgVVNQX1RYX0ZJRk9fQ1RSTCwKPiAt ICAgICAgICAgICAgICAgKFVTUF9UWF9GSUZPX1RIUkVTSE9MRCA8PCBVU1BfVFhfRklGT19USERf T0ZGU0VUKSB8Cj4gLSAgICAgICAgICAgICAgIChVU1BfVFhfUlhfRklGT19XSURUSF9EV09SRCA8 PCBVU1BfVFhfRklGT19XSURUSF9PRkZTRVQpKTsKPiAtICAgICAgIC8qIENvbmdpdXJlIFRYIEZJ Rk8gTGV2ZWwgQ2hlY2sgcmVnaXN0ZXIgKi8KPiAtICAgICAgIHJlZ21hcF93cml0ZSh1c3AtPnJl Z21hcCwgVVNQX1RYX0ZJRk9fTEVWRUxfQ0hLLAo+IC0gICAgICAgICAgICAgICBUWF9GSUZPX1ND KDB4MUIpIHwgVFhfRklGT19MQygweDBFKSB8IFRYX0ZJRk9fSEMoMHgwNCkpOwo+IC19Cj4gLQo+ IC1zdGF0aWMgaW50IHNpcmZfdXNwX3BjbV9od19wYXJhbXMoc3RydWN0IHNuZF9wY21fc3Vic3Ry ZWFtICpzdWJzdHJlYW0sCj4gLSAgICAgICAgICAgICAgIHN0cnVjdCBzbmRfcGNtX2h3X3BhcmFt cyAqcGFyYW1zLCBzdHJ1Y3Qgc25kX3NvY19kYWkgKmRhaSkKPiAtewo+IC0gICAgICAgc3RydWN0 IHNpcmZfdXNwICp1c3AgPSBzbmRfc29jX2RhaV9nZXRfZHJ2ZGF0YShkYWkpOwo+IC0gICAgICAg dTMyIGRhdGFfbGVuLCBmcmFtZV9sZW4sIHNoaWZ0ZXJfbGVuOwo+IC0KPiAtICAgICAgIHN3aXRj aCAocGFyYW1zX2Zvcm1hdChwYXJhbXMpKSB7Cj4gLSAgICAgICBjYXNlIFNORFJWX1BDTV9GT1JN QVRfUzE2X0xFOgo+IC0gICAgICAgICAgICAgICBkYXRhX2xlbiA9IDE2Owo+IC0gICAgICAgICAg ICAgICBmcmFtZV9sZW4gPSAxNjsKPiAtICAgICAgICAgICAgICAgYnJlYWs7Cj4gLSAgICAgICBj YXNlIFNORFJWX1BDTV9GT1JNQVRfUzI0X0xFOgo+IC0gICAgICAgICAgICAgICBkYXRhX2xlbiA9 IDI0Owo+IC0gICAgICAgICAgICAgICBmcmFtZV9sZW4gPSAzMjsKPiAtICAgICAgICAgICAgICAg YnJlYWs7Cj4gLSAgICAgICBjYXNlIFNORFJWX1BDTV9GT1JNQVRfUzI0XzNMRToKPiAtICAgICAg ICAgICAgICAgZGF0YV9sZW4gPSAyNDsKPiAtICAgICAgICAgICAgICAgZnJhbWVfbGVuID0gMjQ7 Cj4gLSAgICAgICAgICAgICAgIGJyZWFrOwo+IC0gICAgICAgZGVmYXVsdDoKPiAtICAgICAgICAg ICAgICAgZGV2X2VycihkYWktPmRldiwgIkZvcm1hdCB1bnN1cHBvcnRlZFxuIik7Cj4gLSAgICAg ICAgICAgICAgIHJldHVybiAtRUlOVkFMOwo+IC0gICAgICAgfQo+IC0KPiAtICAgICAgIHNoaWZ0 ZXJfbGVuID0gZGF0YV9sZW47Cj4gLQo+IC0gICAgICAgc3dpdGNoICh1c3AtPmRhaWZtdF9mb3Jt YXQgJiBTTkRfU09DX0RBSUZNVF9GT1JNQVRfTUFTSykgewo+IC0gICAgICAgY2FzZSBTTkRfU09D X0RBSUZNVF9JMlM6Cj4gLSAgICAgICAgICAgICAgIHJlZ21hcF91cGRhdGVfYml0cyh1c3AtPnJl Z21hcCwgVVNQX1JYX0ZSQU1FX0NUUkwsCj4gLSAgICAgICAgICAgICAgICAgICAgICAgVVNQX0ky U19TWU5DX0NIRywgVVNQX0kyU19TWU5DX0NIRyk7Cj4gLSAgICAgICAgICAgICAgIGJyZWFrOwo+ IC0gICAgICAgY2FzZSBTTkRfU09DX0RBSUZNVF9EU1BfQToKPiAtICAgICAgICAgICAgICAgcmVn bWFwX3VwZGF0ZV9iaXRzKHVzcC0+cmVnbWFwLCBVU1BfUlhfRlJBTUVfQ1RSTCwKPiAtICAgICAg ICAgICAgICAgICAgICAgICBVU1BfSTJTX1NZTkNfQ0hHLCAwKTsKPiAtICAgICAgICAgICAgICAg ZnJhbWVfbGVuID0gZGF0YV9sZW4gKiBwYXJhbXNfY2hhbm5lbHMocGFyYW1zKTsKPiAtICAgICAg ICAgICAgICAgZGF0YV9sZW4gPSBmcmFtZV9sZW47Cj4gLSAgICAgICAgICAgICAgIGJyZWFrOwo+ IC0gICAgICAgZGVmYXVsdDoKPiAtICAgICAgICAgICAgICAgZGV2X2VycihkYWktPmRldiwgIk9u bHkgc3VwcG9ydCBJMlMgYW5kIERTUF9BIG1vZGVcbiIpOwo+IC0gICAgICAgICAgICAgICByZXR1 cm4gLUVJTlZBTDsKPiAtICAgICAgIH0KPiAtCj4gLSAgICAgICBzd2l0Y2ggKHVzcC0+ZGFpZm10 X2Zvcm1hdCAmIFNORF9TT0NfREFJRk1UX0lOVl9NQVNLKSB7Cj4gLSAgICAgICBjYXNlIFNORF9T T0NfREFJRk1UX05CX05GOgo+IC0gICAgICAgICAgICAgICBicmVhazsKPiAtICAgICAgIGNhc2Ug U05EX1NPQ19EQUlGTVRfSUJfTkY6Cj4gLSAgICAgICAgICAgICAgIHJlZ21hcF91cGRhdGVfYml0 cyh1c3AtPnJlZ21hcCwgVVNQX01PREUxLAo+IC0gICAgICAgICAgICAgICAgICAgICAgIFVTUF9S WERfQUNUX0VER0VfRkFMTElORyB8IFVTUF9UWERfQUNUX0VER0VfRkFMTElORywKPiAtICAgICAg ICAgICAgICAgICAgICAgICBVU1BfUlhEX0FDVF9FREdFX0ZBTExJTkcpOwo+IC0gICAgICAgICAg ICAgICBicmVhazsKPiAtICAgICAgIGRlZmF1bHQ6Cj4gLSAgICAgICAgICAgICAgIHJldHVybiAt RUlOVkFMOwo+IC0gICAgICAgfQo+IC0KPiAtICAgICAgIGlmIChzdWJzdHJlYW0tPnN0cmVhbSA9 PSBTTkRSVl9QQ01fU1RSRUFNX1BMQVlCQUNLKQo+IC0gICAgICAgICAgICAgICByZWdtYXBfdXBk YXRlX2JpdHModXNwLT5yZWdtYXAsIFVTUF9UWF9GUkFNRV9DVFJMLAo+IC0gICAgICAgICAgICAg ICAgICAgICAgIFVTUF9UWENfREFUQV9MRU5fTUFTSyB8IFVTUF9UWENfRlJBTUVfTEVOX01BU0sK PiAtICAgICAgICAgICAgICAgICAgICAgICB8IFVTUF9UWENfU0hJRlRFUl9MRU5fTUFTSyB8IFVT UF9UWENfU0xBVkVfQ0xLX1NBTVBMRSwKPiAtICAgICAgICAgICAgICAgICAgICAgICAoKGRhdGFf bGVuIC0gMSkgPDwgVVNQX1RYQ19EQVRBX0xFTl9PRkZTRVQpCj4gLSAgICAgICAgICAgICAgICAg ICAgICAgfCAoKGZyYW1lX2xlbiAtIDEpIDw8IFVTUF9UWENfRlJBTUVfTEVOX09GRlNFVCkKPiAt ICAgICAgICAgICAgICAgICAgICAgICB8ICgoc2hpZnRlcl9sZW4gLSAxKSA8PCBVU1BfVFhDX1NI SUZURVJfTEVOX09GRlNFVCkKPiAtICAgICAgICAgICAgICAgICAgICAgICB8IFVTUF9UWENfU0xB VkVfQ0xLX1NBTVBMRSk7Cj4gLSAgICAgICBlbHNlCj4gLSAgICAgICAgICAgICAgIHJlZ21hcF91 cGRhdGVfYml0cyh1c3AtPnJlZ21hcCwgVVNQX1JYX0ZSQU1FX0NUUkwsCj4gLSAgICAgICAgICAg ICAgICAgICAgICAgVVNQX1JYQ19EQVRBX0xFTl9NQVNLIHwgVVNQX1JYQ19GUkFNRV9MRU5fTUFT Swo+IC0gICAgICAgICAgICAgICAgICAgICAgIHwgVVNQX1JYQ19TSElGVEVSX0xFTl9NQVNLIHwg VVNQX1NJTkdMRV9TWU5DX01PREUsCj4gLSAgICAgICAgICAgICAgICAgICAgICAgKChkYXRhX2xl biAtIDEpIDw8IFVTUF9SWENfREFUQV9MRU5fT0ZGU0VUKQo+IC0gICAgICAgICAgICAgICAgICAg ICAgIHwgKChmcmFtZV9sZW4gLSAxKSA8PCBVU1BfUlhDX0ZSQU1FX0xFTl9PRkZTRVQpCj4gLSAg ICAgICAgICAgICAgICAgICAgICAgfCAoKHNoaWZ0ZXJfbGVuIC0gMSkgPDwgVVNQX1JYQ19TSElG VEVSX0xFTl9PRkZTRVQpCj4gLSAgICAgICAgICAgICAgICAgICAgICAgfCBVU1BfU0lOR0xFX1NZ TkNfTU9ERSk7Cj4gLQo+IC0gICAgICAgcmV0dXJuIDA7Cj4gLX0KPiAtCj4gLXN0YXRpYyBpbnQg c2lyZl91c3BfcGNtX3RyaWdnZXIoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0s IGludCBjbWQsCj4gLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3Qgc25kX3Nv Y19kYWkgKmRhaSkKPiAtewo+IC0gICAgICAgc3RydWN0IHNpcmZfdXNwICp1c3AgPSBzbmRfc29j X2RhaV9nZXRfZHJ2ZGF0YShkYWkpOwo+IC0KPiAtICAgICAgIHN3aXRjaCAoY21kKSB7Cj4gLSAg ICAgICBjYXNlIFNORFJWX1BDTV9UUklHR0VSX1NUQVJUOgo+IC0gICAgICAgY2FzZSBTTkRSVl9Q Q01fVFJJR0dFUl9SRVNVTUU6Cj4gLSAgICAgICBjYXNlIFNORFJWX1BDTV9UUklHR0VSX1BBVVNF X1JFTEVBU0U6Cj4gLSAgICAgICAgICAgICAgIGlmIChzdWJzdHJlYW0tPnN0cmVhbSA9PSBTTkRS Vl9QQ01fU1RSRUFNX1BMQVlCQUNLKQo+IC0gICAgICAgICAgICAgICAgICAgICAgIHNpcmZfdXNw X3R4X2VuYWJsZSh1c3ApOwo+IC0gICAgICAgICAgICAgICBlbHNlCj4gLSAgICAgICAgICAgICAg ICAgICAgICAgc2lyZl91c3BfcnhfZW5hYmxlKHVzcCk7Cj4gLSAgICAgICAgICAgICAgIGJyZWFr Owo+IC0gICAgICAgY2FzZSBTTkRSVl9QQ01fVFJJR0dFUl9TVE9QOgo+IC0gICAgICAgY2FzZSBT TkRSVl9QQ01fVFJJR0dFUl9TVVNQRU5EOgo+IC0gICAgICAgY2FzZSBTTkRSVl9QQ01fVFJJR0dF Ul9QQVVTRV9QVVNIOgo+IC0gICAgICAgICAgICAgICBpZiAoc3Vic3RyZWFtLT5zdHJlYW0gPT0g U05EUlZfUENNX1NUUkVBTV9QTEFZQkFDSykKPiAtICAgICAgICAgICAgICAgICAgICAgICBzaXJm X3VzcF90eF9kaXNhYmxlKHVzcCk7Cj4gLSAgICAgICAgICAgICAgIGVsc2UKPiAtICAgICAgICAg ICAgICAgICAgICAgICBzaXJmX3VzcF9yeF9kaXNhYmxlKHVzcCk7Cj4gLSAgICAgICAgICAgICAg IGJyZWFrOwo+IC0gICAgICAgfQo+IC0KPiAtICAgICAgIHJldHVybiAwOwo+IC19Cj4gLQo+IC1z dGF0aWMgY29uc3Qgc3RydWN0IHNuZF9zb2NfZGFpX29wcyBzaXJmX3VzcF9wY21fZGFpX29wcyA9 IHsKPiAtICAgICAgIC50cmlnZ2VyID0gc2lyZl91c3BfcGNtX3RyaWdnZXIsCj4gLSAgICAgICAu c2V0X2ZtdCA9IHNpcmZfdXNwX3BjbV9zZXRfZGFpX2ZtdCwKPiAtICAgICAgIC5od19wYXJhbXMg PSBzaXJmX3VzcF9wY21faHdfcGFyYW1zLAo+IC19Owo+IC0KPiAtc3RhdGljIHN0cnVjdCBzbmRf c29jX2RhaV9kcml2ZXIgc2lyZl91c3BfcGNtX2RhaSA9IHsKPiAtICAgICAgIC5wcm9iZSA9IHNp cmZfdXNwX3BjbV9kYWlfcHJvYmUsCj4gLSAgICAgICAubmFtZSA9ICJzaXJmLXVzcC1wY20iLAo+ IC0gICAgICAgLmlkID0gMCwKPiAtICAgICAgIC5wbGF5YmFjayA9IHsKPiAtICAgICAgICAgICAg ICAgLnN0cmVhbV9uYW1lID0gIlNpUkYgVVNQIFBDTSBQbGF5YmFjayIsCj4gLSAgICAgICAgICAg ICAgIC5jaGFubmVsc19taW4gPSAxLAo+IC0gICAgICAgICAgICAgICAuY2hhbm5lbHNfbWF4ID0g MiwKPiAtICAgICAgICAgICAgICAgLnJhdGVzID0gU05EUlZfUENNX1JBVEVfODAwMF8xOTIwMDAs Cj4gLSAgICAgICAgICAgICAgIC5mb3JtYXRzID0gU05EUlZfUENNX0ZNVEJJVF9TMTZfTEUgfCBT TkRSVl9QQ01fRk1UQklUX1MyNF9MRSB8Cj4gLSAgICAgICAgICAgICAgICAgICAgICAgU05EUlZf UENNX0ZNVEJJVF9TMjRfM0xFLAo+IC0gICAgICAgfSwKPiAtICAgICAgIC5jYXB0dXJlID0gewo+ IC0gICAgICAgICAgICAgICAuc3RyZWFtX25hbWUgPSAiU2lSRiBVU1AgUENNIENhcHR1cmUiLAo+ IC0gICAgICAgICAgICAgICAuY2hhbm5lbHNfbWluID0gMSwKPiAtICAgICAgICAgICAgICAgLmNo YW5uZWxzX21heCA9IDIsCj4gLSAgICAgICAgICAgICAgIC5yYXRlcyA9IFNORFJWX1BDTV9SQVRF XzgwMDBfMTkyMDAwLAo+IC0gICAgICAgICAgICAgICAuZm9ybWF0cyA9IFNORFJWX1BDTV9GTVRC SVRfUzE2X0xFIHwgU05EUlZfUENNX0ZNVEJJVF9TMjRfTEUgfAo+IC0gICAgICAgICAgICAgICAg ICAgICAgIFNORFJWX1BDTV9GTVRCSVRfUzI0XzNMRSwKPiAtICAgICAgIH0sCj4gLSAgICAgICAu b3BzID0gJnNpcmZfdXNwX3BjbV9kYWlfb3BzLAo+IC19Owo+IC0KPiAtc3RhdGljIGludCBzaXJm X3VzcF9wY21fcnVudGltZV9zdXNwZW5kKHN0cnVjdCBkZXZpY2UgKmRldikKPiAtewo+IC0gICAg ICAgc3RydWN0IHNpcmZfdXNwICp1c3AgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKPiAtCj4gLSAg ICAgICBjbGtfZGlzYWJsZV91bnByZXBhcmUodXNwLT5jbGspOwo+IC0gICAgICAgcmV0dXJuIDA7 Cj4gLX0KPiAtCj4gLXN0YXRpYyBpbnQgc2lyZl91c3BfcGNtX3J1bnRpbWVfcmVzdW1lKHN0cnVj dCBkZXZpY2UgKmRldikKPiAtewo+IC0gICAgICAgc3RydWN0IHNpcmZfdXNwICp1c3AgPSBkZXZf Z2V0X2RydmRhdGEoZGV2KTsKPiAtICAgICAgIGludCByZXQ7Cj4gLQo+IC0gICAgICAgcmV0ID0g Y2xrX3ByZXBhcmVfZW5hYmxlKHVzcC0+Y2xrKTsKPiAtICAgICAgIGlmIChyZXQpIHsKPiAtICAg ICAgICAgICAgICAgZGV2X2VycihkZXYsICJjbGtfZW5hYmxlIGZhaWxlZDogJWRcbiIsIHJldCk7 Cj4gLSAgICAgICAgICAgICAgIHJldHVybiByZXQ7Cj4gLSAgICAgICB9Cj4gLSAgICAgICBzaXJm X3VzcF9pMnNfaW5pdCh1c3ApOwo+IC0gICAgICAgcmV0dXJuIDA7Cj4gLX0KPiAtCj4gLSNpZmRl ZiBDT05GSUdfUE1fU0xFRVAKPiAtc3RhdGljIGludCBzaXJmX3VzcF9wY21fc3VzcGVuZChzdHJ1 Y3QgZGV2aWNlICpkZXYpCj4gLXsKPiAtICAgICAgIHN0cnVjdCBzaXJmX3VzcCAqdXNwID0gZGV2 X2dldF9kcnZkYXRhKGRldik7Cj4gLQo+IC0gICAgICAgaWYgKCFwbV9ydW50aW1lX3N0YXR1c19z dXNwZW5kZWQoZGV2KSkgewo+IC0gICAgICAgICAgICAgICByZWdtYXBfcmVhZCh1c3AtPnJlZ21h cCwgVVNQX01PREUxLCAmdXNwLT5tb2RlMV9yZWcpOwo+IC0gICAgICAgICAgICAgICByZWdtYXBf cmVhZCh1c3AtPnJlZ21hcCwgVVNQX01PREUyLCAmdXNwLT5tb2RlMl9yZWcpOwo+IC0gICAgICAg ICAgICAgICBzaXJmX3VzcF9wY21fcnVudGltZV9zdXNwZW5kKGRldik7Cj4gLSAgICAgICB9Cj4g LSAgICAgICByZXR1cm4gMDsKPiAtfQo+IC0KPiAtc3RhdGljIGludCBzaXJmX3VzcF9wY21fcmVz dW1lKHN0cnVjdCBkZXZpY2UgKmRldikKPiAtewo+IC0gICAgICAgc3RydWN0IHNpcmZfdXNwICp1 c3AgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKPiAtICAgICAgIGludCByZXQ7Cj4gLQo+IC0gICAg ICAgaWYgKCFwbV9ydW50aW1lX3N0YXR1c19zdXNwZW5kZWQoZGV2KSkgewo+IC0gICAgICAgICAg ICAgICByZXQgPSBzaXJmX3VzcF9wY21fcnVudGltZV9yZXN1bWUoZGV2KTsKPiAtICAgICAgICAg ICAgICAgaWYgKHJldCkKPiAtICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmV0Owo+IC0g ICAgICAgICAgICAgICByZWdtYXBfd3JpdGUodXNwLT5yZWdtYXAsIFVTUF9NT0RFMSwgdXNwLT5t b2RlMV9yZWcpOwo+IC0gICAgICAgICAgICAgICByZWdtYXBfd3JpdGUodXNwLT5yZWdtYXAsIFVT UF9NT0RFMiwgdXNwLT5tb2RlMl9yZWcpOwo+IC0gICAgICAgfQo+IC0gICAgICAgcmV0dXJuIDA7 Cj4gLX0KPiAtI2VuZGlmCj4gLQo+IC1zdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9zb2NfY29tcG9u ZW50X2RyaXZlciBzaXJmX3VzcF9jb21wb25lbnQgPSB7Cj4gLSAgICAgICAubmFtZSAgICAgICAg ICAgPSAic2lyZi11c3AiLAo+IC19Owo+IC0KPiAtc3RhdGljIGNvbnN0IHN0cnVjdCByZWdtYXBf Y29uZmlnIHNpcmZfdXNwX3JlZ21hcF9jb25maWcgPSB7Cj4gLSAgICAgICAucmVnX2JpdHMgPSAz MiwKPiAtICAgICAgIC5yZWdfc3RyaWRlID0gNCwKPiAtICAgICAgIC52YWxfYml0cyA9IDMyLAo+ IC0gICAgICAgLm1heF9yZWdpc3RlciA9IFVTUF9SWF9GSUZPX0RBVEEsCj4gLSAgICAgICAuY2Fj aGVfdHlwZSA9IFJFR0NBQ0hFX05PTkUsCj4gLX07Cj4gLQo+IC1zdGF0aWMgaW50IHNpcmZfdXNw X3BjbV9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQo+IC17Cj4gLSAgICAgICBp bnQgcmV0Owo+IC0gICAgICAgc3RydWN0IHNpcmZfdXNwICp1c3A7Cj4gLSAgICAgICB2b2lkIF9f aW9tZW0gKmJhc2U7Cj4gLQo+IC0gICAgICAgdXNwID0gZGV2bV9remFsbG9jKCZwZGV2LT5kZXYs IHNpemVvZihzdHJ1Y3Qgc2lyZl91c3ApLAo+IC0gICAgICAgICAgICAgICAgICAgICAgIEdGUF9L RVJORUwpOwo+IC0gICAgICAgaWYgKCF1c3ApCj4gLSAgICAgICAgICAgICAgIHJldHVybiAtRU5P TUVNOwo+IC0KPiAtICAgICAgIHBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIHVzcCk7Cj4gLQo+ IC0gICAgICAgYmFzZSA9IGRldm1fcGxhdGZvcm1faW9yZW1hcF9yZXNvdXJjZShwZGV2LCAwKTsK PiAtICAgICAgIGlmIChJU19FUlIoYmFzZSkpCj4gLSAgICAgICAgICAgICAgIHJldHVybiBQVFJf RVJSKGJhc2UpOwo+IC0gICAgICAgdXNwLT5yZWdtYXAgPSBkZXZtX3JlZ21hcF9pbml0X21taW8o JnBkZXYtPmRldiwgYmFzZSwKPiAtICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICZzaXJmX3VzcF9yZWdtYXBfY29uZmlnKTsKPiAtICAgICAgIGlmIChJU19FUlIodXNw LT5yZWdtYXApKQo+IC0gICAgICAgICAgICAgICByZXR1cm4gUFRSX0VSUih1c3AtPnJlZ21hcCk7 Cj4gLQo+IC0gICAgICAgdXNwLT5jbGsgPSBkZXZtX2Nsa19nZXQoJnBkZXYtPmRldiwgTlVMTCk7 Cj4gLSAgICAgICBpZiAoSVNfRVJSKHVzcC0+Y2xrKSkgewo+IC0gICAgICAgICAgICAgICBkZXZf ZXJyKCZwZGV2LT5kZXYsICJHZXQgY2xvY2sgZmFpbGVkLlxuIik7Cj4gLSAgICAgICAgICAgICAg IHJldHVybiBQVFJfRVJSKHVzcC0+Y2xrKTsKPiAtICAgICAgIH0KPiAtCj4gLSAgICAgICBwbV9y dW50aW1lX2VuYWJsZSgmcGRldi0+ZGV2KTsKPiAtICAgICAgIGlmICghcG1fcnVudGltZV9lbmFi bGVkKCZwZGV2LT5kZXYpKSB7Cj4gLSAgICAgICAgICAgICAgIHJldCA9IHNpcmZfdXNwX3BjbV9y dW50aW1lX3Jlc3VtZSgmcGRldi0+ZGV2KTsKPiAtICAgICAgICAgICAgICAgaWYgKHJldCkKPiAt ICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmV0Owo+IC0gICAgICAgfQo+IC0KPiAtICAg ICAgIHJldCA9IGRldm1fc25kX3NvY19yZWdpc3Rlcl9jb21wb25lbnQoJnBkZXYtPmRldiwgJnNp cmZfdXNwX2NvbXBvbmVudCwKPiAtICAgICAgICAgICAgICAgJnNpcmZfdXNwX3BjbV9kYWksIDEp Owo+IC0gICAgICAgaWYgKHJldCkgewo+IC0gICAgICAgICAgICAgICBkZXZfZXJyKCZwZGV2LT5k ZXYsICJSZWdpc3RlciBBdWRpbyBTb0MgZGFpIGZhaWxlZC5cbiIpOwo+IC0gICAgICAgICAgICAg ICByZXR1cm4gcmV0Owo+IC0gICAgICAgfQo+IC0gICAgICAgcmV0dXJuIGRldm1fc25kX2RtYWVu Z2luZV9wY21fcmVnaXN0ZXIoJnBkZXYtPmRldiwgTlVMTCwgMCk7Cj4gLX0KPiAtCj4gLXN0YXRp YyBpbnQgc2lyZl91c3BfcGNtX3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQo+ IC17Cj4gLSAgICAgICBpZiAoIXBtX3J1bnRpbWVfZW5hYmxlZCgmcGRldi0+ZGV2KSkKPiAtICAg ICAgICAgICAgICAgc2lyZl91c3BfcGNtX3J1bnRpbWVfc3VzcGVuZCgmcGRldi0+ZGV2KTsKPiAt ICAgICAgIGVsc2UKPiAtICAgICAgICAgICAgICAgcG1fcnVudGltZV9kaXNhYmxlKCZwZGV2LT5k ZXYpOwo+IC0gICAgICAgcmV0dXJuIDA7Cj4gLX0KPiAtCj4gLXN0YXRpYyBjb25zdCBzdHJ1Y3Qg b2ZfZGV2aWNlX2lkIHNpcmZfdXNwX3BjbV9vZl9tYXRjaFtdID0gewo+IC0gICAgICAgeyAuY29t cGF0aWJsZSA9ICJzaXJmLHByaW1hMi11c3AtcGNtIiwgfSwKPiAtICAgICAgIHt9Cj4gLX07Cj4g LU1PRFVMRV9ERVZJQ0VfVEFCTEUob2YsIHNpcmZfdXNwX3BjbV9vZl9tYXRjaCk7Cj4gLQo+IC1z dGF0aWMgY29uc3Qgc3RydWN0IGRldl9wbV9vcHMgc2lyZl91c3BfcGNtX3BtX29wcyA9IHsKPiAt ICAgICAgIFNFVF9SVU5USU1FX1BNX09QUyhzaXJmX3VzcF9wY21fcnVudGltZV9zdXNwZW5kLAo+ IC0gICAgICAgICAgICAgICBzaXJmX3VzcF9wY21fcnVudGltZV9yZXN1bWUsIE5VTEwpCj4gLSAg ICAgICBTRVRfU1lTVEVNX1NMRUVQX1BNX09QUyhzaXJmX3VzcF9wY21fc3VzcGVuZCwgc2lyZl91 c3BfcGNtX3Jlc3VtZSkKPiAtfTsKPiAtCj4gLXN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVy IHNpcmZfdXNwX3BjbV9kcml2ZXIgPSB7Cj4gLSAgICAgICAuZHJpdmVyID0gewo+IC0gICAgICAg ICAgICAgICAubmFtZSA9ICJzaXJmLXVzcC1wY20iLAo+IC0gICAgICAgICAgICAgICAub2ZfbWF0 Y2hfdGFibGUgPSBzaXJmX3VzcF9wY21fb2ZfbWF0Y2gsCj4gLSAgICAgICAgICAgICAgIC5wbSA9 ICZzaXJmX3VzcF9wY21fcG1fb3BzLAo+IC0gICAgICAgfSwKPiAtICAgICAgIC5wcm9iZSA9IHNp cmZfdXNwX3BjbV9wcm9iZSwKPiAtICAgICAgIC5yZW1vdmUgPSBzaXJmX3VzcF9wY21fcmVtb3Zl LAo+IC19Owo+IC0KPiAtbW9kdWxlX3BsYXRmb3JtX2RyaXZlcihzaXJmX3VzcF9wY21fZHJpdmVy KTsKPiAtCj4gLU1PRFVMRV9ERVNDUklQVElPTigiU2lSRiBTb0MgVVNQIFBDTSBidXMgZHJpdmVy Iik7Cj4gLU1PRFVMRV9BVVRIT1IoIlJvbmdKdW4gWWluZyA8Um9uZ2p1bi5ZaW5nQGNzci5jb20+ Iik7Cj4gLU1PRFVMRV9MSUNFTlNFKCJHUEwgdjIiKTsKPiBkaWZmIC0tZ2l0IGEvc291bmQvc29j L3NpcmYvc2lyZi11c3AuaCBiL3NvdW5kL3NvYy9zaXJmL3NpcmYtdXNwLmgKPiBkZWxldGVkIGZp bGUgbW9kZSAxMDA2NDQKPiBpbmRleCAwODk5M2I1OTkyYzQuLjAwMDAwMDAwMDAwMAo+IC0tLSBh L3NvdW5kL3NvYy9zaXJmL3NpcmYtdXNwLmgKPiArKysgL2Rldi9udWxsCj4gQEAgLTEsMjkyICsw LDAgQEAKPiAtLyogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjAtb3ItbGF0ZXIgKi8K PiAtLyoKPiAtICogYXJjaC9hcm0vbWFjaC1wcmltYTIvaW5jbHVkZS9tYWNoL3NpcmZzb2NfdXNw LmgKPiAtICoKPiAtICogQ29weXJpZ2h0IChjKSAyMDExIENhbWJyaWRnZSBTaWxpY29uIFJhZGlv IExpbWl0ZWQsIGEgQ1NSIHBsYyBncm91cCBjb21wYW55Lgo+IC0gKi8KPiAtCj4gLSNpZm5kZWYg X1NJUkZfVVNQX0gKPiAtI2RlZmluZSBfU0lSRl9VU1BfSAo+IC0KPiAtLyogVVNQIFJlZ2lzdGVy cyAqLwo+IC0jZGVmaW5lIFVTUF9NT0RFMSAgICAgICAgICAgICAgMHgwMAo+IC0jZGVmaW5lIFVT UF9NT0RFMiAgICAgICAgICAgICAgMHgwNAo+IC0jZGVmaW5lIFVTUF9UWF9GUkFNRV9DVFJMICAg ICAgMHgwOAo+IC0jZGVmaW5lIFVTUF9SWF9GUkFNRV9DVFJMICAgICAgMHgwQwo+IC0jZGVmaW5l IFVTUF9UWF9SWF9FTkFCTEUgICAgICAgMHgxMAo+IC0jZGVmaW5lIFVTUF9JTlRfRU5BQkxFICAg ICAgICAgMHgxNAo+IC0jZGVmaW5lIFVTUF9JTlRfU1RBVFVTICAgICAgICAgMHgxOAo+IC0jZGVm aW5lIFVTUF9QSU5fSU9fREFUQSAgICAgICAgICAgICAgICAweDFDCj4gLSNkZWZpbmUgVVNQX1JJ U0NfRFNQX01PREUgICAgICAweDIwCj4gLSNkZWZpbmUgVVNQX0FZU05DX1BBUkFNX1JFRyAgICAw eDI0Cj4gLSNkZWZpbmUgVVNQX0lSREFfWF9NT0RFX0RJViAgICAweDI4Cj4gLSNkZWZpbmUgVVNQ X1NNX0NGRyAgICAgICAgICAgICAweDJDCj4gLSNkZWZpbmUgVVNQX1RYX0RNQV9JT19DVFJMICAg ICAweDEwMAo+IC0jZGVmaW5lIFVTUF9UWF9ETUFfSU9fTEVOICAgICAgMHgxMDQKPiAtI2RlZmlu ZSBVU1BfVFhfRklGT19DVFJMICAgICAgIDB4MTA4Cj4gLSNkZWZpbmUgVVNQX1RYX0ZJRk9fTEVW RUxfQ0hLICAweDEwQwo+IC0jZGVmaW5lIFVTUF9UWF9GSUZPX09QICAgICAgICAgMHgxMTAKPiAt I2RlZmluZSBVU1BfVFhfRklGT19TVEFUVVMgICAgIDB4MTE0Cj4gLSNkZWZpbmUgVVNQX1RYX0ZJ Rk9fREFUQSAgICAgICAweDExOAo+IC0jZGVmaW5lIFVTUF9SWF9ETUFfSU9fQ1RSTCAgICAgMHgx MjAKPiAtI2RlZmluZSBVU1BfUlhfRE1BX0lPX0xFTiAgICAgIDB4MTI0Cj4gLSNkZWZpbmUgVVNQ X1JYX0ZJRk9fQ1RSTCAgICAgICAweDEyOAo+IC0jZGVmaW5lIFVTUF9SWF9GSUZPX0xFVkVMX0NI SyAgMHgxMkMKPiAtI2RlZmluZSBVU1BfUlhfRklGT19PUCAgICAgICAgIDB4MTMwCj4gLSNkZWZp bmUgVVNQX1JYX0ZJRk9fU1RBVFVTICAgICAweDEzNAo+IC0jZGVmaW5lIFVTUF9SWF9GSUZPX0RB VEEgICAgICAgMHgxMzgKPiAtCj4gLS8qIFVTUCBNT0RFIHJlZ2lzdGVyLTEgKi8KPiAtI2RlZmlu ZSBVU1BfU1lOQ19NT0RFICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMQo+IC0jZGVmaW5lIFVT UF9DTE9DS19NT0RFX1NMQVZFICAgICAgICAgICAweDAwMDAwMDAyCj4gLSNkZWZpbmUgVVNQX0xP T1BfQkFDS19FTiAgICAgICAgICAgICAgIDB4MDAwMDAwMDQKPiAtI2RlZmluZSBVU1BfSFBTSVJf RU4gICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwOAo+IC0jZGVmaW5lIFVTUF9FTkRJQU5fQ1RS TF9MU0JGICAgICAgICAgICAweDAwMDAwMDEwCj4gLSNkZWZpbmUgVVNQX0VOICAgICAgICAgICAg ICAgICAgICAgICAgIDB4MDAwMDAwMjAKPiAtI2RlZmluZSBVU1BfUlhEX0FDVF9FREdFX0ZBTExJ TkcgICAgICAgMHgwMDAwMDA0MAo+IC0jZGVmaW5lIFVTUF9UWERfQUNUX0VER0VfRkFMTElORyAg ICAgICAweDAwMDAwMDgwCj4gLSNkZWZpbmUgVVNQX1JGU19BQ1RfTEVWRUxfTE9HSUMxICAgICAg IDB4MDAwMDAxMDAKPiAtI2RlZmluZSBVU1BfVEZTX0FDVF9MRVZFTF9MT0dJQzEgICAgICAgMHgw MDAwMDIwMAo+IC0jZGVmaW5lIFVTUF9TQ0xLX0lETEVfTU9ERV9UT0dHTEUgICAgICAweDAwMDAw NDAwCj4gLSNkZWZpbmUgVVNQX1NDTEtfSURMRV9MRVZFTF9MT0dJQzEgICAgIDB4MDAwMDA4MDAK PiAtI2RlZmluZSBVU1BfU0NMS19QSU5fTU9ERV9JTyAgIDB4MDAwMDEwMDAKPiAtI2RlZmluZSBV U1BfUkZTX1BJTl9NT0RFX0lPICAgIDB4MDAwMDIwMDAKPiAtI2RlZmluZSBVU1BfVEZTX1BJTl9N T0RFX0lPICAgIDB4MDAwMDQwMDAKPiAtI2RlZmluZSBVU1BfUlhEX1BJTl9NT0RFX0lPICAgIDB4 MDAwMDgwMDAKPiAtI2RlZmluZSBVU1BfVFhEX1BJTl9NT0RFX0lPICAgIDB4MDAwMTAwMDAKPiAt I2RlZmluZSBVU1BfU0NMS19JT19NT0RFX0lOUFVUIDB4MDAwMjAwMDAKPiAtI2RlZmluZSBVU1Bf UkZTX0lPX01PREVfSU5QVVQgIDB4MDAwNDAwMDAKPiAtI2RlZmluZSBVU1BfVEZTX0lPX01PREVf SU5QVVQgIDB4MDAwODAwMDAKPiAtI2RlZmluZSBVU1BfUlhEX0lPX01PREVfSU5QVVQgIDB4MDAx MDAwMDAKPiAtI2RlZmluZSBVU1BfVFhEX0lPX01PREVfSU5QVVQgIDB4MDAyMDAwMDAKPiAtI2Rl ZmluZSBVU1BfSVJEQV9XSURUSF9ESVZfTUFTSyAgICAgICAgMHgzRkMwMDAwMAo+IC0jZGVmaW5l IFVTUF9JUkRBX1dJRFRIX0RJVl9PRkZTRVQgICAgICAwCj4gLSNkZWZpbmUgVVNQX0lSREFfSURM RV9MRVZFTF9ISUdIICAgICAgIDB4NDAwMDAwMDAKPiAtI2RlZmluZSBVU1BfVFhfVUZMT1dfUkVQ RUFUX1pFUk8gICAgICAgMHg4MDAwMDAwMAo+IC0jZGVmaW5lIFVTUF9UWF9FTkRJQU5fTU9ERSAg ICAgICAgICAgICAweDAwMDAwMDIwCj4gLSNkZWZpbmUgVVNQX1JYX0VORElBTl9NT0RFICAgICAg ICAgICAgIDB4MDAwMDAwMjAKPiAtCj4gLS8qIFVTUCBNb2RlIFJlZ2lzdGVyLTIgKi8KPiAtI2Rl ZmluZSBVU1BfUlhEX0RFTEFZX0xFTl9NQVNLICAgICAgICAgMHgwMDAwMDBGRgo+IC0jZGVmaW5l IFVTUF9SWERfREVMQVlfTEVOX09GRlNFVCAgICAgICAwCj4gLQo+IC0jZGVmaW5lIFVTUF9UWERf REVMQVlfTEVOX01BU0sgICAgICAgICAweDAwMDBGRjAwCj4gLSNkZWZpbmUgVVNQX1RYRF9ERUxB WV9MRU5fT0ZGU0VUICAgICAgIDgKPiAtCj4gLSNkZWZpbmUgVVNQX0VOQV9DVFJMX01PREUgICAg ICAgICAgICAgIDB4MDAwMTAwMDAKPiAtI2RlZmluZSBVU1BfRlJBTUVfQ1RSTF9NT0RFICAgICAg ICAgICAgMHgwMDAyMDAwMAo+IC0jZGVmaW5lIFVTUF9URlNfU09VUkNFX01PREUgICAgICAgICAg ICAgMHgwMDA0MDAwMAo+IC0jZGVmaW5lIFVTUF9URlNfTVNfTU9ERSAgICAgICAgICAgICAgICAg MHgwMDA4MDAwMAo+IC0jZGVmaW5lIFVTUF9DTEtfRElWSVNPUl9NQVNLICAgICAgICAgICAweDdG RTAwMDAwCj4gLSNkZWZpbmUgVVNQX0NMS19ESVZJU09SX09GRlNFVCAgICAgICAgIDIxCj4gLQo+ IC0jZGVmaW5lIFVTUF9URlNfQ0xLX1NMQVZFX01PREUgICAgICAgICAoMTw8MjApCj4gLSNkZWZp bmUgVVNQX1JGU19DTEtfU0xBVkVfTU9ERSAgICAgICAgICgxPDwxOSkKPiAtCj4gLSNkZWZpbmUg VVNQX0lSREFfREFUQV9XSURUSCAgICAgICAgICAgIDB4ODAwMDAwMDAKPiAtCj4gLS8qIFVTUCBU cmFuc21pdCBGcmFtZSBDb250cm9sIFJlZ2lzdGVyICovCj4gLQo+IC0jZGVmaW5lIFVTUF9UWENf REFUQV9MRU5fTUFTSyAgICAgICAgICAweDAwMDAwMEZGCj4gLSNkZWZpbmUgVVNQX1RYQ19EQVRB X0xFTl9PRkZTRVQgICAgICAgICAgICAgICAgMAo+IC0KPiAtI2RlZmluZSBVU1BfVFhDX1NZTkNf TEVOX01BU0sgICAgICAgICAgMHgwMDAwRkYwMAo+IC0jZGVmaW5lIFVTUF9UWENfU1lOQ19MRU5f T0ZGU0VUICAgICAgICAgICAgICAgIDgKPiAtCj4gLSNkZWZpbmUgVVNQX1RYQ19GUkFNRV9MRU5f TUFTSyAgICAgICAgIDB4MDBGRjAwMDAKPiAtI2RlZmluZSBVU1BfVFhDX0ZSQU1FX0xFTl9PRkZT RVQgICAgICAgMTYKPiAtCj4gLSNkZWZpbmUgVVNQX1RYQ19TSElGVEVSX0xFTl9NQVNLICAgICAg IDB4MUYwMDAwMDAKPiAtI2RlZmluZSBVU1BfVFhDX1NISUZURVJfTEVOX09GRlNFVCAgICAgMjQK PiAtCj4gLSNkZWZpbmUgVVNQX1RYQ19TTEFWRV9DTEtfU0FNUExFICAgICAgIDB4MjAwMDAwMDAK PiAtCj4gLSNkZWZpbmUgVVNQX1RYQ19DTEtfRElWSVNPUl9NQVNLICAgICAgIDB4QzAwMDAwMDAK PiAtI2RlZmluZSBVU1BfVFhDX0NMS19ESVZJU09SX09GRlNFVCAgICAgMzAKPiAtCj4gLS8qIFVT UCBSZWNlaXZlIEZyYW1lIENvbnRyb2wgUmVnaXN0ZXIgKi8KPiAtCj4gLSNkZWZpbmUgVVNQX1JY Q19EQVRBX0xFTl9NQVNLICAgICAgICAgIDB4MDAwMDAwRkYKPiAtI2RlZmluZSBVU1BfUlhDX0RB VEFfTEVOX09GRlNFVCAgICAgICAgICAgICAgICAwCj4gLQo+IC0jZGVmaW5lIFVTUF9SWENfRlJB TUVfTEVOX01BU0sgICAgICAgICAweDAwMDBGRjAwCj4gLSNkZWZpbmUgVVNQX1JYQ19GUkFNRV9M RU5fT0ZGU0VUICAgICAgIDgKPiAtCj4gLSNkZWZpbmUgVVNQX1JYQ19TSElGVEVSX0xFTl9NQVNL ICAgICAgIDB4MDAxRjAwMDAKPiAtI2RlZmluZSBVU1BfUlhDX1NISUZURVJfTEVOX09GRlNFVCAg ICAgMTYKPiAtCj4gLSNkZWZpbmUgVVNQX1NUQVJUX0VER0VfTU9ERSAgICAweDAwODAwMDAwCj4g LSNkZWZpbmUgVVNQX0kyU19TWU5DX0NIRyAgICAgICAweDAwMjAwMDAwCj4gLQo+IC0jZGVmaW5l IFVTUF9SWENfQ0xLX0RJVklTT1JfTUFTSyAgICAgICAweDBGMDAwMDAwCj4gLSNkZWZpbmUgVVNQ X1JYQ19DTEtfRElWSVNPUl9PRkZTRVQgICAgIDI0Cj4gLSNkZWZpbmUgVVNQX1NJTkdMRV9TWU5D X01PREUgICAgICAgICAgIDB4MDA0MDAwMDAKPiAtCj4gLS8qIFR4IC0gUlggRW5hYmxlIFJlZ2lz dGVyICovCj4gLQo+IC0jZGVmaW5lIFVTUF9SWF9FTkEgICAgICAgICAgICAgMHgwMDAwMDAwMQo+ IC0jZGVmaW5lIFVTUF9UWF9FTkEgICAgICAgICAgICAgMHgwMDAwMDAwMgo+IC0KPiAtLyogVVNQ IEludGVycnVwdCBFbmFibGUgYW5kIHN0YXR1cyBSZWdpc3RlciAqLwo+IC0jZGVmaW5lIFVTUF9S WF9ET05FX0lOVCAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDEKPiAtI2RlZmluZSBV U1BfVFhfRE9ORV9JTlQgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAyCj4gLSNkZWZp bmUgVVNQX1JYX09GTE9XX0lOVCAgICAgICAgICAgICAgIDB4MDAwMDAwMDQKPiAtI2RlZmluZSBV U1BfVFhfVUZMT1dfSU5UICAgICAgICAgICAgICAgMHgwMDAwMDAwOAo+IC0jZGVmaW5lIFVTUF9S WF9JT19ETUFfSU5UICAgICAgICAgICAgICAweDAwMDAwMDEwCj4gLSNkZWZpbmUgVVNQX1RYX0lP X0RNQV9JTlQgICAgICAgICAgICAgIDB4MDAwMDAwMjAKPiAtI2RlZmluZSBVU1BfUlhGSUZPX0ZV TExfSU5UICAgICAgICAgICAgMHgwMDAwMDA0MAo+IC0jZGVmaW5lIFVTUF9UWEZJRk9fRU1QVFlf SU5UICAgICAgICAgICAweDAwMDAwMDgwCj4gLSNkZWZpbmUgVVNQX1JYRklGT19USERfSU5UICAg ICAgICAgICAgIDB4MDAwMDAxMDAKPiAtI2RlZmluZSBVU1BfVFhGSUZPX1RIRF9JTlQgICAgICAg ICAgICAgMHgwMDAwMDIwMAo+IC0jZGVmaW5lIFVTUF9VQVJUX0ZSTV9FUlJfSU5UICAgICAgICAg ICAweDAwMDAwNDAwCj4gLSNkZWZpbmUgVVNQX1JYX1RJTUVPVVRfSU5UICAgICAgICAgICAgIDB4 MDAwMDA4MDAKPiAtI2RlZmluZSBVU1BfVFhfQUxMT1VUX0lOVCAgICAgICAgICAgICAgMHgwMDAw MTAwMAo+IC0jZGVmaW5lIFVTUF9SWERfQlJFQUtfSU5UICAgICAgICAgICAgICAweDAwMDA4MDAw Cj4gLQo+IC0vKiBBbGwgcG9zc2libGUgVFggaW50ZXJydW90cyAqLwo+IC0jZGVmaW5lIFVTUF9U WF9JTlRFUlJVUFQgICAgICAgICAgICAgICAoVVNQX1RYX0RPTkVfSU5UfFVTUF9UWF9VRkxPV19J TlR8XAo+IC0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVU1BfVFhfSU9f RE1BX0lOVHxcCj4gLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVTUF9U WEZJRk9fRU1QVFlfSU5UfFwKPiAtICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgVVNQX1RYRklGT19USERfSU5UKQo+IC0vKiBBbGwgcG9zc2libGUgUlggaW50ZXJydW90cyAq Lwo+IC0jZGVmaW5lIFVTUF9SWF9JTlRFUlJVUFQgICAgICAgICAgICAgICAoVVNQX1JYX0RPTkVf SU5UfFVTUF9SWF9PRkxPV19JTlR8XAo+IC0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICBVU1BfUlhfSU9fRE1BX0lOVHxcCj4gLSAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgIFVTUF9SWEZJRk9fRlVMTF9JTlR8XAo+IC0gICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICBVU1BfUlhGSUZPX1RIRF9JTlR8XAo+IC0gICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICBVU1BfUlhfVElNRU9VVF9JTlQpCj4gLQo+IC0jZGVm aW5lIFVTUF9JTlRfQUxMICAgICAgICAweDFGRkYKPiAtCj4gLS8qIFVTUCBQaW4gSS9PIERhdGEg UmVnaXN0ZXIgKi8KPiAtCj4gLSNkZWZpbmUgVVNQX1JGU19QSU5fVkFMVUVfTUFTSyAweDAwMDAw MDAxCj4gLSNkZWZpbmUgVVNQX1RGU19QSU5fVkFMVUVfTUFTSyAweDAwMDAwMDAyCj4gLSNkZWZp bmUgVVNQX1JYRF9QSU5fVkFMVUVfTUFTSyAweDAwMDAwMDA0Cj4gLSNkZWZpbmUgVVNQX1RYRF9Q SU5fVkFMVUVfTUFTSyAweDAwMDAwMDA4Cj4gLSNkZWZpbmUgVVNQX1NDTEtfUElOX1ZBTFVFX01B U0sgICAgICAgIDB4MDAwMDAwMTAKPiAtCj4gLS8qIFVTUCBSSVNDL0RTUCBNb2RlIFJlZ2lzdGVy ICovCj4gLSNkZWZpbmUgVVNQX1JJU0NfRFNQX1NFTCAgICAgICAweDAwMDAwMDAxCj4gLQo+IC0v KiBVU1AgQVNZTkMgUEFSQU1FVEVSIFJlZ2lzdGVyKi8KPiAtCj4gLSNkZWZpbmUgVVNQX0FTWU5D X1RJTUVPVVRfTUFTSyAweDAwMDBGRkZGCj4gLSNkZWZpbmUgVVNQX0FTWU5DX1RJTUVPVVRfT0ZG U0VUICAgICAgIDAKPiAtI2RlZmluZSBVU1BfQVNZTkNfVElNRU9VVCh4KSAgICgoKHgpJlVTUF9B U1lOQ19USU1FT1VUX01BU0spIFwKPiAtICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8 VVNQX0FTWU5DX1RJTUVPVVRfT0ZGU0VUKQo+IC0KPiAtI2RlZmluZSBVU1BfQVNZTkNfRElWMl9N QVNLICAgICAgICAgICAgMHgwMDNGMDAwMAo+IC0jZGVmaW5lIFVTUF9BU1lOQ19ESVYyX09GRlNF VCAgICAgICAgICAxNgo+IC0KPiAtLyogVVNQIFRYIERNQSBJL08gTU9ERSBSZWdpc3RlciAqLwo+ IC0jZGVmaW5lIFVTUF9UWF9NT0RFX0lPICAgICAgICAgICAgICAgICAweDAwMDAwMDAxCj4gLQo+ IC0vKiBVU1AgVFggRE1BIEkvTyBMZW5ndGggUmVnaXN0ZXIgKi8KPiAtI2RlZmluZSBVU1BfVFhf REFUQV9MRU5fTUFTSyAgICAgICAgICAgMHhGRkZGRkZGRgo+IC0jZGVmaW5lIFVTUF9UWF9EQVRB X0xFTl9PRkZTRVQgICAgICAgICAwCj4gLQo+IC0vKiBVU1AgVFggRklGTyBDb250cm9sIFJlZ2lz dGVyICovCj4gLSNkZWZpbmUgVVNQX1RYX0ZJRk9fV0lEVEhfTUFTSyAgICAgICAgIDB4MDAwMDAw MDMKPiAtI2RlZmluZSBVU1BfVFhfRklGT19XSURUSF9PRkZTRVQgICAgICAgMAo+IC0KPiAtI2Rl ZmluZSBVU1BfVFhfRklGT19USERfTUFTSyAgICAgICAgICAgMHgwMDAwMDFGQwo+IC0jZGVmaW5l IFVTUF9UWF9GSUZPX1RIRF9PRkZTRVQgICAgICAgICAyCj4gLQo+IC0vKiBVU1AgVFggRklGTyBM ZXZlbCBDaGVjayBSZWdpc3RlciAqLwo+IC0jZGVmaW5lIFVTUF9UWF9GSUZPX0xFVkVMX0NIRUNL X01BU0sgICAweDFGCj4gLSNkZWZpbmUgVVNQX1RYX0ZJRk9fU0NfT0ZGU0VUICAwCj4gLSNkZWZp bmUgVVNQX1RYX0ZJRk9fTENfT0ZGU0VUICAxMAo+IC0jZGVmaW5lIFVTUF9UWF9GSUZPX0hDX09G RlNFVCAgMjAKPiAtCj4gLSNkZWZpbmUgVFhfRklGT19TQyh4KSAgICAgICAgICAoKCh4KSAmIFVT UF9UWF9GSUZPX0xFVkVMX0NIRUNLX01BU0spIFwKPiAtICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgIDw8IFVTUF9UWF9GSUZPX1NDX09GRlNFVCkKPiAtI2RlZmluZSBUWF9GSUZPX0xDKHgp ICAgICAgICAgICgoKHgpICYgVVNQX1RYX0ZJRk9fTEVWRUxfQ0hFQ0tfTUFTSykgXAo+IC0gICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgVVNQX1RYX0ZJRk9fTENfT0ZGU0VUKQo+IC0j ZGVmaW5lIFRYX0ZJRk9fSEMoeCkgICAgICAgICAgKCgoeCkgJiBVU1BfVFhfRklGT19MRVZFTF9D SEVDS19NQVNLKSBcCj4gLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCBVU1BfVFhf RklGT19IQ19PRkZTRVQpCj4gLQo+IC0vKiBVU1AgVFggRklGTyBPcGVyYXRpb24gUmVnaXN0ZXIg Ki8KPiAtI2RlZmluZSBVU1BfVFhfRklGT19SRVNFVCAgICAgICAgICAgICAgMHgwMDAwMDAwMQo+ IC0jZGVmaW5lIFVTUF9UWF9GSUZPX1NUQVJUICAgICAgICAgICAgICAweDAwMDAwMDAyCj4gLQo+ IC0vKiBVU1AgVFggRklGTyBTdGF0dXMgUmVnaXN0ZXIgKi8KPiAtI2RlZmluZSBVU1BfVFhfRklG T19MRVZFTF9NQVNLICAgICAgICAgMHgwMDAwMDA3Rgo+IC0jZGVmaW5lIFVTUF9UWF9GSUZPX0xF VkVMX09GRlNFVCAgICAgICAwCj4gLQo+IC0jZGVmaW5lIFVTUF9UWF9GSUZPX0ZVTEwgICAgICAg ICAgICAgICAweDAwMDAwMDgwCj4gLSNkZWZpbmUgVVNQX1RYX0ZJRk9fRU1QVFkgICAgICAgICAg ICAgIDB4MDAwMDAxMDAKPiAtCj4gLS8qIFVTUCBUWCBGSUZPIERhdGEgUmVnaXN0ZXIgKi8KPiAt I2RlZmluZSBVU1BfVFhfRklGT19EQVRBX01BU0sgICAgICAgICAgMHhGRkZGRkZGRgo+IC0jZGVm aW5lIFVTUF9UWF9GSUZPX0RBVEFfT0ZGU0VUICAgICAgICAgICAgICAgIDAKPiAtCj4gLS8qIFVT UCBSWCBETUEgSS9PIE1PREUgUmVnaXN0ZXIgKi8KPiAtI2RlZmluZSBVU1BfUlhfTU9ERV9JTyAg ICAgICAgICAgICAgICAgMHgwMDAwMDAwMQo+IC0jZGVmaW5lIFVTUF9SWF9ETUFfRkxVU0ggICAg ICAgICAgICAgICAweDAwMDAwMDA0Cj4gLQo+IC0vKiBVU1AgUlggRE1BIEkvTyBMZW5ndGggUmVn aXN0ZXIgKi8KPiAtI2RlZmluZSBVU1BfUlhfREFUQV9MRU5fTUFTSyAgICAgICAgICAgMHhGRkZG RkZGRgo+IC0jZGVmaW5lIFVTUF9SWF9EQVRBX0xFTl9PRkZTRVQgICAgICAgICAwCj4gLQo+IC0v KiBVU1AgUlggRklGTyBDb250cm9sIFJlZ2lzdGVyICovCj4gLSNkZWZpbmUgVVNQX1JYX0ZJRk9f V0lEVEhfTUFTSyAgICAgICAgIDB4MDAwMDAwMDMKPiAtI2RlZmluZSBVU1BfUlhfRklGT19XSURU SF9PRkZTRVQgICAgICAgMAo+IC0KPiAtI2RlZmluZSBVU1BfUlhfRklGT19USERfTUFTSyAgICAg ICAgICAgMHgwMDAwMDFGQwo+IC0jZGVmaW5lIFVTUF9SWF9GSUZPX1RIRF9PRkZTRVQgICAgICAg ICAyCj4gLQo+IC0vKiBVU1AgUlggRklGTyBMZXZlbCBDaGVjayBSZWdpc3RlciAqLwo+IC0KPiAt I2RlZmluZSBVU1BfUlhfRklGT19MRVZFTF9DSEVDS19NQVNLICAgMHgxRgo+IC0jZGVmaW5lIFVT UF9SWF9GSUZPX1NDX09GRlNFVCAgMAo+IC0jZGVmaW5lIFVTUF9SWF9GSUZPX0xDX09GRlNFVCAg MTAKPiAtI2RlZmluZSBVU1BfUlhfRklGT19IQ19PRkZTRVQgIDIwCj4gLQo+IC0jZGVmaW5lIFJY X0ZJRk9fU0MoeCkgICAgICAgICAgKCgoeCkgJiBVU1BfUlhfRklGT19MRVZFTF9DSEVDS19NQVNL KSBcCj4gLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCBVU1BfUlhfRklGT19TQ19P RkZTRVQpCj4gLSNkZWZpbmUgUlhfRklGT19MQyh4KSAgICAgICAgICAoKCh4KSAmIFVTUF9SWF9G SUZPX0xFVkVMX0NIRUNLX01BU0spIFwKPiAtICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg IDw8IFVTUF9SWF9GSUZPX0xDX09GRlNFVCkKPiAtI2RlZmluZSBSWF9GSUZPX0hDKHgpICAgICAg ICAgICgoKHgpICYgVVNQX1JYX0ZJRk9fTEVWRUxfQ0hFQ0tfTUFTSykgXAo+IC0gICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgPDwgVVNQX1JYX0ZJRk9fSENfT0ZGU0VUKQo+IC0KPiAtLyog VVNQIFJYIEZJRk8gT3BlcmF0aW9uIFJlZ2lzdGVyICovCj4gLSNkZWZpbmUgVVNQX1JYX0ZJRk9f UkVTRVQgICAgICAgICAgICAgIDB4MDAwMDAwMDEKPiAtI2RlZmluZSBVU1BfUlhfRklGT19TVEFS VCAgICAgICAgICAgICAgMHgwMDAwMDAwMgo+IC0KPiAtLyogVVNQIFJYIEZJRk8gU3RhdHVzIFJl Z2lzdGVyICovCj4gLQo+IC0jZGVmaW5lIFVTUF9SWF9GSUZPX0xFVkVMX01BU0sgICAgICAgICAw eDAwMDAwMDdGCj4gLSNkZWZpbmUgVVNQX1JYX0ZJRk9fTEVWRUxfT0ZGU0VUICAgICAgIDAKPiAt Cj4gLSNkZWZpbmUgVVNQX1JYX0ZJRk9fRlVMTCAgICAgICAgICAgICAgIDB4MDAwMDAwODAKPiAt I2RlZmluZSBVU1BfUlhfRklGT19FTVBUWSAgICAgICAgICAgICAgMHgwMDAwMDEwMAo+IC0KPiAt LyogVVNQIFJYIEZJRk8gRGF0YSBSZWdpc3RlciAqLwo+IC0KPiAtI2RlZmluZSBVU1BfUlhfRklG T19EQVRBX01BU0sgICAgICAgICAgMHhGRkZGRkZGRgo+IC0jZGVmaW5lIFVTUF9SWF9GSUZPX0RB VEFfT0ZGU0VUICAgICAgICAgICAgICAgIDAKPiAtCj4gLS8qCj4gLSAqIFdoZW4gcnggdGhkIGly cSBvY2N1ciwgc2VuZGVyIGp1c3QgZGlzYWJsZSB0eCBlbXB0eSBpcnEsCj4gLSAqIFJlbWFpbmlu ZyBkYXRhIGluIHR4IGZpZm8gd2lsIGFsc28gYmUgc2VudCBvdXQuCj4gLSAqLwo+IC0jZGVmaW5l IFVTUF9GSUZPX1NJWkUgICAgICAgICAgICAgICAgICAxMjgKPiAtI2RlZmluZSBVU1BfVFhfRklG T19USFJFU0hPTEQgICAgICAgICAgKFVTUF9GSUZPX1NJWkUvMikKPiAtI2RlZmluZSBVU1BfUlhf RklGT19USFJFU0hPTEQgICAgICAgICAgKFVTUF9GSUZPX1NJWkUvMikKPiAtCj4gLS8qIEZJRk9f V0lEVEggZm9yIHRoZSBVU1BfVFhfRklGT19DVFJMIGFuZCBVU1BfUlhfRklGT19DVFJMIHJlZ2lz dGVycyAqLwo+IC0jZGVmaW5lIFVTUF9GSUZPX1dJRFRIX0JZVEUgIDB4MDAKPiAtI2RlZmluZSBV U1BfRklGT19XSURUSF9XT1JEICAweDAxCj4gLSNkZWZpbmUgVVNQX0ZJRk9fV0lEVEhfRFdPUkQg MHgwMgo+IC0KPiAtI2RlZmluZSBVU1BfQVNZTkNfRElWMiAgICAgICAgICAxNgo+IC0KPiAtI2Rl ZmluZSBVU1BfUExVR09VVF9SRVRSWV9DTlQgIDIKPiAtCj4gLSNkZWZpbmUgVVNQX1RYX1JYX0ZJ Rk9fV0lEVEhfRFdPUkQgICAgMgo+IC0KPiAtI2RlZmluZSBTSVJGX1VTUF9ESVZfTUNMSyAgICAg IDAKPiAtCj4gLSNkZWZpbmUgU0lSRl9VU1BfSTJTX1RGU19TWU5DICAwCj4gLSNkZWZpbmUgU0lS Rl9VU1BfSTJTX1JGU19TWU5DICAxCj4gLSNlbmRpZgo+IC0tCj4gMi4yOS4yCj4KCl9fX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCmxpbnV4LWFybS1rZXJuZWwg bWFpbGluZyBsaXN0CmxpbnV4LWFybS1rZXJuZWxAbGlzdHMuaW5mcmFkZWFkLm9yZwpodHRwOi8v bGlzdHMuaW5mcmFkZWFkLm9yZy9tYWlsbWFuL2xpc3RpbmZvL2xpbnV4LWFybS1rZXJuZWwK