From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1753398AbbGGIEZ (ORCPT ); Tue, 7 Jul 2015 04:04:25 -0400 Received: from maillog.nuvoton.com ([202.39.227.15]:52856 "EHLO maillog.nuvoton.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751134AbbGGIEN (ORCPT ); Tue, 7 Jul 2015 04:04:13 -0400 X-Greylist: delayed 634 seconds by postgrey-1.27 at vger.kernel.org; Tue, 07 Jul 2015 04:04:12 EDT Message-ID: <559B857E.1020802@nuvoton.com> Date: Tue, 7 Jul 2015 15:53:34 +0800 From: Chih-Chiang Chang User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:31.0) Gecko/20100101 Thunderbird/31.6.0 MIME-Version: 1.0 To: Lars-Peter Clausen , Mark Brown CC: "tiwai@suse.de" , AP MS30 Linux ALSA , "lgirdwood@gmail.com" , AP MS30 Linux Kernel community Subject: Re: [alsa-devel] [PATCH v2] ASoC: Add support for NAU8825 codec to ASoC References: <552F874A.7090409@nuvoton.com> <553513F3.4060202@metafoo.de> In-Reply-To: <553513F3.4060202@metafoo.de> Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: 8bit Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On 2015/4/20 下午 10:57, Lars-Peter Clausen wrote: > On 04/16/2015 11:56 AM, Chih-Chiang Chang wrote: >> The NAU88L25 is an ultra-low power high performance audio codec designed >> for smartphone, tablet PC, and other portable devices by Nuvoton, now >> add linux driver support for it. >> >> Signed-off-by: Chih-Chiang Chang > > Looks pretty good now. > >> --- >> v2->v1: >> - fixes according to Lars-Peter Clausen's review comments >> - removes unused platform data file >> - corrects the naming of DAPM input widget >> - fixes some wrong coding of SOC widgets and other codes >> - adds definition and remark for config FLL clock >> - moves the code of reset hardware registers from codec_probe() to i2c_probe() >> - removes unused codes >> > [...] >> +static const struct snd_kcontrol_new nau8825_snd_controls[] = { >> + > > Here and a few other places you leave the first line in the struct > declaration empty. No need for that. > Removed the space line in declarations. >> + SOC_SINGLE_TLV("MIC Volume", NAU8825_ADC_DGAIN_CTRL, >> + NAU8825_ADC_DGAIN_SFT, >> + NAU8825_ADC_VOL_RSCL_RANGE, 0, adc_vol_tlv), >> + SOC_DOUBLE_TLV("HP Volume", NAU8825_HSVOL_CTRL, >> + NAU8825_L_HSVOL_SFT, NAU8825_R_HSVOL_SFT, >> + NAU8825_VOL_RSCL_RANGE, 1, out_hp_vol_tlv), >> +}; > [...] >> + >> +static void config_fll_clk_12m(struct snd_soc_codec *codec) >> +{ >> + struct nau8825_priv *nau8825 = snd_soc_codec_get_drvdata(codec); >> + >> + regmap_update_bits(nau8825->regmap, NAU8825_CLK_DIVIDER, >> + NAU8825_CLK_MCLK_SRC_MASK, 0x0003); >> + regmap_update_bits(nau8825->regmap, NAU8825_FLL_1, >> + NAU8825_FLL_RATIO_MASK, 0x0001); >> + /* FLL 16-bit fractional input */ >> + regmap_write(nau8825->regmap, NAU8825_FLL_2, 0xC49B); >> + /* FLL 10-bit integer input */ >> + regmap_update_bits(nau8825->regmap, NAU8825_FLL_3, >> + NAU8825_FLL_INTEGER_MASK, 0x0020); >> + /* FLL pre-scaler */ >> + regmap_update_bits(nau8825->regmap, NAU8825_FLL_4, >> + NAU8825_FLL_REF_DIV_MASK, 0x0800); > > This seems to use some constant dividers and multipliers for the FLL. Does > this expect a specific reference clock from somewhere? > Yes, current code expects ASoC will send 12 MHz MCLK to the codec. But finally, we will support all possible reference clock frequencies. >> + /* select divied VCO input */ >> + regmap_update_bits(nau8825->regmap, NAU8825_FLL_5, >> + NAU8825_FLL_FILTER_SW_MASK, 0x0000); >> + /* FLL sigma delta modulator enable */ >> + regmap_update_bits(nau8825->regmap, NAU8825_FLL_6, >> + NAU8825_SDM_EN_MASK, 0x4000); >> +} >> + >> +static void set_sys_clk(struct snd_soc_codec *codec, int sys_clk) >> +{ >> + struct nau8825_priv *nau8825 = snd_soc_codec_get_drvdata(codec); >> + >> + pr_debug("%s :: sys_clk=%x\n", __func__, sys_clk); >> + switch (sys_clk) { >> + case NAU8825_INTERNALCLOCK: >> + regmap_update_bits(nau8825->regmap, NAU8825_CLK_DIVIDER, >> + NAU8825_SYSCLK_EN_MASK, NAU8825_SYSCLK_DIS); >> + regmap_update_bits(nau8825->regmap, NAU8825_FLL_6, >> + NAU8825_DCO_EN_MASK, NAU8825_DCO_EN); >> + regmap_update_bits(nau8825->regmap, NAU8825_CLK_DIVIDER, >> + NAU8825_SYSCLK_EN_MASK, NAU8825_SYSCLK_EN); >> + break; >> + case NAU8825_MCLK: >> + default: >> + regmap_update_bits(nau8825->regmap, NAU8825_CLK_DIVIDER, >> + NAU8825_SYSCLK_EN_MASK, NAU8825_SYSCLK_DIS); >> + regmap_update_bits(nau8825->regmap, NAU8825_FLL_6, >> + NAU8825_DCO_EN_MASK, NAU8825_DCO_DIS); >> + regmap_update_bits(nau8825->regmap, NAU8825_CLK_DIVIDER, >> + NAU8825_SYSCLK_EN_MASK, NAU8825_SYSCLK_EN); >> + break; >> + } >> +} >> + >> +static int nau8825_dai_set_sysclk(struct snd_soc_dai *dai, >> + int clk_id, unsigned int freq, int dir) >> +{ >> + struct snd_soc_codec *codec = dai->codec; >> + >> + switch (clk_id) { >> + case NAU8825_MCLK: >> + config_fll_clk_12m(codec); >> + set_sys_clk(codec, clk_id); > > Maybe just inline the contents of set_sys_clk here ... > Since another code as below still uses set_sys_clk(), we reserve function calling here. case SND_SOC_BIAS_OFF: dev_dbg(codec->dev, "###nau8825_set_bias_level OFF\n"); set_sys_clk(codec, NAU8825_INTERNALCLOCK); regmap_update_bits(nau8825->regmap, NAU8825_BIAS_ADJ, NAU8825_VMID_MASK, NAU8825_VMID_DIS); >> + break; >> + case NAU8825_INTERNALCLOCK: >> + set_sys_clk(codec, clk_id); > > ... and here > The same answer to previous. >> + break; >> + default: >> + dev_err(codec->dev, "Wrong clock src\n"); >> + return -EINVAL; >> + } >> + return 0; >> +} > [...] > > +static const struct reg_default nau8825_reg[] = { > > + /* enable clock source */ > > + {0x0001, 0x07FF}, > > + /* enable VMID and Bias */ > > + {0x0076, 0x3140}, > > + /* setup clock divider */ > > + {0x0003, 0x0050}, > > + /* jack detection configuration */ > > + {0x000C, 0x0004}, > > + {0x000D, 0x00E0}, > > + {0x000F, 0x0801}, > > + {0x0012, 0x0010}, > > + /* keypad detection configuration */ > > + {0x0013, 0x0280}, > > + {0x0014, 0x7310}, > > + {0x0015, 0x050E}, > > + {0x0016, 0x1B2A}, > > + /* audio format configuration */ > > + {0x001A, 0x0800}, > > + {0x001C, 0x000E}, > > + {0x001D, 0x0010}, > > + /* sampling rate control */ > > + {0x002B, 0x0012}, > > + /* DAC sampling rate control */ > > + {0x002C, 0x0082}, > > + /* ADC and DAC mixer control */ > > + {0x0030, 0x00D2}, > > + {0x0033, 0x00CF}, > > + {0x0034, 0x02CF}, > > + /* DAC class-G control */ > > + {0x006A, 0x1003}, > > + {0x0050, 0x2007}, > > + /* ADC PGA control */ > > + {0x0072, 0x0260}, > > + /* DAC power down enabled */ > > + {0x0080, 0x03A0}, > > + /* enable DAC clock */ > > + {0x0073, 0x336C}, > > + /* enable MIC Bias */ > > + {0x0074, 0x5502}, > > + /* powerup output driver */ > > + {0x007F, 0x473C}, > > + {0x007F, 0x473F}, > > + /* DAC power down disabled */ > > + {0x0080, 0x00A0}, > > + /* adjust MIC Bias */ > > + {0x0066, 0x2060}, > > + {0x0066, 0x2060}, > > + {0x0066, 0x0060}, > > +}; > > The register defaults should hold the content of the registers in the > power-on reset state of the chip. This is not meant to be used as a > initialization sequence. > Modified code to make register defaults hold the register values in the power-on reset state. static const struct reg_default nau8825_reg[] = { {0x000, 0x0000}, {0x001, 0x00ff}, {0x003, 0x0050}, {0x004, 0x0000}, {0x005, 0x3126}, {0x006, 0x0008}, {0x007, 0x0010}, {0x008, 0x0000}, {0x009, 0x6000}, {0x00a, 0xf13c}, {0x00c, 0x000c}, {0x00d, 0x0000}, {0x00f, 0x0800}, {0x010, 0x0000}, {0x011, 0x0000}, {0x012, 0x0010}, {0x013, 0x0015}, {0x014, 0x0110}, {0x015, 0x0000}, ... > > + > [...] >> +static struct snd_soc_dai_driver nau8825_dai_driver[] = { >> + { >> + .name = "nau8825-aif1", >> + .playback = { >> + .stream_name = "AIF1 Playback", >> + .channels_min = 1, >> + .channels_max = 2, >> + .rates = NAU8825_RATES, >> + .formats = NAU8825_FORMATS, >> + }, >> + .capture = { >> + .stream_name = "AIF1 Capture", >> + .channels_min = 1, >> + .channels_max = 2, >> + .rates = NAU8825_RATES, >> + .formats = NAU8825_FORMATS, >> + }, > > The indent is a bit strange above. > Fixed the code as below. static struct snd_soc_dai_driver nau8825_dai_driver[] = { { .name = "nau8825-aif1", .playback = { .stream_name = "AIF1 Playback", .channels_min = 1, .channels_max = 2, .rates = NAU8825_RATES, .formats = NAU8825_FORMATS, }, .capture = { .stream_name = "AIF1 Capture", .channels_min = 1, .channels_max = 2, .rates = NAU8825_RATES, .formats = NAU8825_FORMATS, }, .ops = &nau8825_dai_ops, } }; >> + .ops = &nau8825_dai_ops, >> + } >> +}; >> + >> + >> +static int nau8825_i2c_probe(struct i2c_client *i2c, >> + const struct i2c_device_id *i2c_id) >> +{ >> + struct nau8825_priv *nau8825; >> + int i, ret; >> + >> + nau8825 = devm_kzalloc(&i2c->dev, sizeof(*nau8825), >> + GFP_KERNEL); >> + if (nau8825 == NULL) >> + return -ENOMEM; >> + nau8825->i2c = i2c; >> + i2c_set_clientdata(i2c, nau8825); >> + nau8825->regmap = devm_regmap_init_i2c(i2c, &nau8825_regmap); >> + if (IS_ERR(nau8825->regmap)) { >> + ret = PTR_ERR(nau8825->regmap); >> + dev_err(&i2c->dev, "Failed to allocate regmap: %d\n", ret); >> + goto err_enable; > > Since there is nothing to do at err_enable, just return ret directly and get > rid of the label. > Modified the code as below. i2c_set_clientdata(i2c, nau8825); nau8825->regmap = devm_regmap_init_i2c(i2c, &nau8825_regmap); if (IS_ERR(nau8825->regmap)) { ret = PTR_ERR(nau8825->regmap); dev_err(&i2c->dev, "Failed to allocate regmap: %d\n", ret); return ret; } /* software reset */ regmap_write(nau8825->regmap, NAU8825_RESET, 0x00); regmap_write(nau8825->regmap, NAU8825_RESET, 0x00); /* register sound card */ ret = snd_soc_register_codec(&i2c->dev, &soc_codec_driver_nau8825, nau8825_dai_driver, ARRAY_SIZE(nau8825_dai_driver)); return ret; } >> + } >> + /* software reset */ >> + regmap_write(nau8825->regmap, NAU8825_RESET, 0x01); >> + regmap_write(nau8825->regmap, NAU8825_RESET, 0x02); >> + /*writing initial register values to the codec*/ >> + for (i = 0; i < ARRAY_SIZE(nau8825_reg); i++) >> + regmap_write(nau8825->regmap, nau8825_reg[i].reg, >> + nau8825_reg[i].def); >> + >> + ret = snd_soc_register_codec(&i2c->dev, &soc_codec_driver_nau8825, >> + nau8825_dai_driver, >> + ARRAY_SIZE(nau8825_dai_driver)); >> +err_enable: >> + return ret; >> +} >> + > [...] >> +#define NAU8825_RATES SNDRV_PCM_RATE_8000_192000 >> +#define NAU8825_FORMATS (SNDRV_PCM_FMTBIT_S16_LE | SNDRV_PCM_FMTBIT_S20_3LE \ >> + | SNDRV_PCM_FMTBIT_S24_3LE | SNDRV_PCM_FMTBIT_S32_LE) > > These defines should probably be moved to the C file close to their users. > Move the defines to C file as below. #define NAU8825_RATES SNDRV_PCM_RATE_8000_192000 #define NAU8825_FORMATS (SNDRV_PCM_FMTBIT_S16_LE | SNDRV_PCM_FMTBIT_S20_3LE \ | SNDRV_PCM_FMTBIT_S24_3LE | SNDRV_PCM_FMTBIT_S32_LE) static const struct snd_soc_dai_ops nau8825_dai_ops = { .trigger = nau8825_trigger, .hw_params = nau8825_hw_params, .set_sysclk = nau8825_dai_set_sysclk, .set_fmt = nau8825_set_dai_fmt, .digital_mute = nau8825_dac_mute, }; static struct snd_soc_dai_driver nau8825_dai_driver[] = { { .name = "nau8825-aif1", >> + >> +struct nau8825_priv { >> + struct snd_soc_codec *codec; >> + struct regmap *regmap; >> + struct i2c_client *i2c; >> + struct snd_soc_jack *jack; >> + struct delayed_work jack_detect_work; > > All fields in here except for the regmap field are still unused. > Remove some unused field. But the i2c field is used in nau8825_i2c_probe(). struct nau8825_priv { struct regmap *regmap; struct i2c_client *i2c; }; static int nau8825_i2c_probe(struct i2c_client *i2c, const struct i2c_device_id *i2c_id) { struct nau8825_priv *nau8825; int ret; nau8825 = devm_kzalloc(&i2c->dev, sizeof(*nau8825), GFP_KERNEL); if (nau8825 == NULL) return -ENOMEM; nau8825->i2c = i2c; i2c_set_clientdata(i2c, nau8825); nau8825->regmap = devm_regmap_init_i2c(i2c, &nau8825_regmap); >> +}; >> +#endif /* _NAU8825_H */ >> > From mboxrd@z Thu Jan 1 00:00:00 1970 From: Chih-Chiang Chang Subject: Re: [PATCH v2] ASoC: Add support for NAU8825 codec to ASoC Date: Tue, 7 Jul 2015 15:53:34 +0800 Message-ID: <559B857E.1020802@nuvoton.com> References: <552F874A.7090409@nuvoton.com> <553513F3.4060202@metafoo.de> Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Return-path: Received: from maillog.nuvoton.com (maillog.nuvoton.com [202.39.227.15]) by alsa0.perex.cz (Postfix) with ESMTP id 69C7C26154F for ; Tue, 7 Jul 2015 09:53:39 +0200 (CEST) In-Reply-To: <553513F3.4060202@metafoo.de> List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: alsa-devel-bounces@alsa-project.org Sender: alsa-devel-bounces@alsa-project.org To: Lars-Peter Clausen , Mark Brown Cc: "tiwai@suse.de" , AP MS30 Linux ALSA , "lgirdwood@gmail.com" , AP MS30 Linux Kernel community List-Id: alsa-devel@alsa-project.org CgpPbiAyMDE1LzQvMjAg5LiL5Y2IIDEwOjU3LCBMYXJzLVBldGVyIENsYXVzZW4gd3JvdGU6Cj4g T24gMDQvMTYvMjAxNSAxMTo1NiBBTSwgQ2hpaC1DaGlhbmcgQ2hhbmcgd3JvdGU6Cj4+IFRoZSBO QVU4OEwyNSBpcyBhbiB1bHRyYS1sb3cgcG93ZXIgaGlnaCBwZXJmb3JtYW5jZSBhdWRpbyBjb2Rl YyBkZXNpZ25lZAo+PiBmb3Igc21hcnRwaG9uZSwgdGFibGV0IFBDLCBhbmQgb3RoZXIgcG9ydGFi bGUgZGV2aWNlcyBieSBOdXZvdG9uLCBub3cKPj4gYWRkIGxpbnV4IGRyaXZlciBzdXBwb3J0IGZv ciBpdC4KPj4KPj4gU2lnbmVkLW9mZi1ieTogQ2hpaC1DaGlhbmcgQ2hhbmcgPGNjY2hhbmcxMkBu dXZvdG9uLmNvbT4KPiAKPiBMb29rcyBwcmV0dHkgZ29vZCBub3cuCj4gCj4+IC0tLQo+PiB2Mi0+ djE6Cj4+ICAgICAtIGZpeGVzIGFjY29yZGluZyB0byBMYXJzLVBldGVyIENsYXVzZW4ncyByZXZp ZXcgY29tbWVudHMKPj4gICAgIC0gcmVtb3ZlcyB1bnVzZWQgcGxhdGZvcm0gZGF0YSBmaWxlCj4+ ICAgICAtIGNvcnJlY3RzIHRoZSBuYW1pbmcgb2YgREFQTSBpbnB1dCB3aWRnZXQKPj4gICAgIC0g Zml4ZXMgc29tZSB3cm9uZyBjb2Rpbmcgb2YgU09DIHdpZGdldHMgYW5kIG90aGVyIGNvZGVzCj4+ ICAgICAtIGFkZHMgZGVmaW5pdGlvbiBhbmQgcmVtYXJrIGZvciBjb25maWcgRkxMIGNsb2NrCj4+ ICAgICAtIG1vdmVzIHRoZSBjb2RlIG9mIHJlc2V0IGhhcmR3YXJlIHJlZ2lzdGVycyBmcm9tIGNv ZGVjX3Byb2JlKCkgdG8gaTJjX3Byb2JlKCkKPj4gICAgIC0gcmVtb3ZlcyB1bnVzZWQgY29kZXMK Pj4KPiBbLi4uXQo+PiArc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IG5hdTg4 MjVfc25kX2NvbnRyb2xzW10gPSB7Cj4+ICsKPiAKPiBIZXJlIGFuZCBhIGZldyBvdGhlciBwbGFj ZXMgeW91IGxlYXZlIHRoZSBmaXJzdCBsaW5lIGluIHRoZSBzdHJ1Y3QgCj4gZGVjbGFyYXRpb24g ZW1wdHkuIE5vIG5lZWQgZm9yIHRoYXQuCj4gClJlbW92ZWQgdGhlIHNwYWNlIGxpbmUgaW4gZGVj bGFyYXRpb25zLgoKPj4gKwlTT0NfU0lOR0xFX1RMVigiTUlDIFZvbHVtZSIsIE5BVTg4MjVfQURD X0RHQUlOX0NUUkwsCj4+ICsJCQkJTkFVODgyNV9BRENfREdBSU5fU0ZULAo+PiArCQkJCU5BVTg4 MjVfQURDX1ZPTF9SU0NMX1JBTkdFLCAwLCBhZGNfdm9sX3RsdiksCj4+ICsJU09DX0RPVUJMRV9U TFYoIkhQIFZvbHVtZSIsIE5BVTg4MjVfSFNWT0xfQ1RSTCwKPj4gKwkJCQlOQVU4ODI1X0xfSFNW T0xfU0ZULCBOQVU4ODI1X1JfSFNWT0xfU0ZULAo+PiArCQkJCU5BVTg4MjVfVk9MX1JTQ0xfUkFO R0UsIDEsIG91dF9ocF92b2xfdGx2KSwKPj4gK307Cj4gWy4uLl0KPj4gKwo+PiArc3RhdGljIHZv aWQgY29uZmlnX2ZsbF9jbGtfMTJtKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYykKPj4gK3sK Pj4gKwlzdHJ1Y3QgbmF1ODgyNV9wcml2ICpuYXU4ODI1ID0gc25kX3NvY19jb2RlY19nZXRfZHJ2 ZGF0YShjb2RlYyk7Cj4+ICsKPj4gKwlyZWdtYXBfdXBkYXRlX2JpdHMobmF1ODgyNS0+cmVnbWFw LCBOQVU4ODI1X0NMS19ESVZJREVSLAo+PiArCQkJCU5BVTg4MjVfQ0xLX01DTEtfU1JDX01BU0ss IDB4MDAwMyk7Cj4+ICsJcmVnbWFwX3VwZGF0ZV9iaXRzKG5hdTg4MjUtPnJlZ21hcCwgTkFVODgy NV9GTExfMSwKPj4gKwkJCQlOQVU4ODI1X0ZMTF9SQVRJT19NQVNLLCAweDAwMDEpOwo+PiArCS8q IEZMTCAxNi1iaXQgZnJhY3Rpb25hbCBpbnB1dCAqLwo+PiArCXJlZ21hcF93cml0ZShuYXU4ODI1 LT5yZWdtYXAsIE5BVTg4MjVfRkxMXzIsIDB4QzQ5Qik7Cj4+ICsJLyogRkxMIDEwLWJpdCBpbnRl Z2VyIGlucHV0ICovCj4+ICsJcmVnbWFwX3VwZGF0ZV9iaXRzKG5hdTg4MjUtPnJlZ21hcCwgTkFV ODgyNV9GTExfMywKPj4gKwkJCQlOQVU4ODI1X0ZMTF9JTlRFR0VSX01BU0ssIDB4MDAyMCk7Cj4+ ICsJLyogRkxMIHByZS1zY2FsZXIgKi8KPj4gKwlyZWdtYXBfdXBkYXRlX2JpdHMobmF1ODgyNS0+ cmVnbWFwLCBOQVU4ODI1X0ZMTF80LAo+PiArCQkJCU5BVTg4MjVfRkxMX1JFRl9ESVZfTUFTSywg MHgwODAwKTsKPiAKPiBUaGlzIHNlZW1zIHRvIHVzZSBzb21lIGNvbnN0YW50IGRpdmlkZXJzIGFu ZCBtdWx0aXBsaWVycyBmb3IgdGhlIEZMTC4gRG9lcyAKPiB0aGlzIGV4cGVjdCBhIHNwZWNpZmlj IHJlZmVyZW5jZSBjbG9jayBmcm9tIHNvbWV3aGVyZT8KPgpZZXMsIGN1cnJlbnQgY29kZSBleHBl Y3RzIEFTb0Mgd2lsbCBzZW5kIDEyIE1IeiBNQ0xLIHRvIHRoZSBjb2RlYy4gQnV0CmZpbmFsbHks IHdlIHdpbGwgc3VwcG9ydCBhbGwgcG9zc2libGUgcmVmZXJlbmNlIGNsb2NrIGZyZXF1ZW5jaWVz LgoKPj4gKwkvKiBzZWxlY3QgZGl2aWVkIFZDTyBpbnB1dCAqLwo+PiArCXJlZ21hcF91cGRhdGVf Yml0cyhuYXU4ODI1LT5yZWdtYXAsIE5BVTg4MjVfRkxMXzUsCj4+ICsJCQkJTkFVODgyNV9GTExf RklMVEVSX1NXX01BU0ssIDB4MDAwMCk7Cj4+ICsJLyogRkxMIHNpZ21hIGRlbHRhIG1vZHVsYXRv ciBlbmFibGUgKi8KPj4gKwlyZWdtYXBfdXBkYXRlX2JpdHMobmF1ODgyNS0+cmVnbWFwLCBOQVU4 ODI1X0ZMTF82LAo+PiArCQkJCU5BVTg4MjVfU0RNX0VOX01BU0ssIDB4NDAwMCk7Cj4+ICt9Cj4+ ICsKPj4gK3N0YXRpYyB2b2lkIHNldF9zeXNfY2xrKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2Rl YywgaW50IHN5c19jbGspCj4+ICt7Cj4+ICsJc3RydWN0IG5hdTg4MjVfcHJpdiAqbmF1ODgyNSA9 IHNuZF9zb2NfY29kZWNfZ2V0X2RydmRhdGEoY29kZWMpOwo+PiArCj4+ICsJcHJfZGVidWcoIiVz IDo6IHN5c19jbGs9JXhcbiIsIF9fZnVuY19fLCBzeXNfY2xrKTsKPj4gKwlzd2l0Y2ggKHN5c19j bGspIHsKPj4gKwljYXNlIE5BVTg4MjVfSU5URVJOQUxDTE9DSzoKPj4gKwkJcmVnbWFwX3VwZGF0 ZV9iaXRzKG5hdTg4MjUtPnJlZ21hcCwgTkFVODgyNV9DTEtfRElWSURFUiwKPj4gKwkJCQlOQVU4 ODI1X1NZU0NMS19FTl9NQVNLLCBOQVU4ODI1X1NZU0NMS19ESVMpOwo+PiArCQlyZWdtYXBfdXBk YXRlX2JpdHMobmF1ODgyNS0+cmVnbWFwLCBOQVU4ODI1X0ZMTF82LAo+PiArCQkJCU5BVTg4MjVf RENPX0VOX01BU0ssIE5BVTg4MjVfRENPX0VOKTsKPj4gKwkJcmVnbWFwX3VwZGF0ZV9iaXRzKG5h dTg4MjUtPnJlZ21hcCwgTkFVODgyNV9DTEtfRElWSURFUiwKPj4gKwkJCQlOQVU4ODI1X1NZU0NM S19FTl9NQVNLLCBOQVU4ODI1X1NZU0NMS19FTik7Cj4+ICsJCWJyZWFrOwo+PiArCWNhc2UgTkFV ODgyNV9NQ0xLOgo+PiArCWRlZmF1bHQ6Cj4+ICsJCXJlZ21hcF91cGRhdGVfYml0cyhuYXU4ODI1 LT5yZWdtYXAsIE5BVTg4MjVfQ0xLX0RJVklERVIsCj4+ICsJCQkJTkFVODgyNV9TWVNDTEtfRU5f TUFTSywgTkFVODgyNV9TWVNDTEtfRElTKTsKPj4gKwkJcmVnbWFwX3VwZGF0ZV9iaXRzKG5hdTg4 MjUtPnJlZ21hcCwgTkFVODgyNV9GTExfNiwKPj4gKwkJCQlOQVU4ODI1X0RDT19FTl9NQVNLLCBO QVU4ODI1X0RDT19ESVMpOwo+PiArCQlyZWdtYXBfdXBkYXRlX2JpdHMobmF1ODgyNS0+cmVnbWFw LCBOQVU4ODI1X0NMS19ESVZJREVSLAo+PiArCQkJCU5BVTg4MjVfU1lTQ0xLX0VOX01BU0ssIE5B VTg4MjVfU1lTQ0xLX0VOKTsKPj4gKwkJYnJlYWs7Cj4+ICsJfQo+PiArfQo+PiArCj4+ICtzdGF0 aWMgaW50IG5hdTg4MjVfZGFpX3NldF9zeXNjbGsoc3RydWN0IHNuZF9zb2NfZGFpICpkYWksCj4+ ICsJCWludCBjbGtfaWQsIHVuc2lnbmVkIGludCBmcmVxLCBpbnQgZGlyKQo+PiArewo+PiArCXN0 cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IGRhaS0+Y29kZWM7Cj4+ICsKPj4gKwlzd2l0Y2gg KGNsa19pZCkgewo+PiArCWNhc2UgTkFVODgyNV9NQ0xLOgo+PiArCQljb25maWdfZmxsX2Nsa18x Mm0oY29kZWMpOwo+PiArCQlzZXRfc3lzX2Nsayhjb2RlYywgY2xrX2lkKTsKPiAKPiBNYXliZSBq dXN0IGlubGluZSB0aGUgY29udGVudHMgb2Ygc2V0X3N5c19jbGsgaGVyZSAuLi4KPiAKU2luY2Ug YW5vdGhlciBjb2RlIGFzIGJlbG93IHN0aWxsIHVzZXMgc2V0X3N5c19jbGsoKSwgd2UgcmVzZXJ2 ZQpmdW5jdGlvbiBjYWxsaW5nIGhlcmUuCgoJY2FzZSBTTkRfU09DX0JJQVNfT0ZGOgoJCWRldl9k YmcoY29kZWMtPmRldiwgIiMjI25hdTg4MjVfc2V0X2JpYXNfbGV2ZWwgT0ZGXG4iKTsKCQlzZXRf c3lzX2Nsayhjb2RlYywgTkFVODgyNV9JTlRFUk5BTENMT0NLKTsKCQlyZWdtYXBfdXBkYXRlX2Jp dHMobmF1ODgyNS0+cmVnbWFwLCBOQVU4ODI1X0JJQVNfQURKLAoJCQkJTkFVODgyNV9WTUlEX01B U0ssIE5BVTg4MjVfVk1JRF9ESVMpOwoKPj4gKwkJYnJlYWs7Cj4+ICsJY2FzZSBOQVU4ODI1X0lO VEVSTkFMQ0xPQ0s6Cj4+ICsJCXNldF9zeXNfY2xrKGNvZGVjLCBjbGtfaWQpOwo+IAo+IC4uLiBh bmQgaGVyZQo+IApUaGUgc2FtZSBhbnN3ZXIgdG8gcHJldmlvdXMuCgo+PiArCQlicmVhazsKPj4g KwlkZWZhdWx0Ogo+PiArCQlkZXZfZXJyKGNvZGVjLT5kZXYsICJXcm9uZyBjbG9jayBzcmNcbiIp Owo+PiArCQlyZXR1cm4gLUVJTlZBTDsKPj4gKwl9Cj4+ICsJcmV0dXJuIDA7Cj4+ICt9Cj4gWy4u Ll0KPiAgPiArc3RhdGljIGNvbnN0IHN0cnVjdCByZWdfZGVmYXVsdCBuYXU4ODI1X3JlZ1tdID0g ewo+ICA+ICsJLyogZW5hYmxlIGNsb2NrIHNvdXJjZSAqLwo+ICA+ICsJezB4MDAwMSwgMHgwN0ZG fSwKPiAgPiArCS8qIGVuYWJsZSBWTUlEIGFuZCBCaWFzICovCj4gID4gKwl7MHgwMDc2LCAweDMx NDB9LAo+ICA+ICsJLyogc2V0dXAgY2xvY2sgZGl2aWRlciAqLwo+ICA+ICsJezB4MDAwMywgMHgw MDUwfSwKPiAgPiArCS8qIGphY2sgZGV0ZWN0aW9uIGNvbmZpZ3VyYXRpb24gKi8KPiAgPiArCXsw eDAwMEMsIDB4MDAwNH0sCj4gID4gKwl7MHgwMDBELCAweDAwRTB9LAo+ICA+ICsJezB4MDAwRiwg MHgwODAxfSwKPiAgPiArCXsweDAwMTIsIDB4MDAxMH0sCj4gID4gKwkvKiBrZXlwYWQgZGV0ZWN0 aW9uIGNvbmZpZ3VyYXRpb24gKi8KPiAgPiArCXsweDAwMTMsIDB4MDI4MH0sCj4gID4gKwl7MHgw MDE0LCAweDczMTB9LAo+ICA+ICsJezB4MDAxNSwgMHgwNTBFfSwKPiAgPiArCXsweDAwMTYsIDB4 MUIyQX0sCj4gID4gKwkvKiBhdWRpbyBmb3JtYXQgY29uZmlndXJhdGlvbiAqLwo+ICA+ICsJezB4 MDAxQSwgMHgwODAwfSwKPiAgPiArCXsweDAwMUMsIDB4MDAwRX0sCj4gID4gKwl7MHgwMDFELCAw eDAwMTB9LAo+ICA+ICsJLyogc2FtcGxpbmcgcmF0ZSBjb250cm9sICovCj4gID4gKwl7MHgwMDJC LCAweDAwMTJ9LAo+ICA+ICsJLyogREFDIHNhbXBsaW5nIHJhdGUgY29udHJvbCAqLwo+ICA+ICsJ ezB4MDAyQywgMHgwMDgyfSwKPiAgPiArCS8qIEFEQyBhbmQgREFDIG1peGVyIGNvbnRyb2wgKi8K PiAgPiArCXsweDAwMzAsIDB4MDBEMn0sCj4gID4gKwl7MHgwMDMzLCAweDAwQ0Z9LAo+ICA+ICsJ ezB4MDAzNCwgMHgwMkNGfSwKPiAgPiArCS8qIERBQyBjbGFzcy1HIGNvbnRyb2wgKi8KPiAgPiAr CXsweDAwNkEsIDB4MTAwM30sCj4gID4gKwl7MHgwMDUwLCAweDIwMDd9LAo+ICA+ICsJLyogQURD IFBHQSBjb250cm9sICovCj4gID4gKwl7MHgwMDcyLCAweDAyNjB9LAo+ICA+ICsJLyogREFDIHBv d2VyIGRvd24gZW5hYmxlZCAqLwo+ICA+ICsJezB4MDA4MCwgMHgwM0EwfSwKPiAgPiArCS8qIGVu YWJsZSBEQUMgY2xvY2sgKi8KPiAgPiArCXsweDAwNzMsIDB4MzM2Q30sCj4gID4gKwkvKiBlbmFi bGUgTUlDIEJpYXMgKi8KPiAgPiArCXsweDAwNzQsIDB4NTUwMn0sCj4gID4gKwkvKiBwb3dlcnVw IG91dHB1dCBkcml2ZXIgKi8KPiAgPiArCXsweDAwN0YsIDB4NDczQ30sCj4gID4gKwl7MHgwMDdG LCAweDQ3M0Z9LAo+ICA+ICsJLyogREFDIHBvd2VyIGRvd24gZGlzYWJsZWQgKi8KPiAgPiArCXsw eDAwODAsIDB4MDBBMH0sCj4gID4gKwkvKiBhZGp1c3QgTUlDIEJpYXMgKi8KPiAgPiArCXsweDAw NjYsIDB4MjA2MH0sCj4gID4gKwl7MHgwMDY2LCAweDIwNjB9LAo+ICA+ICsJezB4MDA2NiwgMHgw MDYwfSwKPiAgPiArfTsKPiAKPiBUaGUgcmVnaXN0ZXIgZGVmYXVsdHMgc2hvdWxkIGhvbGQgdGhl IGNvbnRlbnQgb2YgdGhlIHJlZ2lzdGVycyBpbiB0aGUgCj4gcG93ZXItb24gcmVzZXQgc3RhdGUg b2YgdGhlIGNoaXAuIFRoaXMgaXMgbm90IG1lYW50IHRvIGJlIHVzZWQgYXMgYSAKPiBpbml0aWFs aXphdGlvbiBzZXF1ZW5jZS4KPiAKTW9kaWZpZWQgY29kZSB0byBtYWtlIHJlZ2lzdGVyIGRlZmF1 bHRzIGhvbGQgdGhlIHJlZ2lzdGVyIHZhbHVlcyBpbiB0aGUKcG93ZXItb24gcmVzZXQgc3RhdGUu CgpzdGF0aWMgY29uc3Qgc3RydWN0IHJlZ19kZWZhdWx0IG5hdTg4MjVfcmVnW10gPSB7Cgl7MHgw MDAsIDB4MDAwMH0sCgl7MHgwMDEsIDB4MDBmZn0sCgl7MHgwMDMsIDB4MDA1MH0sCgl7MHgwMDQs IDB4MDAwMH0sCgl7MHgwMDUsIDB4MzEyNn0sCgl7MHgwMDYsIDB4MDAwOH0sCgl7MHgwMDcsIDB4 MDAxMH0sCgl7MHgwMDgsIDB4MDAwMH0sCgl7MHgwMDksIDB4NjAwMH0sCgl7MHgwMGEsIDB4ZjEz Y30sCgl7MHgwMGMsIDB4MDAwY30sCgl7MHgwMGQsIDB4MDAwMH0sCgl7MHgwMGYsIDB4MDgwMH0s Cgl7MHgwMTAsIDB4MDAwMH0sCgl7MHgwMTEsIDB4MDAwMH0sCgl7MHgwMTIsIDB4MDAxMH0sCgl7 MHgwMTMsIDB4MDAxNX0sCgl7MHgwMTQsIDB4MDExMH0sCgl7MHgwMTUsIDB4MDAwMH0sCgkuLi4K Cj4gID4gKwo+IFsuLi5dCj4+ICtzdGF0aWMgc3RydWN0IHNuZF9zb2NfZGFpX2RyaXZlciBuYXU4 ODI1X2RhaV9kcml2ZXJbXSA9IHsKPj4gKwl7Cj4+ICsJCS5uYW1lID0gIm5hdTg4MjUtYWlmMSIs Cj4+ICsJCQkucGxheWJhY2sgPSB7Cj4+ICsJCQkJLnN0cmVhbV9uYW1lCSA9ICJBSUYxIFBsYXli YWNrIiwKPj4gKwkJCQkuY2hhbm5lbHNfbWluCSA9IDEsCj4+ICsJCQkJLmNoYW5uZWxzX21heAkg PSAyLAo+PiArCQkJCS5yYXRlcwkJID0gTkFVODgyNV9SQVRFUywKPj4gKwkJCQkuZm9ybWF0cwkg PSBOQVU4ODI1X0ZPUk1BVFMsCj4+ICsJCQl9LAo+PiArCQkJLmNhcHR1cmUgPSB7Cj4+ICsJCQkJ LnN0cmVhbV9uYW1lCSA9ICJBSUYxIENhcHR1cmUiLAo+PiArCQkJCS5jaGFubmVsc19taW4JID0g MSwKPj4gKwkJCQkuY2hhbm5lbHNfbWF4CSA9IDIsCj4+ICsJCQkJLnJhdGVzCQkgPSBOQVU4ODI1 X1JBVEVTLAo+PiArCQkJCS5mb3JtYXRzCSA9IE5BVTg4MjVfRk9STUFUUywKPj4gKwkJCX0sCj4g Cj4gVGhlIGluZGVudCBpcyBhIGJpdCBzdHJhbmdlIGFib3ZlLgo+IApGaXhlZCB0aGUgY29kZSBh cyBiZWxvdy4KCnN0YXRpYyBzdHJ1Y3Qgc25kX3NvY19kYWlfZHJpdmVyIG5hdTg4MjVfZGFpX2Ry aXZlcltdID0gewoJewoJCS5uYW1lID0gIm5hdTg4MjUtYWlmMSIsCgkJLnBsYXliYWNrID0gewoJ CQkuc3RyZWFtX25hbWUJID0gIkFJRjEgUGxheWJhY2siLAoJCQkuY2hhbm5lbHNfbWluCSA9IDEs CgkJCS5jaGFubmVsc19tYXgJID0gMiwKCQkJLnJhdGVzCQkgPSBOQVU4ODI1X1JBVEVTLAoJCQku Zm9ybWF0cwkgPSBOQVU4ODI1X0ZPUk1BVFMsCgkJfSwKCQkuY2FwdHVyZSA9IHsKCQkJLnN0cmVh bV9uYW1lCSA9ICJBSUYxIENhcHR1cmUiLAoJCQkuY2hhbm5lbHNfbWluCSA9IDEsCgkJCS5jaGFu bmVsc19tYXgJID0gMiwKCQkJLnJhdGVzCQkgPSBOQVU4ODI1X1JBVEVTLAoJCQkuZm9ybWF0cwkg PSBOQVU4ODI1X0ZPUk1BVFMsCgkJfSwKCQkub3BzID0gJm5hdTg4MjVfZGFpX29wcywKCX0KfTsK Cj4+ICsJCS5vcHMgPSAmbmF1ODgyNV9kYWlfb3BzLAo+PiArCX0KPj4gK307Cj4+ICsKPj4gKwo+ PiArc3RhdGljIGludCBuYXU4ODI1X2kyY19wcm9iZShzdHJ1Y3QgaTJjX2NsaWVudCAqaTJjLAo+ PiArCQkJCSBjb25zdCBzdHJ1Y3QgaTJjX2RldmljZV9pZCAqaTJjX2lkKQo+PiArewo+PiArCXN0 cnVjdCBuYXU4ODI1X3ByaXYgKm5hdTg4MjU7Cj4+ICsJaW50IGksIHJldDsKPj4gKwo+PiArCW5h dTg4MjUgPSBkZXZtX2t6YWxsb2MoJmkyYy0+ZGV2LCBzaXplb2YoKm5hdTg4MjUpLAo+PiArCQlH RlBfS0VSTkVMKTsKPj4gKwlpZiAobmF1ODgyNSA9PSBOVUxMKQo+PiArCQlyZXR1cm4gLUVOT01F TTsKPj4gKwluYXU4ODI1LT5pMmMgPSBpMmM7Cj4+ICsJaTJjX3NldF9jbGllbnRkYXRhKGkyYywg bmF1ODgyNSk7Cj4+ICsJbmF1ODgyNS0+cmVnbWFwID0gZGV2bV9yZWdtYXBfaW5pdF9pMmMoaTJj LCAmbmF1ODgyNV9yZWdtYXApOwo+PiArCWlmIChJU19FUlIobmF1ODgyNS0+cmVnbWFwKSkgewo+ PiArCQlyZXQgPSBQVFJfRVJSKG5hdTg4MjUtPnJlZ21hcCk7Cj4+ICsJCWRldl9lcnIoJmkyYy0+ ZGV2LCAiRmFpbGVkIHRvIGFsbG9jYXRlIHJlZ21hcDogJWRcbiIsIHJldCk7Cj4+ICsJCWdvdG8g ZXJyX2VuYWJsZTsKPiAKPiBTaW5jZSB0aGVyZSBpcyBub3RoaW5nIHRvIGRvIGF0IGVycl9lbmFi bGUsIGp1c3QgcmV0dXJuIHJldCBkaXJlY3RseSBhbmQgZ2V0IAo+IHJpZCBvZiB0aGUgbGFiZWwu Cj4gCk1vZGlmaWVkIHRoZSBjb2RlIGFzIGJlbG93LgoKCWkyY19zZXRfY2xpZW50ZGF0YShpMmMs IG5hdTg4MjUpOwoJbmF1ODgyNS0+cmVnbWFwID0gZGV2bV9yZWdtYXBfaW5pdF9pMmMoaTJjLCAm bmF1ODgyNV9yZWdtYXApOwoJaWYgKElTX0VSUihuYXU4ODI1LT5yZWdtYXApKSB7CgkJcmV0ID0g UFRSX0VSUihuYXU4ODI1LT5yZWdtYXApOwoJCWRldl9lcnIoJmkyYy0+ZGV2LCAiRmFpbGVkIHRv IGFsbG9jYXRlIHJlZ21hcDogJWRcbiIsIHJldCk7CgkJcmV0dXJuIHJldDsKCX0KCS8qIHNvZnR3 YXJlIHJlc2V0ICovCglyZWdtYXBfd3JpdGUobmF1ODgyNS0+cmVnbWFwLCBOQVU4ODI1X1JFU0VU LCAweDAwKTsKCXJlZ21hcF93cml0ZShuYXU4ODI1LT5yZWdtYXAsIE5BVTg4MjVfUkVTRVQsIDB4 MDApOwoKCS8qIHJlZ2lzdGVyIHNvdW5kIGNhcmQgKi8KCXJldCA9IHNuZF9zb2NfcmVnaXN0ZXJf Y29kZWMoJmkyYy0+ZGV2LCAmc29jX2NvZGVjX2RyaXZlcl9uYXU4ODI1LAoJCQkJbmF1ODgyNV9k YWlfZHJpdmVyLAoJCQkJQVJSQVlfU0laRShuYXU4ODI1X2RhaV9kcml2ZXIpKTsKCXJldHVybiBy ZXQ7Cn0KCj4+ICsJfQo+PiArCS8qIHNvZnR3YXJlIHJlc2V0ICovCj4+ICsJcmVnbWFwX3dyaXRl KG5hdTg4MjUtPnJlZ21hcCwgTkFVODgyNV9SRVNFVCwgMHgwMSk7Cj4+ICsJcmVnbWFwX3dyaXRl KG5hdTg4MjUtPnJlZ21hcCwgTkFVODgyNV9SRVNFVCwgMHgwMik7Cj4+ICsJLyp3cml0aW5nIGlu aXRpYWwgcmVnaXN0ZXIgdmFsdWVzIHRvIHRoZSBjb2RlYyovCj4+ICsJZm9yIChpID0gMDsgaSA8 IEFSUkFZX1NJWkUobmF1ODgyNV9yZWcpOyBpKyspCj4+ICsJCXJlZ21hcF93cml0ZShuYXU4ODI1 LT5yZWdtYXAsIG5hdTg4MjVfcmVnW2ldLnJlZywKPj4gKwkJbmF1ODgyNV9yZWdbaV0uZGVmKTsK Pj4gKwo+PiArCXJldCA9IHNuZF9zb2NfcmVnaXN0ZXJfY29kZWMoJmkyYy0+ZGV2LCAmc29jX2Nv ZGVjX2RyaXZlcl9uYXU4ODI1LAo+PiArCQkJCW5hdTg4MjVfZGFpX2RyaXZlciwKPj4gKwkJCQlB UlJBWV9TSVpFKG5hdTg4MjVfZGFpX2RyaXZlcikpOwo+PiArZXJyX2VuYWJsZToKPj4gKwlyZXR1 cm4gcmV0Owo+PiArfQo+PiArCj4gWy4uLl0KPj4gKyNkZWZpbmUgTkFVODgyNV9SQVRFUwlTTkRS Vl9QQ01fUkFURV84MDAwXzE5MjAwMAo+PiArI2RlZmluZSBOQVU4ODI1X0ZPUk1BVFMJKFNORFJW X1BDTV9GTVRCSVRfUzE2X0xFIHwgU05EUlZfUENNX0ZNVEJJVF9TMjBfM0xFIFwKPj4gKwkJCSB8 IFNORFJWX1BDTV9GTVRCSVRfUzI0XzNMRSB8IFNORFJWX1BDTV9GTVRCSVRfUzMyX0xFKQo+IAo+ IFRoZXNlIGRlZmluZXMgc2hvdWxkIHByb2JhYmx5IGJlIG1vdmVkIHRvIHRoZSBDIGZpbGUgY2xv c2UgdG8gdGhlaXIgdXNlcnMuCj4KTW92ZSB0aGUgZGVmaW5lcyB0byBDIGZpbGUgYXMgYmVsb3cu CgojZGVmaW5lIE5BVTg4MjVfUkFURVMJU05EUlZfUENNX1JBVEVfODAwMF8xOTIwMDAKI2RlZmlu ZSBOQVU4ODI1X0ZPUk1BVFMJKFNORFJWX1BDTV9GTVRCSVRfUzE2X0xFIHwKU05EUlZfUENNX0ZN VEJJVF9TMjBfM0xFIFwKCQkJIHwgU05EUlZfUENNX0ZNVEJJVF9TMjRfM0xFIHwgU05EUlZfUENN X0ZNVEJJVF9TMzJfTEUpCgpzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9zb2NfZGFpX29wcyBuYXU4 ODI1X2RhaV9vcHMgPSB7CgkudHJpZ2dlcgk9IG5hdTg4MjVfdHJpZ2dlciwKCS5od19wYXJhbXMJ PSBuYXU4ODI1X2h3X3BhcmFtcywKCS5zZXRfc3lzY2xrCT0gbmF1ODgyNV9kYWlfc2V0X3N5c2Ns aywKCS5zZXRfZm10CT0gbmF1ODgyNV9zZXRfZGFpX2ZtdCwKCS5kaWdpdGFsX211dGUJPSBuYXU4 ODI1X2RhY19tdXRlLAp9OwoKc3RhdGljIHN0cnVjdCBzbmRfc29jX2RhaV9kcml2ZXIgbmF1ODgy NV9kYWlfZHJpdmVyW10gPSB7Cgl7CgkJLm5hbWUgPSAibmF1ODgyNS1haWYxIiwKCj4+ICsKPj4g K3N0cnVjdCBuYXU4ODI1X3ByaXYgewo+PiArCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYzsK Pj4gKwlzdHJ1Y3QgcmVnbWFwICpyZWdtYXA7Cj4+ICsJc3RydWN0IGkyY19jbGllbnQgKmkyYzsK Pj4gKwlzdHJ1Y3Qgc25kX3NvY19qYWNrICpqYWNrOwo+PiArCXN0cnVjdCBkZWxheWVkX3dvcmsg amFja19kZXRlY3Rfd29yazsKPiAKPiBBbGwgZmllbGRzIGluIGhlcmUgZXhjZXB0IGZvciB0aGUg cmVnbWFwIGZpZWxkIGFyZSBzdGlsbCB1bnVzZWQuCj4gClJlbW92ZSBzb21lIHVudXNlZCBmaWVs ZC4gQnV0IHRoZSBpMmMgZmllbGQgaXMgdXNlZCBpbiBuYXU4ODI1X2kyY19wcm9iZSgpLgoKc3Ry dWN0IG5hdTg4MjVfcHJpdiB7CglzdHJ1Y3QgcmVnbWFwICpyZWdtYXA7CglzdHJ1Y3QgaTJjX2Ns aWVudCAqaTJjOwp9OwoKc3RhdGljIGludCBuYXU4ODI1X2kyY19wcm9iZShzdHJ1Y3QgaTJjX2Ns aWVudCAqaTJjLAoJCQkJIGNvbnN0IHN0cnVjdCBpMmNfZGV2aWNlX2lkICppMmNfaWQpCnsKCXN0 cnVjdCBuYXU4ODI1X3ByaXYgKm5hdTg4MjU7CglpbnQgcmV0OwoKCW5hdTg4MjUgPSBkZXZtX2t6 YWxsb2MoJmkyYy0+ZGV2LCBzaXplb2YoKm5hdTg4MjUpLAoJCUdGUF9LRVJORUwpOwoJaWYgKG5h dTg4MjUgPT0gTlVMTCkKCQlyZXR1cm4gLUVOT01FTTsKCW5hdTg4MjUtPmkyYyA9IGkyYzsKCWky Y19zZXRfY2xpZW50ZGF0YShpMmMsIG5hdTg4MjUpOwoJbmF1ODgyNS0+cmVnbWFwID0gZGV2bV9y ZWdtYXBfaW5pdF9pMmMoaTJjLCAmbmF1ODgyNV9yZWdtYXApOwoKPj4gK307Cj4+ICsjZW5kaWYJ LyogX05BVTg4MjVfSCAqLwo+Pgo+IApfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fXwpBbHNhLWRldmVsIG1haWxpbmcgbGlzdApBbHNhLWRldmVsQGFsc2EtcHJv amVjdC5vcmcKaHR0cDovL21haWxtYW4uYWxzYS1wcm9qZWN0Lm9yZy9tYWlsbWFuL2xpc3RpbmZv L2Fsc2EtZGV2ZWwK