From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1751937AbdFZLt5 (ORCPT ); Mon, 26 Jun 2017 07:49:57 -0400 Received: from mx08-00178001.pphosted.com ([91.207.212.93]:33324 "EHLO mx07-00178001.pphosted.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1751391AbdFZLtt (ORCPT ); Mon, 26 Jun 2017 07:49:49 -0400 From: Hugues FRUCHET To: "H. Nikolaus Schaller" CC: Sylwester Nawrocki , Guennadi Liakhovetski , Rob Herring , Mark Rutland , Maxime Coquelin , Alexandre TORGUE , Mauro Carvalho Chehab , Hans Verkuil , "devicetree@vger.kernel.org" , "linux-arm-kernel@lists.infradead.org" , "linux-kernel@vger.kernel.org" , "linux-media@vger.kernel.org" , Benjamin Gaignard , Yannick FERTRE Subject: Re: [PATCH v1 6/6] [media] ov9650: add support of OV9655 variant Thread-Topic: [PATCH v1 6/6] [media] ov9650: add support of OV9655 variant Thread-Index: AQHS7kH+TNa/EEZx4k26zr/+ZWCzLqI25mAA Date: Mon, 26 Jun 2017 11:49:07 +0000 Message-ID: References: <1498143942-12682-1-git-send-email-hugues.fruchet@st.com> <1498143942-12682-7-git-send-email-hugues.fruchet@st.com> In-Reply-To: Accept-Language: en-US Content-Language: en-US X-MS-Has-Attach: X-MS-TNEF-Correlator: user-agent: Mozilla/5.0 (X11; Linux x86_64; rv:52.0) Gecko/20100101 Thunderbird/52.1.1 x-ms-exchange-messagesentrepresentingtype: 1 x-ms-exchange-transport-fromentityheader: Hosted x-originating-ip: [10.75.127.45] Content-Type: text/plain; charset="utf-8" Content-ID: MIME-Version: 1.0 X-Proofpoint-Virus-Version: vendor=fsecure engine=2.50.10432:,, definitions=2017-06-26_09:,, signatures=0 Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Transfer-Encoding: 8bit X-MIME-Autoconverted: from base64 to 8bit by mail.home.local id v5QBo2Y2005732 On 06/26/2017 08:03 AM, H. Nikolaus Schaller wrote: > >> Am 22.06.2017 um 17:05 schrieb Hugues Fruchet : >> >> Add a first support of OV9655 variant. >> Because of register set slightly different from OV9650/9652, >> not all of the driver features are supported (controls). >> Supported resolutions are limited to VGA, QVGA, QQVGA. >> Supported format is limited to RGB565. >> Controls are limited to color bar test pattern for test purpose. >> >> Signed-off-by: H. Nikolaus Schaller >> Signed-off-by: Hugues Fruchet >> --- >> drivers/media/i2c/Kconfig | 4 +- >> drivers/media/i2c/ov9650.c | 486 ++++++++++++++++++++++++++++++++++++++++++--- >> 2 files changed, 457 insertions(+), 33 deletions(-) >> >> diff --git a/drivers/media/i2c/Kconfig b/drivers/media/i2c/Kconfig >> index efea14d..a8f638c 100644 >> --- a/drivers/media/i2c/Kconfig >> +++ b/drivers/media/i2c/Kconfig >> @@ -594,11 +594,11 @@ config VIDEO_OV7670 >> controller. >> >> config VIDEO_OV9650 >> - tristate "OmniVision OV9650/OV9652 sensor support" >> + tristate "OmniVision OV9650/OV9652/OV9655 sensor support" >> depends on GPIOLIB && I2C && VIDEO_V4L2 && VIDEO_V4L2_SUBDEV_API >> ---help--- >> This is a V4L2 sensor-level driver for the Omnivision >> - OV9650 and OV9652 camera sensors. >> + OV9650 and OV9652 and OV9655 camera sensors. >> >> config VIDEO_VS6624 >> tristate "ST VS6624 sensor support" >> diff --git a/drivers/media/i2c/ov9650.c b/drivers/media/i2c/ov9650.c >> index a9d268d..c0819af 100644 >> --- a/drivers/media/i2c/ov9650.c >> +++ b/drivers/media/i2c/ov9650.c >> @@ -1,5 +1,5 @@ >> /* >> - * Omnivision OV9650/OV9652 CMOS Image Sensor driver >> + * Omnivision OV9650/OV9652/OV9655 CMOS Image Sensor driver >> * >> * Copyright (C) 2013, Sylwester Nawrocki >> * >> @@ -7,6 +7,15 @@ >> * by Vladimir Fonov. >> * Copyright (c) 2010, Vladimir Fonov >> * >> + * >> + * Copyright (C) STMicroelectronics SA 2017 >> + * Author: Hugues Fruchet for STMicroelectronics. >> + * >> + * OV9655 initial support based on a driver written by H. Nikolaus Schaller: >> + * http://git.goldelico.com/?p=gta04-kernel.git;a=shortlog;h=refs/heads/work/hns/video/ov9655 >> + * OV9655 registers sequence from STM32CubeF7 embedded software, see: >> + * https://developer.mbed.org/teams/ST/code/BSP_DISCO_F746NG/file/e1d9da7fe856/Drivers/BSP/Components/ov9655/ov9655.c >> + * >> * This program is free software; you can redistribute it and/or modify >> * it under the terms of the GNU General Public License version 2 as >> * published by the Free Software Foundation. >> @@ -58,14 +67,21 @@ >> #define REG_PID 0x0a /* Product ID MSB */ >> #define REG_VER 0x0b /* Product ID LSB */ >> #define REG_COM3 0x0c >> -#define COM3_SWAP 0x40 >> +#define COM3_COLORBAR 0x80 >> +#define COM3_RGB565 0x00 >> +#define COM3_SWAP 0x40 /* Doesn't work in RGB */ >> +#define COM3_RESETB 0x08 >> #define COM3_VARIOPIXEL1 0x04 >> +#define OV9655_SINGLEFRAME 0x01 >> #define REG_COM4 0x0d /* Vario Pixels */ >> #define COM4_VARIOPIXEL2 0x80 >> +#define OV9655_TRISTATE /* seems to have a different function */ >> #define REG_COM5 0x0e /* System clock options */ >> #define COM5_SLAVE_MODE 0x10 >> -#define COM5_SYSTEMCLOCK48MHZ 0x80 >> +#define COM5_SYSTEMCLOCK48MHZ 0x80 /* not on OV9655 */ >> +#define OV9655_EXPOSURESTEP 0x01 >> #define REG_COM6 0x0f /* HREF & ADBLC options */ >> +#define COM6_BLC_OPTICAL 0x40 /* Optical black */ >> #define REG_AECH 0x10 /* Exposure value, AEC[9:2] */ >> #define REG_CLKRC 0x11 /* Clock control */ >> #define CLK_EXT 0x40 /* Use external clock directly */ >> @@ -74,13 +90,18 @@ >> #define COM7_RESET 0x80 >> #define COM7_FMT_MASK 0x38 >> #define COM7_FMT_VGA 0x40 >> -#define COM7_FMT_CIF 0x20 >> +#define COM7_FMT_CIF 0x20 >> #define COM7_FMT_QVGA 0x10 >> #define COM7_FMT_QCIF 0x08 >> -#define COM7_RGB 0x04 >> -#define COM7_YUV 0x00 >> -#define COM7_BAYER 0x01 >> -#define COM7_PBAYER 0x05 >> +#define COM7_RGB 0x04 >> +#define COM7_YUV 0x00 >> +#define COM7_BAYER 0x01 >> +#define COM7_PBAYER 0x05 >> +#define OV9655_COM7_VGA 0x60 >> +#define OV9655_COM7_RAWRGB 0x00 /* different format encoding */ >> +#define OV9655_COM7_RAWRGBINT 0x01 >> +#define OV9655_COM7_YUV 0x02 >> +#define OV9655_COM7_RGB 0x03 >> #define REG_COM8 0x13 /* AGC/AEC options */ >> #define COM8_FASTAEC 0x80 /* Enable fast AGC/AEC */ >> #define COM8_AECSTEP 0x40 /* Unlimited AEC step size */ >> @@ -89,14 +110,23 @@ >> #define COM8_AWB 0x02 /* White balance enable */ >> #define COM8_AEC 0x01 /* Auto exposure enable */ >> #define REG_COM9 0x14 /* Gain ceiling */ >> -#define COM9_GAIN_CEIL_MASK 0x70 /* */ >> +#define COM9_GAIN_CEIL_MASK 0x70 >> +#define COM9_GAIN_CEIL_16X 0x30 >> +#define OV9655_COM9_EXPTIMING 0x08 >> +#define OV9655_COM9_VSYNCDROP 0x04 >> +#define OV9655_COM9_AECDROP 0x02 >> #define REG_COM10 0x15 /* PCLK, HREF, HSYNC signals polarity */ >> +#define OV9655_SLAVE_PIN 0x80 /* SLHS/SLVS instead of RESETB/PWDN */ >> #define COM10_HSYNC 0x40 /* HSYNC instead of HREF */ >> #define COM10_PCLK_HB 0x20 /* Suppress PCLK on horiz blank */ >> -#define COM10_HREF_REV 0x08 /* Reverse HREF */ >> +#define OV9655_COM10_PCLK_REV 0x10 /* PCLK reverse */ >> +#define COM10_HREF_REV 0x08 /* Reverse HREF */ >> #define COM10_VS_LEAD 0x04 /* VSYNC on clock leading edge */ >> +#define OV9655_COM10_RESET_OPTION 0x04 /* Reset signal end point */ >> #define COM10_VS_NEG 0x02 /* VSYNC negative */ >> #define COM10_HS_NEG 0x01 /* HSYNC negative */ >> +#define OV9655_REG16 0x16 /* dummy frame and blanking */ >> +#define OV9655_REG16_DUMMY_8 0x20 /* dummy frame when gain > 8 */ >> #define REG_HSTART 0x17 /* Horiz start high bits */ >> #define REG_HSTOP 0x18 /* Horiz stop high bits */ >> #define REG_VSTART 0x19 /* Vert start high bits */ >> @@ -117,6 +147,7 @@ >> #define REG_BBIAS 0x27 /* B channel output bias */ >> #define REG_GBBIAS 0x28 /* Gb channel output bias */ >> #define REG_GRCOM 0x29 /* Analog BLC & regulator */ >> +#define OV9655_PREGAIN 0x29 >> #define REG_EXHCH 0x2a /* Dummy pixel insert MSB */ >> #define REG_EXHCL 0x2b /* Dummy pixel insert LSB */ >> #define REG_RBIAS 0x2c /* R channel output bias */ >> @@ -127,12 +158,30 @@ >> #define REG_HSYEN 0x31 /* HSYNC falling edge delay LSB*/ >> #define REG_HREF 0x32 /* HREF pieces */ >> #define REG_CHLF 0x33 /* reserved */ >> +#define OV9655_CLKF 0x33 /* Array current control */ >> +#define OV9655_AREF1 0x34 /* Array reference control */ >> +#define OV9655_AREF2 0x35 /* Array reference control */ >> +#define OV9655_AREF3 0x36 /* Array reference control */ >> #define REG_ADC 0x37 /* reserved */ >> +#define OV9655_ADC 0x37 /* ADC Control 1 (Range adjustment) */ >> #define REG_ACOM 0x38 /* reserved */ >> -#define REG_OFON 0x39 /* Power down register */ >> +#define OV9655_ADC2 0x38 /* ADC Control 2 (Range adjustment) */ >> +#define REG_OFON 0x39 /* Power down register (ov9650 only) */ >> #define OFON_PWRDN 0x08 /* Power down bit */ >> +#define OV9655_AREF4 0x39 /* Array reference control */ >> #define REG_TSLB 0x3a /* YUVU format */ >> +#define OV9655_PCLKDELAY2NS 0x40 >> +#define OV9655_PCLKDELAY4NS 0x80 >> +#define OV9655_PCLKDELAY6NS 0xc0 >> +#define OV9655_OUTREVERSE 0x20 >> +#define OV9655_FIXEDUV 0x10 >> #define TSLB_YUYV_MASK 0x0c /* UYVY or VYUY - see com13 */ >> +#define TSLB_YUYV 0x00 >> +#define TSLB_YVYU 0x04 >> +#define TSLB_VYUY 0x08 >> +#define TSLB_UYVY 0x0c >> +#define OV9655_BANDINGAUTO 0x02 >> + >> #define REG_COM11 0x3b /* Night mode, banding filter enable */ >> #define COM11_NIGHT 0x80 /* Night mode enable */ >> #define COM11_NMFR 0x60 /* Two bit NM frame rate */ >> @@ -142,25 +191,38 @@ >> #define COM12_HREF 0x80 /* HREF always */ >> #define REG_COM13 0x3d /* Gamma selection, Color matrix en. */ >> #define COM13_GAMMA 0x80 /* Gamma enable */ >> -#define COM13_UVSAT 0x40 /* UV saturation auto adjustment */ >> +#define COM13_UVSAT 0x40 /* UV saturation auto adjustment */ >> +#define COM13_Y_DELAY 0x08 /* Delay Y channel */ >> #define COM13_UVSWAP 0x01 /* V before U - w/TSLB */ >> #define REG_COM14 0x3e /* Edge enhancement options */ >> #define COM14_EDGE_EN 0x02 >> #define COM14_EEF_X2 0x01 >> +#define OV9655_REG_COM14 0x3e /* pixel correction/zoom ON/OFF sel. */ >> +#define OV9655_COM14_BLACK_PIX 0x08 /* Black pixel correction */ >> +#define OV9655_COM14_WHITE_PIX 0x04 /* White pixel correction */ >> +#define OV9655_COM14_ZOOM 0x02 /* Zoom function ON */ >> #define REG_EDGE 0x3f /* Edge enhancement factor */ >> #define EDGE_FACTOR_MASK 0x0f >> #define REG_COM15 0x40 /* Output range, RGB 555/565 */ >> #define COM15_R10F0 0x00 /* Data range 10 to F0 */ >> -#define COM15_R01FE 0x80 /* 01 to FE */ >> +#define COM15_R01FE 0x80 /* 01 to FE */ >> #define COM15_R00FF 0xc0 /* 00 to FF */ >> #define COM15_RGB565 0x10 /* RGB565 output */ >> #define COM15_RGB555 0x30 /* RGB555 output */ >> #define COM15_SWAPRB 0x04 /* Swap R&B */ >> #define REG_COM16 0x41 /* Color matrix coeff options */ >> #define REG_COM17 0x42 /* Single frame out, banding filter */ >> +#define OV9655_REG_COM17 0x42 /* Denoise, edge, auto gain, ... */ >> +#define OV9655_COM17_EDGE_AUTO 0x40 /* Edge auto */ >> +#define OV9655_COM17_DENOISE_AUTO 0x80 /* Denoise auto */ >> +#define OV9655_REG_RSVD(__n) (0x43 + (__n) - 1) /* reserved but used... */ >> /* n = 1...9, 0x4f..0x57 */ >> -#define REG_MTX(__n) (0x4f + (__n) - 1) >> +#define REG_MTX(__n) (0x4f + (__n) - 1) >> #define REG_MTXS 0x58 >> +#define REG_AWBOP(__n) (0x59 + (__n) - 1) /* AWB control options */ >> +#define REG_BLMT 0x5F /* AWB Blue Component Gain Limit */ >> +#define REG_RLMT 0x60 /* AWB Red Component Gain Limit */ >> +#define REG_GLMT 0x61 /* AWB Green Component Gain Limit */ >> /* Lens Correction Option 1...5, __n = 0...5 */ >> #define REG_LCC(__n) (0x62 + (__n) - 1) >> #define LCC5_LCC_ENABLE 0x01 /* LCC5, enable lens correction */ >> @@ -170,10 +232,26 @@ >> #define REG_HV 0x69 /* Manual banding filter MSB */ >> #define REG_MBD 0x6a /* Manual banding filter value */ >> #define REG_DBLV 0x6b /* reserved */ >> +#define OV9655_REG_DBLV 0x6b /* PLL, DVDD regu bypass, bandgap */ >> +#define OV9655_DBLV_BANDGAP 0x0a /* default value */ >> +#define OV9655_DBLV_LDO_BYPASS 0x10 >> +#define OV9655_DBLV_PLL_BYPASS 0x00 >> +#define OV9655_DBLV_PLL_4X 0x40 >> +#define OV9655_DBLV_PLL_6X 0x80 >> +#define OV9655_DBLV_PLL_8X 0xc0 >> #define REG_GSP 0x6c /* Gamma curve */ >> #define GSP_LEN 15 >> +#define OV9655_REG_DNSTH 0x70 /* De-noise Function Threshold Adj. */ >> +#define OV9655_REG_POIDX 0x72 /* Pixel output index */ >> +#define OV9655_REG_PCKDV 0x73 /* Pixel Clock Output Selection */ >> +#define OV9655_REG_XINDX 0x74 /* Horizontal Scaling Down Coeff. */ >> +#define OV9655_REG_YINDX 0x75 /* Vertical Scaling Down Coeff. */ >> +#define OV9655_REG_SLOP 0x7A /* Gamma Curve Highest Segment Slope */ >> +#define OV9655_REG_GAM(__n) (0x7B + (__n) - 1) /* Gamma curve */ >> #define REG_GST 0x7c /* Gamma curve */ >> #define GST_LEN 15 >> +#define OV9655_REG_COM18 0x8b /* Zoom mode in VGA */ >> +#define OV9655_REG_COM19 0x8c /* UV adjustment */ >> #define REG_COM21 0x8b >> #define REG_COM22 0x8c /* Edge enhancement, denoising */ >> #define COM22_WHTPCOR 0x02 /* White pixel correction enable */ >> @@ -181,6 +259,8 @@ >> #define COM22_DENOISE 0x10 /* White pixel correction option */ >> #define REG_COM23 0x8d /* Color bar test, color gain */ >> #define COM23_TEST_MODE 0x10 >> +#define OV9655_REG_COM20 0x8d >> +#define OV9655_COM20_TEST_MODE 0x10 >> #define REG_DBLC1 0x8f /* Digital BLC */ >> #define REG_DBLC_B 0x90 /* Digital BLC B channel offset */ >> #define REG_DBLC_R 0x91 /* Digital BLC R channel offset */ >> @@ -193,6 +273,17 @@ >> #define REG_AECHM 0xa1 /* Exposure value - bits AEC[15:10] */ >> #define REG_BD50ST 0xa2 /* Banding filter value for 50Hz */ >> #define REG_BD60ST 0xa3 /* Banding filter value for 60Hz */ >> +#define OV9655_REG_COM21 0xa4 /* Digital gain */ >> +#define OV9655_REG_AWB_GREEN 0xa6 /* AWB green */ >> +#define OV9655_REG_REF_A8 0xa8 /* Analog Reference Control */ >> +#define OV9655_REG_REF_A9 0xa9 /* Analog Reference Control */ >> +#define OV9655_REG_BLC(__n) (0xac + (__n) - 1) /* Black Level Control */ >> +#define OV9655_REG_CTRLB4 0xb4 /* UV adjustment */ >> +#define OV9655_REG_ADBOFF 0xbc /* ADC B channel offset setting */ >> +#define OV9655_REG_ADROFF 0xbd /* ADC R channel offset setting */ >> +#define OV9655_REG_ADGBOFF 0xbe /* ADC Gb channel offset setting */ >> +#define OV9655_REG_ADGEOFF 0xbf /* ADC Gr channel offset setting */ >> +#define OV9655_REG_COM24 0xc7 /* Pixel clock frequency selection */ >> #define REG_NULL 0xff /* Array end token */ >> >> #define DEF_CLKRC 0x80 >> @@ -200,6 +291,7 @@ >> #define OV965X_ID(_msb, _lsb) ((_msb) << 8 | (_lsb)) >> #define OV9650_ID 0x9650 >> #define OV9652_ID 0x9652 >> +#define OV9655V5_ID 0x9657 >> >> struct ov965x_ctrls { >> struct v4l2_ctrl_handler handler; >> @@ -458,6 +550,292 @@ struct ov965x_pixfmt { >> {{ 1, 25 }, { QVGA_WIDTH, QVGA_HEIGHT }, 1 }, /* 25 fps */ >> }; >> >> +/* OV9655 */ >> +static const struct i2c_rv ov9655_init_regs[] = { >> + { REG_GAIN, 0x00 }, >> + { REG_BLUE, 0x80 }, >> + { REG_RED, 0x80 }, >> + { REG_VREF, 0x02 }, >> + { REG_COM1, 0x03 }, >> + { REG_COM2, 0x01 },/* Output drive x2 */ >> + { REG_COM3, COM3_RGB565 },/* Output drive x2, RGB565 */ >> + { REG_COM5, 0x60 | OV9655_EXPOSURESTEP },/* 0x60 ? */ >> + { REG_COM6, COM6_BLC_OPTICAL }, >> + { REG_CLKRC, 0x01 },/* F(internal clk) = F(input clk) / 2 */ >> + { REG_COM7, OV9655_COM7_VGA | OV9655_COM7_YUV }, >> + { REG_COM8, COM8_FASTAEC | COM8_AECSTEP | >> + COM8_AGC | COM8_AWB | COM8_AEC }, >> + { REG_COM9, COM9_GAIN_CEIL_16X | OV9655_COM9_EXPTIMING | >> + OV9655_COM9_AECDROP }, >> + { OV9655_REG16, OV9655_REG16_DUMMY_8 | 0x4 }, >> + { REG_HSTART, 0x18 }, >> + { REG_HSTOP, 0x04 }, >> + { REG_VSTART, 0x01 }, >> + { REG_VSTOP, 0x81 }, >> + { REG_MVFP, 0x00 },/* No mirror/flip */ >> + { REG_AEW, 0x3c }, >> + { REG_AEB, 0x36 }, >> + { REG_VPT, 0x72 }, >> + { REG_BBIAS, 0x08 }, >> + { REG_GBBIAS, 0x08 }, >> + { OV9655_PREGAIN, 0x15 }, >> + { REG_EXHCH, 0x00 }, >> + { REG_EXHCL, 0x00 }, >> + { REG_RBIAS, 0x08 }, >> + { REG_HREF, 0x12 },/* QVGA */ >> + { REG_CHLF, 0x00 }, >> + { OV9655_AREF1, 0x3f }, >> + { OV9655_AREF2, 0x00 }, >> + { OV9655_AREF3, 0x3a }, >> + { OV9655_ADC2, 0x72 }, >> + { OV9655_AREF4, 0x57 }, >> + { REG_TSLB, OV9655_PCLKDELAY6NS | TSLB_UYVY }, >> + { REG_COM11, 0x04 },/* 0x04 ? */ >> + { REG_COM13, COM13_GAMMA | 0x10 | >> + COM13_Y_DELAY | COM13_UVSWAP },/* 0x10 ? */ >> + {OV9655_REG_COM14, OV9655_COM14_ZOOM }, /* QVGA */ >> + { REG_EDGE, 0xc1 }, >> + { REG_COM15, COM15_R00FF },/* Full range output */ >> + { REG_COM16, 0x41 },/* 0x41 ? */ >> + { OV9655_REG_COM17, OV9655_COM17_EDGE_AUTO | >> + OV9655_COM17_DENOISE_AUTO }, >> + { OV9655_REG_RSVD(1), 0x0a }, >> + { OV9655_REG_RSVD(2), 0xf0 }, >> + { OV9655_REG_RSVD(3), 0x46 }, >> + { OV9655_REG_RSVD(4), 0x62 }, >> + { OV9655_REG_RSVD(5), 0x2a }, >> + { OV9655_REG_RSVD(6), 0x3c }, >> + { OV9655_REG_RSVD(7), 0xfc }, >> + { OV9655_REG_RSVD(8), 0xfc }, >> + { OV9655_REG_RSVD(9), 0x7f }, >> + { OV9655_REG_RSVD(10), 0x7f }, >> + { OV9655_REG_RSVD(11), 0x7f }, >> + { REG_MTX(1), 0x98 }, >> + { REG_MTX(2), 0x98 }, >> + { REG_MTX(3), 0x00 }, >> + { REG_MTX(4), 0x28 }, >> + { REG_MTX(5), 0x70 }, >> + { REG_MTX(6), 0x98 }, >> + { REG_MTXS, 0x1a }, >> + { REG_AWBOP(1), 0x85 }, >> + { REG_AWBOP(2), 0xa9 }, >> + { REG_AWBOP(3), 0x64 }, >> + { REG_AWBOP(4), 0x84 }, >> + { REG_AWBOP(5), 0x53 }, >> + { REG_AWBOP(6), 0x0e }, >> + { REG_BLMT, 0xf0 }, >> + { REG_RLMT, 0xf0 }, >> + { REG_GLMT, 0xf0 }, >> + { REG_LCC(1), 0x00 }, >> + { REG_LCC(2), 0x00 }, >> + { REG_LCC(3), 0x02 }, >> + { REG_LCC(4), 0x20 }, >> + { REG_LCC(5), 0x00 }, >> + { 0x69, 0x0a },/* Reserved... */ >> + { OV9655_REG_DBLV, OV9655_DBLV_PLL_4X | OV9655_DBLV_LDO_BYPASS | >> + OV9655_DBLV_BANDGAP }, >> + { 0x6c, 0x04 },/* Reserved... */ >> + { 0x6d, 0x55 },/* Reserved... */ >> + { 0x6e, 0x00 },/* Reserved... */ >> + { 0x6f, 0x9d },/* Reserved... */ >> + { OV9655_REG_DNSTH, 0x21 }, >> + { 0x71, 0x78 },/* Reserved... */ >> + { OV9655_REG_POIDX, 0x11 },/* QVGA */ >> + { OV9655_REG_PCKDV, 0x01 },/* QVGA */ >> + { OV9655_REG_XINDX, 0x10 }, >> + { OV9655_REG_YINDX, 0x10 }, >> + { 0x76, 0x01 },/* Reserved... */ >> + { 0x77, 0x02 },/* Reserved... */ >> + { 0x7A, 0x12 },/* Reserved... */ >> + { OV9655_REG_GAM(1), 0x08 }, >> + { OV9655_REG_GAM(2), 0x16 }, >> + { OV9655_REG_GAM(3), 0x30 }, >> + { OV9655_REG_GAM(4), 0x5e }, >> + { OV9655_REG_GAM(5), 0x72 }, >> + { OV9655_REG_GAM(6), 0x82 }, >> + { OV9655_REG_GAM(7), 0x8e }, >> + { OV9655_REG_GAM(8), 0x9a }, >> + { OV9655_REG_GAM(9), 0xa4 }, >> + { OV9655_REG_GAM(10), 0xac }, >> + { OV9655_REG_GAM(11), 0xb8 }, >> + { OV9655_REG_GAM(12), 0xc3 }, >> + { OV9655_REG_GAM(13), 0xd6 }, >> + { OV9655_REG_GAM(14), 0xe6 }, >> + { OV9655_REG_GAM(15), 0xf2 }, >> + { 0x8a, 0x24 },/* Reserved... */ >> + { OV9655_REG_COM19, 0x80 }, >> + { 0x90, 0x7d },/* Reserved... */ >> + { 0x91, 0x7b },/* Reserved... */ >> + { REG_LCCFB, 0x02 }, >> + { REG_LCCFR, 0x02 }, >> + { REG_DBLC_GB, 0x7a }, >> + { REG_DBLC_GR, 0x79 }, >> + { REG_AECHM, 0x40 }, >> + { OV9655_REG_COM21, 0x50 }, >> + { 0xa5, 0x68 },/* Reserved... */ >> + { OV9655_REG_AWB_GREEN, 0x4a }, >> + { OV9655_REG_REF_A8, 0xc1 }, >> + { OV9655_REG_REF_A9, 0xef }, >> + { 0xaa, 0x92 },/* Reserved... */ >> + { 0xab, 0x04 },/* Reserved... */ >> + { OV9655_REG_BLC(1), 0x80 }, >> + { OV9655_REG_BLC(2), 0x80 }, >> + { OV9655_REG_BLC(3), 0x80 }, >> + { OV9655_REG_BLC(4), 0x80 }, >> + { OV9655_REG_BLC(7), 0xf2 }, >> + { OV9655_REG_BLC(8), 0x20 }, >> + { OV9655_REG_CTRLB4, 0x20 }, >> + { 0xb5, 0x00 },/* Reserved... */ >> + { 0xb6, 0xaf },/* Reserved... */ >> + { 0xb6, 0xaf },/* Reserved... */ >> + { 0xbb, 0xae },/* Reserved... */ >> + { OV9655_REG_ADBOFF, 0x7f }, >> + { OV9655_REG_ADROFF, 0x7f }, >> + { OV9655_REG_ADGBOFF, 0x7f }, >> + { OV9655_REG_ADGEOFF, 0x7f }, >> + { OV9655_REG_ADGEOFF, 0x7f }, >> + { 0xc0, 0xaa },/* Reserved... */ >> + { 0xc1, 0xc0 },/* Reserved... */ >> + { 0xc2, 0x01 },/* Reserved... */ >> + { 0xc3, 0x4e },/* Reserved... */ >> + { 0xc6, 0x05 },/* Reserved... */ >> + { OV9655_REG_COM24, 0x81 },/* QVGA */ >> + { 0xc9, 0xe0 },/* Reserved... */ >> + { 0xca, 0xe8 },/* Reserved... */ >> + { 0xcb, 0xf0 },/* Reserved... */ >> + { 0xcc, 0xd8 },/* Reserved... */ >> + { 0xcd, 0x93 },/* Reserved... */ >> + { REG_COM7, OV9655_COM7_VGA | OV9655_COM7_RGB }, >> + { REG_COM15, COM15_RGB565 }, >> + { REG_NULL, 0} >> +}; >> + >> +static const struct i2c_rv ov9655_qvga_regs[] = { >> + { REG_HREF, 0x12 }, >> + { OV9655_REG_COM14, OV9655_COM14_ZOOM }, >> + { OV9655_REG_POIDX, 0x11 }, >> + { OV9655_REG_PCKDV, 0x01 }, >> + { OV9655_REG_COM24, 0x81 }, >> + { REG_NULL, 0} >> +}; >> + >> +static const struct i2c_rv ov9655_qqvga_regs[] = { >> + { REG_HREF, 0xa4 }, >> + { REG_COM14, OV9655_COM14_BLACK_PIX | OV9655_COM14_WHITE_PIX | >> + OV9655_COM14_ZOOM }, >> + { OV9655_REG_POIDX, 0x22 }, >> + { OV9655_REG_PCKDV, 0x02 }, >> + { OV9655_REG_COM24, 0x82 }, >> + { REG_NULL, 0} >> +}; >> + >> +static const struct i2c_rv ov9655_vga_regs[] = { >> + { REG_GAIN, 0x11 }, >> + { REG_VREF, 0x12 }, >> + { REG_B_AVE, 0x2e }, >> + { REG_GB_AVE, 0x2e }, >> + { REG_GR_AVE, 0x2e }, >> + { REG_R_AVE, 0x2e }, >> + { REG_COM6, 0x48 }, >> + { REG_AECH, 0x7b }, >> + { REG_CLKRC, 0x03 }, >> + { REG_COM8, COM8_FASTAEC | COM8_AECSTEP | COM8_BFILT | >> + COM8_AGC | COM8_AWB | COM8_AEC }, >> + { REG_HSTART, 0x16 }, >> + { REG_HSTOP, 0x02 }, >> + { REG_VSTART, 0x01 }, >> + { REG_VSTOP, 0x3d }, >> + { REG_MVFP, 0x04 }, >> + { REG_YAVE, 0x2e }, >> + { REG_HREF, 0xff }, >> + { OV9655_AREF1, 0x3d }, >> + { OV9655_AREF3, 0xfa }, >> + { REG_TSLB, 0xcc }, >> + { REG_COM11, 0xcc }, >> + { REG_COM14, 0x0c }, >> + { REG_EDGE, 0x82 }, >> + { REG_COM15, COM15_R00FF | COM15_RGB565 },/* full range */ >> + { REG_COM16, 0x40 }, >> + { OV9655_REG_RSVD(1), 0x14 }, >> + { OV9655_REG_RSVD(2), 0xf0 }, >> + { OV9655_REG_RSVD(3), 0x46 }, >> + { OV9655_REG_RSVD(4), 0x62 }, >> + { OV9655_REG_RSVD(5), 0x2a }, >> + { OV9655_REG_RSVD(6), 0x3c }, >> + { OV9655_REG_RSVD(8), 0xe9 }, >> + { OV9655_REG_RSVD(9), 0xdd }, >> + { OV9655_REG_RSVD(10), 0xdd }, >> + { OV9655_REG_RSVD(11), 0xdd }, >> + { OV9655_REG_RSVD(12), 0xdd }, >> + { REG_LCC(1), 0x00 }, >> + { REG_LCC(2), 0x00 }, >> + { REG_LCC(3), 0x02 }, >> + { REG_LCC(4), 0x20 }, >> + { REG_LCC(5), 0x01 }, >> + { REG_GSP, 0x0c }, >> + { 0x6f, 0x9e },/* Reserved... */ >> + { OV9655_REG_DNSTH, 0x06 }, >> + { OV9655_REG_POIDX, 0x00 }, >> + { OV9655_REG_PCKDV, 0x00 }, >> + { OV9655_REG_XINDX, 0x3a }, >> + { OV9655_REG_YINDX, 0x35 }, >> + { OV9655_REG_SLOP, 0x20 }, >> + { OV9655_REG_GAM(1), 0x1c }, >> + { OV9655_REG_GAM(2), 0x28 }, >> + { OV9655_REG_GAM(3), 0x3c }, >> + { OV9655_REG_GAM(4), 0x5a }, >> + { OV9655_REG_GAM(5), 0x68 }, >> + { OV9655_REG_GAM(6), 0x76 }, >> + { OV9655_REG_GAM(7), 0x80 }, >> + { OV9655_REG_GAM(8), 0x88 }, >> + { OV9655_REG_GAM(9), 0x8f }, >> + { OV9655_REG_GAM(10), 0x96 }, >> + { OV9655_REG_GAM(11), 0xa3 }, >> + { OV9655_REG_GAM(12), 0xaf }, >> + { OV9655_REG_GAM(13), 0xc4 }, >> + { OV9655_REG_GAM(14), 0xd7 }, >> + { OV9655_REG_GAM(15), 0xe8 }, >> + { 0x8a, 0x23 },/* Reserved... */ >> + { OV9655_REG_COM19, 0x8d }, >> + { 0x90, 0x92 },/* Reserved... */ >> + { 0x91, 0x92 },/* Reserved... */ >> + { REG_DBLC_GB, 0x90 }, >> + { REG_DBLC_GR, 0x90 }, >> + { OV9655_REG_AWB_GREEN, 0x40 }, >> + { OV9655_REG_ADBOFF, 0x02 }, >> + { OV9655_REG_ADROFF, 0x01 }, >> + { OV9655_REG_ADGBOFF, 0x02 }, >> + { OV9655_REG_ADGEOFF, 0x01 }, >> + { 0xc1, 0xc8 },/* Reserved... */ >> + { 0xc6, 0x85 },/* Reserved... */ >> + { OV9655_REG_COM24, 0x80 }, >> + { REG_NULL, 0} >> +}; >> + >> +static const struct ov965x_framesize ov9655_framesizes[] = { >> + { >> + .width = VGA_WIDTH, >> + .height = VGA_HEIGHT, >> + .regs = ov9655_vga_regs, >> + .max_exp_lines = 498, >> + }, { >> + .width = QVGA_WIDTH, >> + .height = QVGA_HEIGHT, >> + .regs = ov9655_qvga_regs, >> + .max_exp_lines = 248, >> + }, >> + { >> + .width = QQVGA_WIDTH, >> + .height = QQVGA_HEIGHT, >> + .regs = ov9655_qqvga_regs, >> + .max_exp_lines = 124, >> + }, >> +}; >> + >> +static const struct ov965x_pixfmt ov9655_formats[] = { >> + { MEDIA_BUS_FMT_RGB565_2X8_LE, V4L2_COLORSPACE_SRGB, 0x08}, >> +}; >> + >> static inline struct v4l2_subdev *ctrl_to_sd(struct v4l2_ctrl *ctrl) >> { >> return &container_of(ctrl->handler, struct ov965x, ctrls.handler)->sd; >> @@ -894,12 +1272,16 @@ static int ov965x_set_test_pattern(struct ov965x *ov965x, int value) >> { >> int ret; >> u8 reg; >> + u8 addr = (ov965x->id == OV9655V5_ID) ? >> + REG_COM3 : REG_COM23; >> + u8 mask = (ov965x->id == OV9655V5_ID) ? >> + COM3_COLORBAR : COM23_TEST_MODE; >> >> - ret = ov965x_read(ov965x->client, REG_COM23, ®); >> + ret = ov965x_read(ov965x->client, addr, ®); >> if (ret < 0) >> return ret; >> - reg = value ? reg | COM23_TEST_MODE : reg & ~COM23_TEST_MODE; >> - return ov965x_write(ov965x->client, REG_COM23, reg); >> + reg = value ? reg | mask : reg & ~mask; >> + return ov965x_write(ov965x->client, addr, reg); >> } >> >> static int __g_volatile_ctrl(struct ov965x *ov965x, struct v4l2_ctrl *ctrl) >> @@ -1102,6 +1484,30 @@ static int ov965x_initialize_controls(struct ov965x *ov965x) >> return 0; >> } >> >> +static int ov9655_initialize_controls(struct ov965x *ov965x) >> +{ >> + const struct v4l2_ctrl_ops *ops = &ov965x_ctrl_ops; >> + struct ov965x_ctrls *ctrls = &ov965x->ctrls; >> + struct v4l2_ctrl_handler *hdl = &ctrls->handler; >> + int ret; >> + >> + ret = v4l2_ctrl_handler_init(hdl, 16); >> + if (ret < 0) >> + return ret; >> + >> + v4l2_ctrl_new_std_menu_items(hdl, ops, V4L2_CID_TEST_PATTERN, >> + ARRAY_SIZE(test_pattern_menu) - 1, 0, 0, >> + test_pattern_menu); >> + if (hdl->error) { >> + ret = hdl->error; >> + v4l2_ctrl_handler_free(hdl); >> + return ret; >> + } >> + >> + ov965x->sd.ctrl_handler = hdl; >> + return 0; >> +} >> + >> /* >> * V4L2 subdev video and pad level operations >> */ >> @@ -1518,9 +1924,15 @@ static int ov965x_detect_sensor(struct v4l2_subdev *sd) >> >> if (!ret) { >> ov965x->id = OV965X_ID(pid, ver); >> - if (ov965x->id == OV9650_ID || ov965x->id == OV9652_ID) { >> + switch (ov965x->id) { >> + case OV9650_ID: >> + case OV9652_ID: >> v4l2_info(sd, "Found OV%04X sensor\n", ov965x->id); >> - } else { >> + break; >> + case OV9655V5_ID: >> + v4l2_info(sd, "Found OV%04X sensor\n", ov965x->id - 2); >> + break; >> + default: >> v4l2_err(sd, "Sensor detection failed (%04X, %d)\n", >> ov965x->id, ret); >> ret = -ENODEV; >> @@ -1598,18 +2010,28 @@ static int ov965x_probe(struct i2c_client *client, >> if (ret < 0) >> goto err_me; >> >> - ov965x->init_regs = ov965x_init_regs; >> - ov965x->initialize_controls = ov965x_initialize_controls; >> - ov965x->framesizes = ov965x_framesizes; >> - ov965x->nb_of_framesizes = ARRAY_SIZE(ov965x_framesizes); >> - ov965x->formats = ov965x_formats; >> - ov965x->nb_of_formats = ARRAY_SIZE(ov965x_formats); >> - ov965x->intervals = ov965x_intervals; >> - ov965x->nb_of_intervals = ARRAY_SIZE(ov965x_intervals); >> - ov965x->fiv = &ov965x_intervals[0]; >> - ov965x->set_frame_interval = __ov965x_set_frame_interval; >> - ov965x->update_exposure_ctrl = ov965x_update_exposure_ctrl; >> - ov965x->set_params = __ov965x_set_params; >> + if (ov965x->id != OV9655V5_ID) { >> + ov965x->init_regs = ov965x_init_regs; >> + ov965x->initialize_controls = ov965x_initialize_controls; >> + ov965x->framesizes = ov965x_framesizes; >> + ov965x->nb_of_framesizes = ARRAY_SIZE(ov965x_framesizes); >> + ov965x->formats = ov965x_formats; >> + ov965x->nb_of_formats = ARRAY_SIZE(ov965x_formats); >> + ov965x->intervals = ov965x_intervals; >> + ov965x->nb_of_intervals = ARRAY_SIZE(ov965x_intervals); >> + ov965x->fiv = &ov965x_intervals[0]; >> + ov965x->set_frame_interval = __ov965x_set_frame_interval; >> + ov965x->update_exposure_ctrl = ov965x_update_exposure_ctrl; >> + ov965x->set_params = __ov965x_set_params; >> + } else { >> + ov965x->init_regs = ov9655_init_regs; >> + ov965x->initialize_controls = ov9655_initialize_controls; >> + ov965x->framesizes = ov9655_framesizes; >> + ov965x->nb_of_framesizes = ARRAY_SIZE(ov9655_framesizes); >> + ov965x->formats = ov9655_formats; >> + ov965x->nb_of_formats = ARRAY_SIZE(ov9655_formats); >> + ov965x->set_params = ov965x_set_frame_size; >> + }; >> >> ov965x->frame_size = &ov965x->framesizes[0]; >> ov965x_get_default_format(ov965x, &ov965x->format); >> @@ -1652,6 +2074,7 @@ static int ov965x_remove(struct i2c_client *client) >> static const struct i2c_device_id ov965x_id[] = { >> { "OV9650", 0x9650 }, >> { "OV9652", 0x9652 }, >> + { "OV9655", 0x9655 }, > > i2c device ids should be lower case to match compatible-strings in DT for > automatic modprobing. > > Please pick/merge/copy&paste > > > > With this change I get: > > root@letux:~# dmesg|fgrep ov96 > [ 12.727600] ov965x: Found OV9655 sensor > [ 12.747711] ov965x 1-0030: ov965x driver probed > root@letux:~# > > during probe. > Thanks for patch, I'll fix in v2 ! >> { /* sentinel */ } >> }; >> MODULE_DEVICE_TABLE(i2c, ov965x_id); >> @@ -1659,6 +2082,7 @@ static int ov965x_remove(struct i2c_client *client) >> static const struct of_device_id ov965x_of_match[] = { >> { .compatible = "ovti,ov9650", .data = (void *)0x9650 }, >> { .compatible = "ovti,ov9652", .data = (void *)0x9652 }, >> + { .compatible = "ovti,ov9655", .data = (void *)0x9655 }, >> { /* sentinel */ } >> }; >> MODULE_DEVICE_TABLE(of, ov965x_of_match); >> -- >> 1.9.1 >> > From mboxrd@z Thu Jan 1 00:00:00 1970 From: Hugues FRUCHET Subject: Re: [PATCH v1 6/6] [media] ov9650: add support of OV9655 variant Date: Mon, 26 Jun 2017 11:49:07 +0000 Message-ID: References: <1498143942-12682-1-git-send-email-hugues.fruchet@st.com> <1498143942-12682-7-git-send-email-hugues.fruchet@st.com> Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Return-path: In-Reply-To: Content-Language: en-US Content-ID: Sender: devicetree-owner-u79uwXL29TY76Z2rM5mHXA@public.gmane.org To: "H. Nikolaus Schaller" Cc: Sylwester Nawrocki , Guennadi Liakhovetski , Rob Herring , Mark Rutland , Maxime Coquelin , Alexandre TORGUE , Mauro Carvalho Chehab , Hans Verkuil , "devicetree-u79uwXL29TY76Z2rM5mHXA@public.gmane.org" , "linux-arm-kernel-IAPFreCvJWM7uuMidbF8XUB+6BGkLq7r@public.gmane.org" , "linux-kernel-u79uwXL29TY76Z2rM5mHXA@public.gmane.org" , "linux-media-u79uwXL29TY76Z2rM5mHXA@public.gmane.org" , Benjamin Gaignard , Yannick FERTRE List-Id: devicetree@vger.kernel.org DQoNCk9uIDA2LzI2LzIwMTcgMDg6MDMgQU0sIEguIE5pa29sYXVzIFNjaGFsbGVyIHdyb3RlOg0K PiANCj4+IEFtIDIyLjA2LjIwMTcgdW0gMTc6MDUgc2NocmllYiBIdWd1ZXMgRnJ1Y2hldCA8aHVn dWVzLmZydWNoZXRAc3QuY29tPjoNCj4+DQo+PiBBZGQgYSBmaXJzdCBzdXBwb3J0IG9mIE9WOTY1 NSB2YXJpYW50Lg0KPj4gQmVjYXVzZSBvZiByZWdpc3RlciBzZXQgc2xpZ2h0bHkgZGlmZmVyZW50 IGZyb20gT1Y5NjUwLzk2NTIsDQo+PiBub3QgYWxsIG9mIHRoZSBkcml2ZXIgZmVhdHVyZXMgYXJl IHN1cHBvcnRlZCAoY29udHJvbHMpLg0KPj4gU3VwcG9ydGVkIHJlc29sdXRpb25zIGFyZSBsaW1p dGVkIHRvIFZHQSwgUVZHQSwgUVFWR0EuDQo+PiBTdXBwb3J0ZWQgZm9ybWF0IGlzIGxpbWl0ZWQg dG8gUkdCNTY1Lg0KPj4gQ29udHJvbHMgYXJlIGxpbWl0ZWQgdG8gY29sb3IgYmFyIHRlc3QgcGF0 dGVybiBmb3IgdGVzdCBwdXJwb3NlLg0KPj4NCj4+IFNpZ25lZC1vZmYtYnk6IEguIE5pa29sYXVz IFNjaGFsbGVyIDxobnNAZ29sZGVsaWNvLmNvbT4NCj4+IFNpZ25lZC1vZmYtYnk6IEh1Z3VlcyBG cnVjaGV0IDxodWd1ZXMuZnJ1Y2hldEBzdC5jb20+DQo+PiAtLS0NCj4+IGRyaXZlcnMvbWVkaWEv aTJjL0tjb25maWcgIHwgICA0ICstDQo+PiBkcml2ZXJzL21lZGlhL2kyYy9vdjk2NTAuYyB8IDQ4 NiArKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKystLS0NCj4+IDIgZmls ZXMgY2hhbmdlZCwgNDU3IGluc2VydGlvbnMoKyksIDMzIGRlbGV0aW9ucygtKQ0KPj4NCj4+IGRp ZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2kyYy9LY29uZmlnIGIvZHJpdmVycy9tZWRpYS9pMmMv S2NvbmZpZw0KPj4gaW5kZXggZWZlYTE0ZC4uYThmNjM4YyAxMDA2NDQNCj4+IC0tLSBhL2RyaXZl cnMvbWVkaWEvaTJjL0tjb25maWcNCj4+ICsrKyBiL2RyaXZlcnMvbWVkaWEvaTJjL0tjb25maWcN Cj4+IEBAIC01OTQsMTEgKzU5NCwxMSBAQCBjb25maWcgVklERU9fT1Y3NjcwDQo+PiAJICBjb250 cm9sbGVyLg0KPj4NCj4+IGNvbmZpZyBWSURFT19PVjk2NTANCj4+IC0JdHJpc3RhdGUgIk9tbmlW aXNpb24gT1Y5NjUwL09WOTY1MiBzZW5zb3Igc3VwcG9ydCINCj4+ICsJdHJpc3RhdGUgIk9tbmlW aXNpb24gT1Y5NjUwL09WOTY1Mi9PVjk2NTUgc2Vuc29yIHN1cHBvcnQiDQo+PiAJZGVwZW5kcyBv biBHUElPTElCICYmIEkyQyAmJiBWSURFT19WNEwyICYmIFZJREVPX1Y0TDJfU1VCREVWX0FQSQ0K Pj4gCS0tLWhlbHAtLS0NCj4+IAkgIFRoaXMgaXMgYSBWNEwyIHNlbnNvci1sZXZlbCBkcml2ZXIg Zm9yIHRoZSBPbW5pdmlzaW9uDQo+PiAtCSAgT1Y5NjUwIGFuZCBPVjk2NTIgY2FtZXJhIHNlbnNv cnMuDQo+PiArCSAgT1Y5NjUwIGFuZCBPVjk2NTIgYW5kIE9WOTY1NSBjYW1lcmEgc2Vuc29ycy4N Cj4+DQo+PiBjb25maWcgVklERU9fVlM2NjI0DQo+PiAJdHJpc3RhdGUgIlNUIFZTNjYyNCBzZW5z b3Igc3VwcG9ydCINCj4+IGRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2kyYy9vdjk2NTAuYyBi L2RyaXZlcnMvbWVkaWEvaTJjL292OTY1MC5jDQo+PiBpbmRleCBhOWQyNjhkLi5jMDgxOWFmIDEw MDY0NA0KPj4gLS0tIGEvZHJpdmVycy9tZWRpYS9pMmMvb3Y5NjUwLmMNCj4+ICsrKyBiL2RyaXZl cnMvbWVkaWEvaTJjL292OTY1MC5jDQo+PiBAQCAtMSw1ICsxLDUgQEANCj4+IC8qDQo+PiAtICog T21uaXZpc2lvbiBPVjk2NTAvT1Y5NjUyIENNT1MgSW1hZ2UgU2Vuc29yIGRyaXZlcg0KPj4gKyAq IE9tbml2aXNpb24gT1Y5NjUwL09WOTY1Mi9PVjk2NTUgQ01PUyBJbWFnZSBTZW5zb3IgZHJpdmVy DQo+PiAgICoNCj4+ICAgKiBDb3B5cmlnaHQgKEMpIDIwMTMsIFN5bHdlc3RlciBOYXdyb2NraSA8 c3lsdmVzdGVyLm5hd3JvY2tpQGdtYWlsLmNvbT4NCj4+ICAgKg0KPj4gQEAgLTcsNiArNywxNSBA QA0KPj4gICAqIGJ5IFZsYWRpbWlyIEZvbm92Lg0KPj4gICAqIENvcHlyaWdodCAoYykgMjAxMCwg VmxhZGltaXIgRm9ub3YNCj4+ICAgKg0KPj4gKyAqDQo+PiArICogQ29weXJpZ2h0IChDKSBTVE1p Y3JvZWxlY3Ryb25pY3MgU0EgMjAxNw0KPj4gKyAqIEF1dGhvcjogSHVndWVzIEZydWNoZXQgPGh1 Z3Vlcy5mcnVjaGV0QHN0LmNvbT4gZm9yIFNUTWljcm9lbGVjdHJvbmljcy4NCj4+ICsgKg0KPj4g KyAqIE9WOTY1NSBpbml0aWFsIHN1cHBvcnQgYmFzZWQgb24gYSBkcml2ZXIgd3JpdHRlbiBieSBI LiBOaWtvbGF1cyBTY2hhbGxlcjoNCj4+ICsgKiAgIGh0dHA6Ly9naXQuZ29sZGVsaWNvLmNvbS8/ cD1ndGEwNC1rZXJuZWwuZ2l0O2E9c2hvcnRsb2c7aD1yZWZzL2hlYWRzL3dvcmsvaG5zL3ZpZGVv L292OTY1NQ0KPj4gKyAqIE9WOTY1NSByZWdpc3RlcnMgc2VxdWVuY2UgZnJvbSBTVE0zMkN1YmVG NyBlbWJlZGRlZCBzb2Z0d2FyZSwgc2VlOg0KPj4gKyAqICAgaHR0cHM6Ly9kZXZlbG9wZXIubWJl ZC5vcmcvdGVhbXMvU1QvY29kZS9CU1BfRElTQ09fRjc0Nk5HL2ZpbGUvZTFkOWRhN2ZlODU2L0Ry aXZlcnMvQlNQL0NvbXBvbmVudHMvb3Y5NjU1L292OTY1NS5jDQo+PiArICoNCj4+ICAgKiBUaGlz IHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29y IG1vZGlmeQ0KPj4gICAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVi bGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzDQo+PiAgICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNv ZnR3YXJlIEZvdW5kYXRpb24uDQo+PiBAQCAtNTgsMTQgKzY3LDIxIEBADQo+PiAjZGVmaW5lIFJF R19QSUQJCQkweDBhCS8qIFByb2R1Y3QgSUQgTVNCICovDQo+PiAjZGVmaW5lIFJFR19WRVIJCQkw eDBiCS8qIFByb2R1Y3QgSUQgTFNCICovDQo+PiAjZGVmaW5lIFJFR19DT00zCQkweDBjDQo+PiAt I2RlZmluZSAgQ09NM19TV0FQCQkweDQwDQo+PiArI2RlZmluZSAgQ09NM19DT0xPUkJBUgkJMHg4 MA0KPj4gKyNkZWZpbmUgIENPTTNfUkdCNTY1CQkweDAwDQo+PiArI2RlZmluZSAgQ09NM19TV0FQ CQkweDQwCS8qIERvZXNuJ3Qgd29yayBpbiBSR0IgKi8NCj4+ICsjZGVmaW5lICBDT00zX1JFU0VU QgkJMHgwOA0KPj4gI2RlZmluZSAgQ09NM19WQVJJT1BJWEVMMQkweDA0DQo+PiArI2RlZmluZSAg T1Y5NjU1X1NJTkdMRUZSQU1FCTB4MDENCj4+ICNkZWZpbmUgUkVHX0NPTTQJCTB4MGQJLyogVmFy aW8gUGl4ZWxzICAqLw0KPj4gI2RlZmluZSAgQ09NNF9WQVJJT1BJWEVMMgkweDgwDQo+PiArI2Rl ZmluZSAgT1Y5NjU1X1RSSVNUQVRFCQkvKiBzZWVtcyB0byBoYXZlIGEgZGlmZmVyZW50IGZ1bmN0 aW9uICovDQo+PiAjZGVmaW5lIFJFR19DT001CQkweDBlCS8qIFN5c3RlbSBjbG9jayBvcHRpb25z ICovDQo+PiAjZGVmaW5lICBDT001X1NMQVZFX01PREUJMHgxMA0KPj4gLSNkZWZpbmUgIENPTTVf U1lTVEVNQ0xPQ0s0OE1IWgkweDgwDQo+PiArI2RlZmluZSAgQ09NNV9TWVNURU1DTE9DSzQ4TUha CTB4ODAJLyogbm90IG9uIE9WOTY1NSAqLw0KPj4gKyNkZWZpbmUgIE9WOTY1NV9FWFBPU1VSRVNU RVAJMHgwMQ0KPj4gI2RlZmluZSBSRUdfQ09NNgkJMHgwZgkvKiBIUkVGICYgQURCTEMgb3B0aW9u cyAqLw0KPj4gKyNkZWZpbmUgIENPTTZfQkxDX09QVElDQUwJMHg0MAkvKiBPcHRpY2FsIGJsYWNr ICovDQo+PiAjZGVmaW5lIFJFR19BRUNICQkweDEwCS8qIEV4cG9zdXJlIHZhbHVlLCBBRUNbOToy XSAqLw0KPj4gI2RlZmluZSBSRUdfQ0xLUkMJCTB4MTEJLyogQ2xvY2sgY29udHJvbCAqLw0KPj4g I2RlZmluZSAgQ0xLX0VYVAkJMHg0MAkvKiBVc2UgZXh0ZXJuYWwgY2xvY2sgZGlyZWN0bHkgKi8N Cj4+IEBAIC03NCwxMyArOTAsMTggQEANCj4+ICNkZWZpbmUgIENPTTdfUkVTRVQJCTB4ODANCj4+ ICNkZWZpbmUgIENPTTdfRk1UX01BU0sJCTB4MzgNCj4+ICNkZWZpbmUgIENPTTdfRk1UX1ZHQQkJ MHg0MA0KPj4gLSNkZWZpbmUJIENPTTdfRk1UX0NJRgkJMHgyMA0KPj4gKyNkZWZpbmUgIENPTTdf Rk1UX0NJRgkJMHgyMA0KPj4gI2RlZmluZSAgQ09NN19GTVRfUVZHQQkJMHgxMA0KPj4gI2RlZmlu ZSAgQ09NN19GTVRfUUNJRgkJMHgwOA0KPj4gLSNkZWZpbmUJIENPTTdfUkdCCQkweDA0DQo+PiAt I2RlZmluZQkgQ09NN19ZVVYJCTB4MDANCj4+IC0jZGVmaW5lCSBDT003X0JBWUVSCQkweDAxDQo+ PiAtI2RlZmluZQkgQ09NN19QQkFZRVIJCTB4MDUNCj4+ICsjZGVmaW5lICBDT003X1JHQgkJMHgw NA0KPj4gKyNkZWZpbmUgIENPTTdfWVVWCQkweDAwDQo+PiArI2RlZmluZSAgQ09NN19CQVlFUgkJ MHgwMQ0KPj4gKyNkZWZpbmUgIENPTTdfUEJBWUVSCQkweDA1DQo+PiArI2RlZmluZSAgT1Y5NjU1 X0NPTTdfVkdBCTB4NjANCj4+ICsjZGVmaW5lICBPVjk2NTVfQ09NN19SQVdSR0IJMHgwMAkvKiBk aWZmZXJlbnQgZm9ybWF0IGVuY29kaW5nICovDQo+PiArI2RlZmluZSAgT1Y5NjU1X0NPTTdfUkFX UkdCSU5UCTB4MDENCj4+ICsjZGVmaW5lICBPVjk2NTVfQ09NN19ZVVYJMHgwMg0KPj4gKyNkZWZp bmUgIE9WOTY1NV9DT003X1JHQgkweDAzDQo+PiAjZGVmaW5lIFJFR19DT004CQkweDEzCS8qIEFH Qy9BRUMgb3B0aW9ucyAqLw0KPj4gI2RlZmluZSAgQ09NOF9GQVNUQUVDCQkweDgwCS8qIEVuYWJs ZSBmYXN0IEFHQy9BRUMgKi8NCj4+ICNkZWZpbmUgIENPTThfQUVDU1RFUAkJMHg0MAkvKiBVbmxp bWl0ZWQgQUVDIHN0ZXAgc2l6ZSAqLw0KPj4gQEAgLTg5LDE0ICsxMTAsMjMgQEANCj4+ICNkZWZp bmUgIENPTThfQVdCCQkweDAyCS8qIFdoaXRlIGJhbGFuY2UgZW5hYmxlICovDQo+PiAjZGVmaW5l ICBDT004X0FFQwkJMHgwMQkvKiBBdXRvIGV4cG9zdXJlIGVuYWJsZSAqLw0KPj4gI2RlZmluZSBS RUdfQ09NOQkJMHgxNAkvKiBHYWluIGNlaWxpbmcgKi8NCj4+IC0jZGVmaW5lICBDT005X0dBSU5f Q0VJTF9NQVNLCTB4NzAJLyogKi8NCj4+ICsjZGVmaW5lICBDT005X0dBSU5fQ0VJTF9NQVNLCTB4 NzANCj4+ICsjZGVmaW5lICBDT005X0dBSU5fQ0VJTF8xNlgJMHgzMA0KPj4gKyNkZWZpbmUgIE9W OTY1NV9DT005X0VYUFRJTUlORwkweDA4DQo+PiArI2RlZmluZSAgT1Y5NjU1X0NPTTlfVlNZTkNE Uk9QCTB4MDQNCj4+ICsjZGVmaW5lICBPVjk2NTVfQ09NOV9BRUNEUk9QCTB4MDINCj4+ICNkZWZp bmUgUkVHX0NPTTEwCQkweDE1CS8qIFBDTEssIEhSRUYsIEhTWU5DIHNpZ25hbHMgcG9sYXJpdHkg Ki8NCj4+ICsjZGVmaW5lICBPVjk2NTVfU0xBVkVfUElOCTB4ODAJLyogU0xIUy9TTFZTIGluc3Rl YWQgb2YgUkVTRVRCL1BXRE4gKi8NCj4+ICNkZWZpbmUgIENPTTEwX0hTWU5DCQkweDQwCS8qIEhT WU5DIGluc3RlYWQgb2YgSFJFRiAqLw0KPj4gI2RlZmluZSAgQ09NMTBfUENMS19IQgkJMHgyMAkv KiBTdXBwcmVzcyBQQ0xLIG9uIGhvcml6IGJsYW5rICovDQo+PiAtI2RlZmluZSAgQ09NMTBfSFJF Rl9SRVYJCTB4MDgJLyogUmV2ZXJzZSBIUkVGICovDQo+PiArI2RlZmluZSAgT1Y5NjU1X0NPTTEw X1BDTEtfUkVWCQkweDEwCS8qIFBDTEsgcmV2ZXJzZSAqLw0KPj4gKyNkZWZpbmUgIENPTTEwX0hS RUZfUkVWCTB4MDgJLyogUmV2ZXJzZSBIUkVGICovDQo+PiAjZGVmaW5lICBDT00xMF9WU19MRUFE CQkweDA0CS8qIFZTWU5DIG9uIGNsb2NrIGxlYWRpbmcgZWRnZSAqLw0KPj4gKyNkZWZpbmUgIE9W OTY1NV9DT00xMF9SRVNFVF9PUFRJT04JMHgwNAkvKiBSZXNldCBzaWduYWwgZW5kIHBvaW50ICov DQo+PiAjZGVmaW5lICBDT00xMF9WU19ORUcJCTB4MDIJLyogVlNZTkMgbmVnYXRpdmUgKi8NCj4+ ICNkZWZpbmUgIENPTTEwX0hTX05FRwkJMHgwMQkvKiBIU1lOQyBuZWdhdGl2ZSAqLw0KPj4gKyNk ZWZpbmUgT1Y5NjU1X1JFRzE2CQkweDE2CS8qIGR1bW15IGZyYW1lIGFuZCBibGFua2luZyAqLw0K Pj4gKyNkZWZpbmUgICBPVjk2NTVfUkVHMTZfRFVNTVlfOAkweDIwCS8qIGR1bW15IGZyYW1lIHdo ZW4gZ2FpbiA+IDggKi8NCj4+ICNkZWZpbmUgUkVHX0hTVEFSVAkJMHgxNwkvKiBIb3JpeiBzdGFy dCBoaWdoIGJpdHMgKi8NCj4+ICNkZWZpbmUgUkVHX0hTVE9QCQkweDE4CS8qIEhvcml6IHN0b3Ag aGlnaCBiaXRzICovDQo+PiAjZGVmaW5lIFJFR19WU1RBUlQJCTB4MTkJLyogVmVydCBzdGFydCBo aWdoIGJpdHMgKi8NCj4+IEBAIC0xMTcsNiArMTQ3LDcgQEANCj4+ICNkZWZpbmUgUkVHX0JCSUFT CQkweDI3CS8qIEIgY2hhbm5lbCBvdXRwdXQgYmlhcyAqLw0KPj4gI2RlZmluZSBSRUdfR0JCSUFT CQkweDI4CS8qIEdiIGNoYW5uZWwgb3V0cHV0IGJpYXMgKi8NCj4+ICNkZWZpbmUgUkVHX0dSQ09N CQkweDI5CS8qIEFuYWxvZyBCTEMgJiByZWd1bGF0b3IgKi8NCj4+ICsjZGVmaW5lIE9WOTY1NV9Q UkVHQUlOCQkweDI5DQo+PiAjZGVmaW5lIFJFR19FWEhDSAkJMHgyYQkvKiBEdW1teSBwaXhlbCBp bnNlcnQgTVNCICovDQo+PiAjZGVmaW5lIFJFR19FWEhDTAkJMHgyYgkvKiBEdW1teSBwaXhlbCBp bnNlcnQgTFNCICovDQo+PiAjZGVmaW5lIFJFR19SQklBUwkJMHgyYwkvKiBSIGNoYW5uZWwgb3V0 cHV0IGJpYXMgKi8NCj4+IEBAIC0xMjcsMTIgKzE1OCwzMCBAQA0KPj4gI2RlZmluZSBSRUdfSFNZ RU4JCTB4MzEJLyogSFNZTkMgZmFsbGluZyBlZGdlIGRlbGF5IExTQiovDQo+PiAjZGVmaW5lIFJF R19IUkVGCQkweDMyCS8qIEhSRUYgcGllY2VzICovDQo+PiAjZGVmaW5lIFJFR19DSExGCQkweDMz CS8qIHJlc2VydmVkICovDQo+PiArI2RlZmluZSBPVjk2NTVfQ0xLRgkJMHgzMwkvKiBBcnJheSBj dXJyZW50IGNvbnRyb2wgKi8NCj4+ICsjZGVmaW5lIE9WOTY1NV9BUkVGMQkJMHgzNAkvKiBBcnJh eSByZWZlcmVuY2UgY29udHJvbCAqLw0KPj4gKyNkZWZpbmUgT1Y5NjU1X0FSRUYyCQkweDM1CS8q IEFycmF5IHJlZmVyZW5jZSBjb250cm9sICovDQo+PiArI2RlZmluZSBPVjk2NTVfQVJFRjMJCTB4 MzYJLyogQXJyYXkgcmVmZXJlbmNlIGNvbnRyb2wgKi8NCj4+ICNkZWZpbmUgUkVHX0FEQwkJCTB4 MzcJLyogcmVzZXJ2ZWQgKi8NCj4+ICsjZGVmaW5lIE9WOTY1NV9BREMJCTB4MzcJLyogQURDIENv bnRyb2wgMSAoUmFuZ2UgYWRqdXN0bWVudCkgKi8NCj4+ICNkZWZpbmUgUkVHX0FDT00JCTB4MzgJ LyogcmVzZXJ2ZWQgKi8NCj4+IC0jZGVmaW5lIFJFR19PRk9OCQkweDM5CS8qIFBvd2VyIGRvd24g cmVnaXN0ZXIgKi8NCj4+ICsjZGVmaW5lIE9WOTY1NV9BREMyCQkweDM4CS8qIEFEQyBDb250cm9s IDIgKFJhbmdlIGFkanVzdG1lbnQpICovDQo+PiArI2RlZmluZSBSRUdfT0ZPTgkJMHgzOQkvKiBQ b3dlciBkb3duIHJlZ2lzdGVyIChvdjk2NTAgb25seSkgKi8NCj4+ICNkZWZpbmUgIE9GT05fUFdS RE4JCTB4MDgJLyogUG93ZXIgZG93biBiaXQgKi8NCj4+ICsjZGVmaW5lIE9WOTY1NV9BUkVGNAkJ MHgzOQkvKiBBcnJheSByZWZlcmVuY2UgY29udHJvbCAqLw0KPj4gI2RlZmluZSBSRUdfVFNMQgkJ MHgzYQkvKiBZVVZVIGZvcm1hdCAqLw0KPj4gKyNkZWZpbmUgIE9WOTY1NV9QQ0xLREVMQVkyTlMJ MHg0MA0KPj4gKyNkZWZpbmUgIE9WOTY1NV9QQ0xLREVMQVk0TlMJMHg4MA0KPj4gKyNkZWZpbmUg IE9WOTY1NV9QQ0xLREVMQVk2TlMJMHhjMA0KPj4gKyNkZWZpbmUgIE9WOTY1NV9PVVRSRVZFUlNF CTB4MjANCj4+ICsjZGVmaW5lICBPVjk2NTVfRklYRURVVgkweDEwDQo+PiAjZGVmaW5lICBUU0xC X1lVWVZfTUFTSwkJMHgwYwkvKiBVWVZZIG9yIFZZVVkgLSBzZWUgY29tMTMgKi8NCj4+ICsjZGVm aW5lICBUU0xCX1lVWVYJCTB4MDANCj4+ICsjZGVmaW5lICBUU0xCX1lWWVUJCTB4MDQNCj4+ICsj ZGVmaW5lICBUU0xCX1ZZVVkJCTB4MDgNCj4+ICsjZGVmaW5lICBUU0xCX1VZVlkJCTB4MGMNCj4+ ICsjZGVmaW5lICBPVjk2NTVfQkFORElOR0FVVE8JMHgwMg0KPj4gKw0KPj4gI2RlZmluZSBSRUdf Q09NMTEJCTB4M2IJLyogTmlnaHQgbW9kZSwgYmFuZGluZyBmaWx0ZXIgZW5hYmxlICovDQo+PiAj ZGVmaW5lICBDT00xMV9OSUdIVAkJMHg4MAkvKiBOaWdodCBtb2RlIGVuYWJsZSAqLw0KPj4gI2Rl ZmluZSAgQ09NMTFfTk1GUgkJMHg2MAkvKiBUd28gYml0IE5NIGZyYW1lIHJhdGUgKi8NCj4+IEBA IC0xNDIsMjUgKzE5MSwzOCBAQA0KPj4gI2RlZmluZSAgQ09NMTJfSFJFRgkJMHg4MAkvKiBIUkVG IGFsd2F5cyAqLw0KPj4gI2RlZmluZSBSRUdfQ09NMTMJCTB4M2QJLyogR2FtbWEgc2VsZWN0aW9u LCBDb2xvciBtYXRyaXggZW4uICovDQo+PiAjZGVmaW5lICBDT00xM19HQU1NQQkJMHg4MAkvKiBH YW1tYSBlbmFibGUgKi8NCj4+IC0jZGVmaW5lCSBDT00xM19VVlNBVAkJMHg0MAkvKiBVViBzYXR1 cmF0aW9uIGF1dG8gYWRqdXN0bWVudCAqLw0KPj4gKyNkZWZpbmUgIENPTTEzX1VWU0FUCQkweDQw CS8qIFVWIHNhdHVyYXRpb24gYXV0byBhZGp1c3RtZW50ICovDQo+PiArI2RlZmluZSAgQ09NMTNf WV9ERUxBWQkJMHgwOAkvKiBEZWxheSBZIGNoYW5uZWwgKi8NCj4+ICNkZWZpbmUgIENPTTEzX1VW U1dBUAkJMHgwMQkvKiBWIGJlZm9yZSBVIC0gdy9UU0xCICovDQo+PiAjZGVmaW5lIFJFR19DT00x NAkJMHgzZQkvKiBFZGdlIGVuaGFuY2VtZW50IG9wdGlvbnMgKi8NCj4+ICNkZWZpbmUgIENPTTE0 X0VER0VfRU4JCTB4MDINCj4+ICNkZWZpbmUgIENPTTE0X0VFRl9YMgkJMHgwMQ0KPj4gKyNkZWZp bmUgT1Y5NjU1X1JFR19DT00xNAkweDNlCS8qIHBpeGVsIGNvcnJlY3Rpb24vem9vbSBPTi9PRkYg c2VsLiAqLw0KPj4gKyNkZWZpbmUgIE9WOTY1NV9DT00xNF9CTEFDS19QSVgJMHgwOAkvKiBCbGFj ayBwaXhlbCBjb3JyZWN0aW9uICovDQo+PiArI2RlZmluZSAgT1Y5NjU1X0NPTTE0X1dISVRFX1BJ WAkweDA0CS8qIFdoaXRlIHBpeGVsIGNvcnJlY3Rpb24gKi8NCj4+ICsjZGVmaW5lICBPVjk2NTVf Q09NMTRfWk9PTQkweDAyCS8qIFpvb20gZnVuY3Rpb24gT04gKi8NCj4+ICNkZWZpbmUgUkVHX0VE R0UJCTB4M2YJLyogRWRnZSBlbmhhbmNlbWVudCBmYWN0b3IgKi8NCj4+ICNkZWZpbmUgIEVER0Vf RkFDVE9SX01BU0sJMHgwZg0KPj4gI2RlZmluZSBSRUdfQ09NMTUJCTB4NDAJLyogT3V0cHV0IHJh bmdlLCBSR0IgNTU1LzU2NSAqLw0KPj4gI2RlZmluZSAgQ09NMTVfUjEwRjAJCTB4MDAJLyogRGF0 YSByYW5nZSAxMCB0byBGMCAqLw0KPj4gLSNkZWZpbmUJIENPTTE1X1IwMUZFCQkweDgwCS8qIDAx IHRvIEZFICovDQo+PiArI2RlZmluZSAgQ09NMTVfUjAxRkUJCTB4ODAJLyogMDEgdG8gRkUgKi8N Cj4+ICNkZWZpbmUgIENPTTE1X1IwMEZGCQkweGMwCS8qIDAwIHRvIEZGICovDQo+PiAjZGVmaW5l ICBDT00xNV9SR0I1NjUJCTB4MTAJLyogUkdCNTY1IG91dHB1dCAqLw0KPj4gI2RlZmluZSAgQ09N MTVfUkdCNTU1CQkweDMwCS8qIFJHQjU1NSBvdXRwdXQgKi8NCj4+ICNkZWZpbmUgIENPTTE1X1NX QVBSQgkJMHgwNAkvKiBTd2FwIFImQiAqLw0KPj4gI2RlZmluZSBSRUdfQ09NMTYJCTB4NDEJLyog Q29sb3IgbWF0cml4IGNvZWZmIG9wdGlvbnMgKi8NCj4+ICNkZWZpbmUgUkVHX0NPTTE3CQkweDQy CS8qIFNpbmdsZSBmcmFtZSBvdXQsIGJhbmRpbmcgZmlsdGVyICovDQo+PiArI2RlZmluZSBPVjk2 NTVfUkVHX0NPTTE3CTB4NDIJLyogRGVub2lzZSwgZWRnZSwgYXV0byBnYWluLCAuLi4gKi8NCj4+ ICsjZGVmaW5lICAgT1Y5NjU1X0NPTTE3X0VER0VfQVVUTwkweDQwCS8qIEVkZ2UgYXV0byAqLw0K Pj4gKyNkZWZpbmUgICBPVjk2NTVfQ09NMTdfREVOT0lTRV9BVVRPCTB4ODAJLyogRGVub2lzZSBh dXRvICovDQo+PiArI2RlZmluZSBPVjk2NTVfUkVHX1JTVkQoX19uKQkoMHg0MyArIChfX24pIC0g MSkgLyogcmVzZXJ2ZWQgYnV0IHVzZWQuLi4gKi8NCj4+IC8qIG4gPSAxLi4uOSwgMHg0Zi4uMHg1 NyAqLw0KPj4gLSNkZWZpbmUJUkVHX01UWChfX24pCQkoMHg0ZiArIChfX24pIC0gMSkNCj4+ICsj ZGVmaW5lIFJFR19NVFgoX19uKQkJKDB4NGYgKyAoX19uKSAtIDEpDQo+PiAjZGVmaW5lIFJFR19N VFhTCQkweDU4DQo+PiArI2RlZmluZSBSRUdfQVdCT1AoX19uKQkJKDB4NTkgKyAoX19uKSAtIDEp IC8qIEFXQiBjb250cm9sIG9wdGlvbnMgKi8NCj4+ICsjZGVmaW5lIFJFR19CTE1UCQkweDVGCS8q IEFXQiBCbHVlIENvbXBvbmVudCBHYWluIExpbWl0ICovDQo+PiArI2RlZmluZSBSRUdfUkxNVAkJ MHg2MAkvKiBBV0IgUmVkIENvbXBvbmVudCBHYWluIExpbWl0ICovDQo+PiArI2RlZmluZSBSRUdf R0xNVAkJMHg2MQkvKiBBV0IgR3JlZW4gQ29tcG9uZW50IEdhaW4gTGltaXQgKi8NCj4+IC8qIExl bnMgQ29ycmVjdGlvbiBPcHRpb24gMS4uLjUsIF9fbiA9IDAuLi41ICovDQo+PiAjZGVmaW5lIFJF R19MQ0MoX19uKQkJKDB4NjIgKyAoX19uKSAtIDEpDQo+PiAjZGVmaW5lICBMQ0M1X0xDQ19FTkFC TEUJMHgwMQkvKiBMQ0M1LCBlbmFibGUgbGVucyBjb3JyZWN0aW9uICovDQo+PiBAQCAtMTcwLDEw ICsyMzIsMjYgQEANCj4+ICNkZWZpbmUgUkVHX0hWCQkJMHg2OQkvKiBNYW51YWwgYmFuZGluZyBm aWx0ZXIgTVNCICovDQo+PiAjZGVmaW5lIFJFR19NQkQJCQkweDZhCS8qIE1hbnVhbCBiYW5kaW5n IGZpbHRlciB2YWx1ZSAqLw0KPj4gI2RlZmluZSBSRUdfREJMVgkJMHg2YgkvKiByZXNlcnZlZCAq Lw0KPj4gKyNkZWZpbmUgT1Y5NjU1X1JFR19EQkxWCQkweDZiCS8qIFBMTCwgRFZERCByZWd1IGJ5 cGFzcywgYmFuZGdhcCAqLw0KPj4gKyNkZWZpbmUgIE9WOTY1NV9EQkxWX0JBTkRHQVAJMHgwYQkv KiBkZWZhdWx0IHZhbHVlICovDQo+PiArI2RlZmluZSAgT1Y5NjU1X0RCTFZfTERPX0JZUEFTUwkw eDEwDQo+PiArI2RlZmluZSAgT1Y5NjU1X0RCTFZfUExMX0JZUEFTUwkweDAwDQo+PiArI2RlZmlu ZSAgT1Y5NjU1X0RCTFZfUExMXzRYCTB4NDANCj4+ICsjZGVmaW5lICBPVjk2NTVfREJMVl9QTExf NlgJMHg4MA0KPj4gKyNkZWZpbmUgIE9WOTY1NV9EQkxWX1BMTF84WAkweGMwDQo+PiAjZGVmaW5l IFJFR19HU1AJCQkweDZjCS8qIEdhbW1hIGN1cnZlICovDQo+PiAjZGVmaW5lICBHU1BfTEVOCQkx NQ0KPj4gKyNkZWZpbmUgT1Y5NjU1X1JFR19ETlNUSAkweDcwCS8qIERlLW5vaXNlIEZ1bmN0aW9u IFRocmVzaG9sZCBBZGouICovDQo+PiArI2RlZmluZSBPVjk2NTVfUkVHX1BPSURYCTB4NzIJLyog UGl4ZWwgb3V0cHV0IGluZGV4ICovDQo+PiArI2RlZmluZSBPVjk2NTVfUkVHX1BDS0RWCTB4NzMJ LyogUGl4ZWwgQ2xvY2sgT3V0cHV0IFNlbGVjdGlvbiAqLw0KPj4gKyNkZWZpbmUgT1Y5NjU1X1JF R19YSU5EWAkweDc0CS8qIEhvcml6b250YWwgU2NhbGluZyBEb3duIENvZWZmLiAqLw0KPj4gKyNk ZWZpbmUgT1Y5NjU1X1JFR19ZSU5EWAkweDc1CS8qIFZlcnRpY2FsIFNjYWxpbmcgRG93biBDb2Vm Zi4gKi8NCj4+ICsjZGVmaW5lIE9WOTY1NV9SRUdfU0xPUAkJMHg3QQkvKiBHYW1tYSBDdXJ2ZSBI aWdoZXN0IFNlZ21lbnQgU2xvcGUgKi8NCj4+ICsjZGVmaW5lIE9WOTY1NV9SRUdfR0FNKF9fbikJ KDB4N0IgKyAoX19uKSAtIDEpCS8qIEdhbW1hIGN1cnZlICovDQo+PiAjZGVmaW5lIFJFR19HU1QJ CQkweDdjCS8qIEdhbW1hIGN1cnZlICovDQo+PiAjZGVmaW5lICBHU1RfTEVOCQkxNQ0KPj4gKyNk ZWZpbmUgT1Y5NjU1X1JFR19DT00xOAkweDhiCS8qIFpvb20gbW9kZSBpbiBWR0EgKi8NCj4+ICsj ZGVmaW5lIE9WOTY1NV9SRUdfQ09NMTkJMHg4YwkvKiBVViBhZGp1c3RtZW50ICovDQo+PiAjZGVm aW5lIFJFR19DT00yMQkJMHg4Yg0KPj4gI2RlZmluZSBSRUdfQ09NMjIJCTB4OGMJLyogRWRnZSBl bmhhbmNlbWVudCwgZGVub2lzaW5nICovDQo+PiAjZGVmaW5lICBDT00yMl9XSFRQQ09SCQkweDAy CS8qIFdoaXRlIHBpeGVsIGNvcnJlY3Rpb24gZW5hYmxlICovDQo+PiBAQCAtMTgxLDYgKzI1OSw4 IEBADQo+PiAjZGVmaW5lICBDT00yMl9ERU5PSVNFCQkweDEwCS8qIFdoaXRlIHBpeGVsIGNvcnJl Y3Rpb24gb3B0aW9uICovDQo+PiAjZGVmaW5lIFJFR19DT00yMwkJMHg4ZAkvKiBDb2xvciBiYXIg dGVzdCwgY29sb3IgZ2FpbiAqLw0KPj4gI2RlZmluZSAgQ09NMjNfVEVTVF9NT0RFCTB4MTANCj4+ ICsjZGVmaW5lIE9WOTY1NV9SRUdfQ09NMjAJMHg4ZA0KPj4gKyNkZWZpbmUgIE9WOTY1NV9DT00y MF9URVNUX01PREUJMHgxMA0KPj4gI2RlZmluZSBSRUdfREJMQzEJCTB4OGYJLyogRGlnaXRhbCBC TEMgKi8NCj4+ICNkZWZpbmUgUkVHX0RCTENfQgkJMHg5MAkvKiBEaWdpdGFsIEJMQyBCIGNoYW5u ZWwgb2Zmc2V0ICovDQo+PiAjZGVmaW5lIFJFR19EQkxDX1IJCTB4OTEJLyogRGlnaXRhbCBCTEMg UiBjaGFubmVsIG9mZnNldCAqLw0KPj4gQEAgLTE5Myw2ICsyNzMsMTcgQEANCj4+ICNkZWZpbmUg UkVHX0FFQ0hNCQkweGExCS8qIEV4cG9zdXJlIHZhbHVlIC0gYml0cyBBRUNbMTU6MTBdICovDQo+ PiAjZGVmaW5lIFJFR19CRDUwU1QJCTB4YTIJLyogQmFuZGluZyBmaWx0ZXIgdmFsdWUgZm9yIDUw SHogKi8NCj4+ICNkZWZpbmUgUkVHX0JENjBTVAkJMHhhMwkvKiBCYW5kaW5nIGZpbHRlciB2YWx1 ZSBmb3IgNjBIeiAqLw0KPj4gKyNkZWZpbmUgT1Y5NjU1X1JFR19DT00yMQkweGE0CS8qIERpZ2l0 YWwgZ2FpbiAqLw0KPj4gKyNkZWZpbmUgT1Y5NjU1X1JFR19BV0JfR1JFRU4JMHhhNgkvKiBBV0Ig Z3JlZW4gKi8NCj4+ICsjZGVmaW5lIE9WOTY1NV9SRUdfUkVGX0E4CTB4YTgJLyogQW5hbG9nIFJl ZmVyZW5jZSBDb250cm9sICovDQo+PiArI2RlZmluZSBPVjk2NTVfUkVHX1JFRl9BOQkweGE5CS8q IEFuYWxvZyBSZWZlcmVuY2UgQ29udHJvbCAqLw0KPj4gKyNkZWZpbmUgT1Y5NjU1X1JFR19CTEMo X19uKQkoMHhhYyArIChfX24pIC0gMSkgLyogQmxhY2sgTGV2ZWwgQ29udHJvbCAqLw0KPj4gKyNk ZWZpbmUgT1Y5NjU1X1JFR19DVFJMQjQJMHhiNAkvKiBVViBhZGp1c3RtZW50ICovDQo+PiArI2Rl ZmluZSBPVjk2NTVfUkVHX0FEQk9GRgkweGJjCS8qIEFEQyBCIGNoYW5uZWwgb2Zmc2V0IHNldHRp bmcgKi8NCj4+ICsjZGVmaW5lIE9WOTY1NV9SRUdfQURST0ZGCTB4YmQJLyogQURDIFIgY2hhbm5l bCBvZmZzZXQgc2V0dGluZyAqLw0KPj4gKyNkZWZpbmUgT1Y5NjU1X1JFR19BREdCT0ZGCTB4YmUJ LyogQURDIEdiIGNoYW5uZWwgb2Zmc2V0IHNldHRpbmcgKi8NCj4+ICsjZGVmaW5lIE9WOTY1NV9S RUdfQURHRU9GRgkweGJmCS8qIEFEQyBHciBjaGFubmVsIG9mZnNldCBzZXR0aW5nICovDQo+PiAr I2RlZmluZSBPVjk2NTVfUkVHX0NPTTI0CTB4YzcJLyogUGl4ZWwgY2xvY2sgZnJlcXVlbmN5IHNl bGVjdGlvbiAqLw0KPj4gI2RlZmluZSBSRUdfTlVMTAkJMHhmZgkvKiBBcnJheSBlbmQgdG9rZW4g Ki8NCj4+DQo+PiAjZGVmaW5lIERFRl9DTEtSQwkJMHg4MA0KPj4gQEAgLTIwMCw2ICsyOTEsNyBA QA0KPj4gI2RlZmluZSBPVjk2NVhfSUQoX21zYiwgX2xzYikJKChfbXNiKSA8PCA4IHwgKF9sc2Ip KQ0KPj4gI2RlZmluZSBPVjk2NTBfSUQJCTB4OTY1MA0KPj4gI2RlZmluZSBPVjk2NTJfSUQJCTB4 OTY1Mg0KPj4gKyNkZWZpbmUgT1Y5NjU1VjVfSUQJCTB4OTY1Nw0KPj4NCj4+IHN0cnVjdCBvdjk2 NXhfY3RybHMgew0KPj4gCXN0cnVjdCB2NGwyX2N0cmxfaGFuZGxlciBoYW5kbGVyOw0KPj4gQEAg LTQ1OCw2ICs1NTAsMjkyIEBAIHN0cnVjdCBvdjk2NXhfcGl4Zm10IHsNCj4+IAl7eyAxLCAgIDI1 ICB9LCB7IFFWR0FfV0lEVEgsIFFWR0FfSEVJR0hUIH0sIDEgfSwgIC8qIDI1IGZwcyAqLw0KPj4g fTsNCj4+DQo+PiArLyogT1Y5NjU1ICovDQo+PiArc3RhdGljIGNvbnN0IHN0cnVjdCBpMmNfcnYg b3Y5NjU1X2luaXRfcmVnc1tdID0gew0KPj4gKwl7IFJFR19HQUlOLCAweDAwIH0sDQo+PiArCXsg UkVHX0JMVUUsIDB4ODAgfSwNCj4+ICsJeyBSRUdfUkVELCAweDgwIH0sDQo+PiArCXsgUkVHX1ZS RUYsIDB4MDIgfSwNCj4+ICsJeyBSRUdfQ09NMSwgMHgwMyB9LA0KPj4gKwl7IFJFR19DT00yLCAw eDAxIH0sLyogT3V0cHV0IGRyaXZlIHgyICovDQo+PiArCXsgUkVHX0NPTTMsIENPTTNfUkdCNTY1 IH0sLyogT3V0cHV0IGRyaXZlIHgyLCBSR0I1NjUgKi8NCj4+ICsJeyBSRUdfQ09NNSwgMHg2MCB8 IE9WOTY1NV9FWFBPU1VSRVNURVAgfSwvKiAweDYwID8gKi8NCj4+ICsJeyBSRUdfQ09NNiwgQ09N Nl9CTENfT1BUSUNBTCB9LA0KPj4gKwl7IFJFR19DTEtSQywgMHgwMSB9LC8qIEYoaW50ZXJuYWwg Y2xrKSA9IEYoaW5wdXQgY2xrKSAvIDIgKi8NCj4+ICsJeyBSRUdfQ09NNywgT1Y5NjU1X0NPTTdf VkdBIHwgT1Y5NjU1X0NPTTdfWVVWIH0sDQo+PiArCXsgUkVHX0NPTTgsIENPTThfRkFTVEFFQyB8 IENPTThfQUVDU1RFUCB8DQo+PiArCQkJQ09NOF9BR0MgfCBDT004X0FXQiB8IENPTThfQUVDIH0s DQo+PiArCXsgUkVHX0NPTTksIENPTTlfR0FJTl9DRUlMXzE2WCB8IE9WOTY1NV9DT005X0VYUFRJ TUlORyB8DQo+PiArCQkJT1Y5NjU1X0NPTTlfQUVDRFJPUCB9LA0KPj4gKwl7IE9WOTY1NV9SRUcx NiwgT1Y5NjU1X1JFRzE2X0RVTU1ZXzggfCAweDQgfSwNCj4+ICsJeyBSRUdfSFNUQVJULCAweDE4 IH0sDQo+PiArCXsgUkVHX0hTVE9QLCAweDA0IH0sDQo+PiArCXsgUkVHX1ZTVEFSVCwgMHgwMSB9 LA0KPj4gKwl7IFJFR19WU1RPUCwgMHg4MSB9LA0KPj4gKwl7IFJFR19NVkZQLCAweDAwIH0sLyog Tm8gbWlycm9yL2ZsaXAgKi8NCj4+ICsJeyBSRUdfQUVXLCAweDNjIH0sDQo+PiArCXsgUkVHX0FF QiwgMHgzNiB9LA0KPj4gKwl7IFJFR19WUFQsIDB4NzIgfSwNCj4+ICsJeyBSRUdfQkJJQVMsIDB4 MDggfSwNCj4+ICsJeyBSRUdfR0JCSUFTLCAweDA4IH0sDQo+PiArCXsgT1Y5NjU1X1BSRUdBSU4s IDB4MTUgfSwNCj4+ICsJeyBSRUdfRVhIQ0gsIDB4MDAgfSwNCj4+ICsJeyBSRUdfRVhIQ0wsIDB4 MDAgfSwNCj4+ICsJeyBSRUdfUkJJQVMsIDB4MDggfSwNCj4+ICsJeyBSRUdfSFJFRiwgMHgxMiB9 LC8qIFFWR0EgKi8NCj4+ICsJeyBSRUdfQ0hMRiwgMHgwMCB9LA0KPj4gKwl7IE9WOTY1NV9BUkVG MSwgMHgzZiB9LA0KPj4gKwl7IE9WOTY1NV9BUkVGMiwgMHgwMCB9LA0KPj4gKwl7IE9WOTY1NV9B UkVGMywgMHgzYSB9LA0KPj4gKwl7IE9WOTY1NV9BREMyLCAweDcyIH0sDQo+PiArCXsgT1Y5NjU1 X0FSRUY0LCAweDU3IH0sDQo+PiArCXsgUkVHX1RTTEIsIE9WOTY1NV9QQ0xLREVMQVk2TlMgfCBU U0xCX1VZVlkgfSwNCj4+ICsJeyBSRUdfQ09NMTEsIDB4MDQgfSwvKiAweDA0ID8gKi8NCj4+ICsJ eyBSRUdfQ09NMTMsIENPTTEzX0dBTU1BIHwgMHgxMCB8DQo+PiArCQkJQ09NMTNfWV9ERUxBWSB8 IENPTTEzX1VWU1dBUCB9LC8qIDB4MTAgPyAqLw0KPj4gKwl7T1Y5NjU1X1JFR19DT00xNCwgT1Y5 NjU1X0NPTTE0X1pPT00gfSwgLyogUVZHQSAqLw0KPj4gKwl7IFJFR19FREdFLCAweGMxIH0sDQo+ PiArCXsgUkVHX0NPTTE1LCBDT00xNV9SMDBGRiB9LC8qIEZ1bGwgcmFuZ2Ugb3V0cHV0ICovDQo+ PiArCXsgUkVHX0NPTTE2LCAweDQxIH0sLyogMHg0MSA/ICovDQo+PiArCXsgT1Y5NjU1X1JFR19D T00xNywgT1Y5NjU1X0NPTTE3X0VER0VfQVVUTyB8DQo+PiArCQkJT1Y5NjU1X0NPTTE3X0RFTk9J U0VfQVVUTyB9LA0KPj4gKwl7IE9WOTY1NV9SRUdfUlNWRCgxKSwgMHgwYSB9LA0KPj4gKwl7IE9W OTY1NV9SRUdfUlNWRCgyKSwgMHhmMCB9LA0KPj4gKwl7IE9WOTY1NV9SRUdfUlNWRCgzKSwgMHg0 NiB9LA0KPj4gKwl7IE9WOTY1NV9SRUdfUlNWRCg0KSwgMHg2MiB9LA0KPj4gKwl7IE9WOTY1NV9S RUdfUlNWRCg1KSwgMHgyYSB9LA0KPj4gKwl7IE9WOTY1NV9SRUdfUlNWRCg2KSwgMHgzYyB9LA0K Pj4gKwl7IE9WOTY1NV9SRUdfUlNWRCg3KSwgMHhmYyB9LA0KPj4gKwl7IE9WOTY1NV9SRUdfUlNW RCg4KSwgMHhmYyB9LA0KPj4gKwl7IE9WOTY1NV9SRUdfUlNWRCg5KSwgMHg3ZiB9LA0KPj4gKwl7 IE9WOTY1NV9SRUdfUlNWRCgxMCksIDB4N2YgfSwNCj4+ICsJeyBPVjk2NTVfUkVHX1JTVkQoMTEp LCAweDdmIH0sDQo+PiArCXsgUkVHX01UWCgxKSwgMHg5OCB9LA0KPj4gKwl7IFJFR19NVFgoMiks IDB4OTggfSwNCj4+ICsJeyBSRUdfTVRYKDMpLCAweDAwIH0sDQo+PiArCXsgUkVHX01UWCg0KSwg MHgyOCB9LA0KPj4gKwl7IFJFR19NVFgoNSksIDB4NzAgfSwNCj4+ICsJeyBSRUdfTVRYKDYpLCAw eDk4IH0sDQo+PiArCXsgUkVHX01UWFMsIDB4MWEgfSwNCj4+ICsJeyBSRUdfQVdCT1AoMSksIDB4 ODUgfSwNCj4+ICsJeyBSRUdfQVdCT1AoMiksIDB4YTkgfSwNCj4+ICsJeyBSRUdfQVdCT1AoMyks IDB4NjQgfSwNCj4+ICsJeyBSRUdfQVdCT1AoNCksIDB4ODQgfSwNCj4+ICsJeyBSRUdfQVdCT1Ao NSksIDB4NTMgfSwNCj4+ICsJeyBSRUdfQVdCT1AoNiksIDB4MGUgfSwNCj4+ICsJeyBSRUdfQkxN VCwgMHhmMCB9LA0KPj4gKwl7IFJFR19STE1ULCAweGYwIH0sDQo+PiArCXsgUkVHX0dMTVQsIDB4 ZjAgfSwNCj4+ICsJeyBSRUdfTENDKDEpLCAweDAwIH0sDQo+PiArCXsgUkVHX0xDQygyKSwgMHgw MCB9LA0KPj4gKwl7IFJFR19MQ0MoMyksIDB4MDIgfSwNCj4+ICsJeyBSRUdfTENDKDQpLCAweDIw IH0sDQo+PiArCXsgUkVHX0xDQyg1KSwgMHgwMCB9LA0KPj4gKwl7IDB4NjksIDB4MGEgfSwvKiBS ZXNlcnZlZC4uLiAqLw0KPj4gKwl7IE9WOTY1NV9SRUdfREJMViwgT1Y5NjU1X0RCTFZfUExMXzRY IHwgT1Y5NjU1X0RCTFZfTERPX0JZUEFTUyB8DQo+PiArCQkJT1Y5NjU1X0RCTFZfQkFOREdBUCB9 LA0KPj4gKwl7IDB4NmMsIDB4MDQgfSwvKiBSZXNlcnZlZC4uLiAqLw0KPj4gKwl7IDB4NmQsIDB4 NTUgfSwvKiBSZXNlcnZlZC4uLiAqLw0KPj4gKwl7IDB4NmUsIDB4MDAgfSwvKiBSZXNlcnZlZC4u LiAqLw0KPj4gKwl7IDB4NmYsIDB4OWQgfSwvKiBSZXNlcnZlZC4uLiAqLw0KPj4gKwl7IE9WOTY1 NV9SRUdfRE5TVEgsIDB4MjEgfSwNCj4+ICsJeyAweDcxLCAweDc4IH0sLyogUmVzZXJ2ZWQuLi4g Ki8NCj4+ICsJeyBPVjk2NTVfUkVHX1BPSURYLCAweDExIH0sLyogUVZHQSAqLw0KPj4gKwl7IE9W OTY1NV9SRUdfUENLRFYsIDB4MDEgfSwvKiBRVkdBICovDQo+PiArCXsgT1Y5NjU1X1JFR19YSU5E WCwgMHgxMCB9LA0KPj4gKwl7IE9WOTY1NV9SRUdfWUlORFgsIDB4MTAgfSwNCj4+ICsJeyAweDc2 LCAweDAxIH0sLyogUmVzZXJ2ZWQuLi4gKi8NCj4+ICsJeyAweDc3LCAweDAyIH0sLyogUmVzZXJ2 ZWQuLi4gKi8NCj4+ICsJeyAweDdBLCAweDEyIH0sLyogUmVzZXJ2ZWQuLi4gKi8NCj4+ICsJeyBP Vjk2NTVfUkVHX0dBTSgxKSwgMHgwOCB9LA0KPj4gKwl7IE9WOTY1NV9SRUdfR0FNKDIpLCAweDE2 IH0sDQo+PiArCXsgT1Y5NjU1X1JFR19HQU0oMyksIDB4MzAgfSwNCj4+ICsJeyBPVjk2NTVfUkVH X0dBTSg0KSwgMHg1ZSB9LA0KPj4gKwl7IE9WOTY1NV9SRUdfR0FNKDUpLCAweDcyIH0sDQo+PiAr CXsgT1Y5NjU1X1JFR19HQU0oNiksIDB4ODIgfSwNCj4+ICsJeyBPVjk2NTVfUkVHX0dBTSg3KSwg MHg4ZSB9LA0KPj4gKwl7IE9WOTY1NV9SRUdfR0FNKDgpLCAweDlhIH0sDQo+PiArCXsgT1Y5NjU1 X1JFR19HQU0oOSksIDB4YTQgfSwNCj4+ICsJeyBPVjk2NTVfUkVHX0dBTSgxMCksIDB4YWMgfSwN Cj4+ICsJeyBPVjk2NTVfUkVHX0dBTSgxMSksIDB4YjggfSwNCj4+ICsJeyBPVjk2NTVfUkVHX0dB TSgxMiksIDB4YzMgfSwNCj4+ICsJeyBPVjk2NTVfUkVHX0dBTSgxMyksIDB4ZDYgfSwNCj4+ICsJ eyBPVjk2NTVfUkVHX0dBTSgxNCksIDB4ZTYgfSwNCj4+ICsJeyBPVjk2NTVfUkVHX0dBTSgxNSks IDB4ZjIgfSwNCj4+ICsJeyAweDhhLCAweDI0IH0sLyogUmVzZXJ2ZWQuLi4gKi8NCj4+ICsJeyBP Vjk2NTVfUkVHX0NPTTE5LCAweDgwIH0sDQo+PiArCXsgMHg5MCwgMHg3ZCB9LC8qIFJlc2VydmVk Li4uICovDQo+PiArCXsgMHg5MSwgMHg3YiB9LC8qIFJlc2VydmVkLi4uICovDQo+PiArCXsgUkVH X0xDQ0ZCLCAweDAyIH0sDQo+PiArCXsgUkVHX0xDQ0ZSLCAweDAyIH0sDQo+PiArCXsgUkVHX0RC TENfR0IsIDB4N2EgfSwNCj4+ICsJeyBSRUdfREJMQ19HUiwgMHg3OSB9LA0KPj4gKwl7IFJFR19B RUNITSwgMHg0MCB9LA0KPj4gKwl7IE9WOTY1NV9SRUdfQ09NMjEsIDB4NTAgfSwNCj4+ICsJeyAw eGE1LCAweDY4IH0sLyogUmVzZXJ2ZWQuLi4gKi8NCj4+ICsJeyBPVjk2NTVfUkVHX0FXQl9HUkVF TiwgMHg0YSB9LA0KPj4gKwl7IE9WOTY1NV9SRUdfUkVGX0E4LCAweGMxIH0sDQo+PiArCXsgT1Y5 NjU1X1JFR19SRUZfQTksIDB4ZWYgfSwNCj4+ICsJeyAweGFhLCAweDkyIH0sLyogUmVzZXJ2ZWQu Li4gKi8NCj4+ICsJeyAweGFiLCAweDA0IH0sLyogUmVzZXJ2ZWQuLi4gKi8NCj4+ICsJeyBPVjk2 NTVfUkVHX0JMQygxKSwgMHg4MCB9LA0KPj4gKwl7IE9WOTY1NV9SRUdfQkxDKDIpLCAweDgwIH0s DQo+PiArCXsgT1Y5NjU1X1JFR19CTEMoMyksIDB4ODAgfSwNCj4+ICsJeyBPVjk2NTVfUkVHX0JM Qyg0KSwgMHg4MCB9LA0KPj4gKwl7IE9WOTY1NV9SRUdfQkxDKDcpLCAweGYyIH0sDQo+PiArCXsg T1Y5NjU1X1JFR19CTEMoOCksIDB4MjAgfSwNCj4+ICsJeyBPVjk2NTVfUkVHX0NUUkxCNCwgMHgy MCB9LA0KPj4gKwl7IDB4YjUsIDB4MDAgfSwvKiBSZXNlcnZlZC4uLiAqLw0KPj4gKwl7IDB4YjYs IDB4YWYgfSwvKiBSZXNlcnZlZC4uLiAqLw0KPj4gKwl7IDB4YjYsIDB4YWYgfSwvKiBSZXNlcnZl ZC4uLiAqLw0KPj4gKwl7IDB4YmIsIDB4YWUgfSwvKiBSZXNlcnZlZC4uLiAqLw0KPj4gKwl7IE9W OTY1NV9SRUdfQURCT0ZGLCAweDdmIH0sDQo+PiArCXsgT1Y5NjU1X1JFR19BRFJPRkYsIDB4N2Yg fSwNCj4+ICsJeyBPVjk2NTVfUkVHX0FER0JPRkYsIDB4N2YgfSwNCj4+ICsJeyBPVjk2NTVfUkVH X0FER0VPRkYsIDB4N2YgfSwNCj4+ICsJeyBPVjk2NTVfUkVHX0FER0VPRkYsIDB4N2YgfSwNCj4+ ICsJeyAweGMwLCAweGFhIH0sLyogUmVzZXJ2ZWQuLi4gKi8NCj4+ICsJeyAweGMxLCAweGMwIH0s LyogUmVzZXJ2ZWQuLi4gKi8NCj4+ICsJeyAweGMyLCAweDAxIH0sLyogUmVzZXJ2ZWQuLi4gKi8N Cj4+ICsJeyAweGMzLCAweDRlIH0sLyogUmVzZXJ2ZWQuLi4gKi8NCj4+ICsJeyAweGM2LCAweDA1 IH0sLyogUmVzZXJ2ZWQuLi4gKi8NCj4+ICsJeyBPVjk2NTVfUkVHX0NPTTI0LCAweDgxIH0sLyog UVZHQSAqLw0KPj4gKwl7IDB4YzksIDB4ZTAgfSwvKiBSZXNlcnZlZC4uLiAqLw0KPj4gKwl7IDB4 Y2EsIDB4ZTggfSwvKiBSZXNlcnZlZC4uLiAqLw0KPj4gKwl7IDB4Y2IsIDB4ZjAgfSwvKiBSZXNl cnZlZC4uLiAqLw0KPj4gKwl7IDB4Y2MsIDB4ZDggfSwvKiBSZXNlcnZlZC4uLiAqLw0KPj4gKwl7 IDB4Y2QsIDB4OTMgfSwvKiBSZXNlcnZlZC4uLiAqLw0KPj4gKwl7IFJFR19DT003LCBPVjk2NTVf Q09NN19WR0EgfCBPVjk2NTVfQ09NN19SR0IgfSwNCj4+ICsJeyBSRUdfQ09NMTUsIENPTTE1X1JH QjU2NSB9LA0KPj4gKwl7IFJFR19OVUxMLCAwfQ0KPj4gK307DQo+PiArDQo+PiArc3RhdGljIGNv bnN0IHN0cnVjdCBpMmNfcnYgb3Y5NjU1X3F2Z2FfcmVnc1tdID0gew0KPj4gKwl7IFJFR19IUkVG LCAweDEyIH0sDQo+PiArCXsgT1Y5NjU1X1JFR19DT00xNCwgT1Y5NjU1X0NPTTE0X1pPT00gfSwN Cj4+ICsJeyBPVjk2NTVfUkVHX1BPSURYLCAweDExIH0sDQo+PiArCXsgT1Y5NjU1X1JFR19QQ0tE ViwgMHgwMSB9LA0KPj4gKwl7IE9WOTY1NV9SRUdfQ09NMjQsIDB4ODEgfSwNCj4+ICsJeyBSRUdf TlVMTCwgMH0NCj4+ICt9Ow0KPj4gKw0KPj4gK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaTJjX3J2IG92 OTY1NV9xcXZnYV9yZWdzW10gPSB7DQo+PiArCXsgUkVHX0hSRUYsIDB4YTQgfSwNCj4+ICsJeyBS RUdfQ09NMTQsIE9WOTY1NV9DT00xNF9CTEFDS19QSVggfCBPVjk2NTVfQ09NMTRfV0hJVEVfUElY IHwNCj4+ICsJCQlPVjk2NTVfQ09NMTRfWk9PTSB9LA0KPj4gKwl7IE9WOTY1NV9SRUdfUE9JRFgs IDB4MjIgfSwNCj4+ICsJeyBPVjk2NTVfUkVHX1BDS0RWLCAweDAyIH0sDQo+PiArCXsgT1Y5NjU1 X1JFR19DT00yNCwgMHg4MiB9LA0KPj4gKwl7IFJFR19OVUxMLCAwfQ0KPj4gK307DQo+PiArDQo+ PiArc3RhdGljIGNvbnN0IHN0cnVjdCBpMmNfcnYgb3Y5NjU1X3ZnYV9yZWdzW10gPSB7DQo+PiAr CXsgUkVHX0dBSU4sIDB4MTEgfSwNCj4+ICsJeyBSRUdfVlJFRiwgMHgxMiB9LA0KPj4gKwl7IFJF R19CX0FWRSwgMHgyZSB9LA0KPj4gKwl7IFJFR19HQl9BVkUsIDB4MmUgfSwNCj4+ICsJeyBSRUdf R1JfQVZFLCAweDJlIH0sDQo+PiArCXsgUkVHX1JfQVZFLCAweDJlIH0sDQo+PiArCXsgUkVHX0NP TTYsIDB4NDggfSwNCj4+ICsJeyBSRUdfQUVDSCwgMHg3YiB9LA0KPj4gKwl7IFJFR19DTEtSQywg MHgwMyB9LA0KPj4gKwl7IFJFR19DT004LCBDT004X0ZBU1RBRUMgfCBDT004X0FFQ1NURVAgfCBD T004X0JGSUxUIHwNCj4+ICsJCQlDT004X0FHQyB8IENPTThfQVdCIHwgQ09NOF9BRUMgfSwNCj4+ ICsJeyBSRUdfSFNUQVJULCAweDE2IH0sDQo+PiArCXsgUkVHX0hTVE9QLCAweDAyIH0sDQo+PiAr CXsgUkVHX1ZTVEFSVCwgMHgwMSB9LA0KPj4gKwl7IFJFR19WU1RPUCwgMHgzZCB9LA0KPj4gKwl7 IFJFR19NVkZQLCAweDA0IH0sDQo+PiArCXsgUkVHX1lBVkUsIDB4MmUgfSwNCj4+ICsJeyBSRUdf SFJFRiwgMHhmZiB9LA0KPj4gKwl7IE9WOTY1NV9BUkVGMSwgMHgzZCB9LA0KPj4gKwl7IE9WOTY1 NV9BUkVGMywgMHhmYSB9LA0KPj4gKwl7IFJFR19UU0xCLCAweGNjIH0sDQo+PiArCXsgUkVHX0NP TTExLCAweGNjIH0sDQo+PiArCXsgUkVHX0NPTTE0LCAweDBjIH0sDQo+PiArCXsgUkVHX0VER0Us IDB4ODIgfSwNCj4+ICsJeyBSRUdfQ09NMTUsIENPTTE1X1IwMEZGIHwgQ09NMTVfUkdCNTY1IH0s LyogZnVsbCByYW5nZSAqLw0KPj4gKwl7IFJFR19DT00xNiwgMHg0MCB9LA0KPj4gKwl7IE9WOTY1 NV9SRUdfUlNWRCgxKSwgMHgxNCB9LA0KPj4gKwl7IE9WOTY1NV9SRUdfUlNWRCgyKSwgMHhmMCB9 LA0KPj4gKwl7IE9WOTY1NV9SRUdfUlNWRCgzKSwgMHg0NiB9LA0KPj4gKwl7IE9WOTY1NV9SRUdf UlNWRCg0KSwgMHg2MiB9LA0KPj4gKwl7IE9WOTY1NV9SRUdfUlNWRCg1KSwgMHgyYSB9LA0KPj4g Kwl7IE9WOTY1NV9SRUdfUlNWRCg2KSwgMHgzYyB9LA0KPj4gKwl7IE9WOTY1NV9SRUdfUlNWRCg4 KSwgMHhlOSB9LA0KPj4gKwl7IE9WOTY1NV9SRUdfUlNWRCg5KSwgMHhkZCB9LA0KPj4gKwl7IE9W OTY1NV9SRUdfUlNWRCgxMCksIDB4ZGQgfSwNCj4+ICsJeyBPVjk2NTVfUkVHX1JTVkQoMTEpLCAw eGRkIH0sDQo+PiArCXsgT1Y5NjU1X1JFR19SU1ZEKDEyKSwgMHhkZCB9LA0KPj4gKwl7IFJFR19M Q0MoMSksIDB4MDAgfSwNCj4+ICsJeyBSRUdfTENDKDIpLCAweDAwIH0sDQo+PiArCXsgUkVHX0xD QygzKSwgMHgwMiB9LA0KPj4gKwl7IFJFR19MQ0MoNCksIDB4MjAgfSwNCj4+ICsJeyBSRUdfTEND KDUpLCAweDAxIH0sDQo+PiArCXsgUkVHX0dTUCwgMHgwYyB9LA0KPj4gKwl7IDB4NmYsIDB4OWUg fSwvKiBSZXNlcnZlZC4uLiAqLw0KPj4gKwl7IE9WOTY1NV9SRUdfRE5TVEgsIDB4MDYgfSwNCj4+ ICsJeyBPVjk2NTVfUkVHX1BPSURYLCAweDAwIH0sDQo+PiArCXsgT1Y5NjU1X1JFR19QQ0tEViwg MHgwMCB9LA0KPj4gKwl7IE9WOTY1NV9SRUdfWElORFgsIDB4M2EgfSwNCj4+ICsJeyBPVjk2NTVf UkVHX1lJTkRYLCAweDM1IH0sDQo+PiArCXsgT1Y5NjU1X1JFR19TTE9QLCAweDIwIH0sDQo+PiAr CXsgT1Y5NjU1X1JFR19HQU0oMSksIDB4MWMgfSwNCj4+ICsJeyBPVjk2NTVfUkVHX0dBTSgyKSwg MHgyOCB9LA0KPj4gKwl7IE9WOTY1NV9SRUdfR0FNKDMpLCAweDNjIH0sDQo+PiArCXsgT1Y5NjU1 X1JFR19HQU0oNCksIDB4NWEgfSwNCj4+ICsJeyBPVjk2NTVfUkVHX0dBTSg1KSwgMHg2OCB9LA0K Pj4gKwl7IE9WOTY1NV9SRUdfR0FNKDYpLCAweDc2IH0sDQo+PiArCXsgT1Y5NjU1X1JFR19HQU0o NyksIDB4ODAgfSwNCj4+ICsJeyBPVjk2NTVfUkVHX0dBTSg4KSwgMHg4OCB9LA0KPj4gKwl7IE9W OTY1NV9SRUdfR0FNKDkpLCAweDhmIH0sDQo+PiArCXsgT1Y5NjU1X1JFR19HQU0oMTApLCAweDk2 IH0sDQo+PiArCXsgT1Y5NjU1X1JFR19HQU0oMTEpLCAweGEzIH0sDQo+PiArCXsgT1Y5NjU1X1JF R19HQU0oMTIpLCAweGFmIH0sDQo+PiArCXsgT1Y5NjU1X1JFR19HQU0oMTMpLCAweGM0IH0sDQo+ PiArCXsgT1Y5NjU1X1JFR19HQU0oMTQpLCAweGQ3IH0sDQo+PiArCXsgT1Y5NjU1X1JFR19HQU0o MTUpLCAweGU4IH0sDQo+PiArCXsgMHg4YSwgMHgyMyB9LC8qIFJlc2VydmVkLi4uICovDQo+PiAr CXsgT1Y5NjU1X1JFR19DT00xOSwgMHg4ZCB9LA0KPj4gKwl7IDB4OTAsIDB4OTIgfSwvKiBSZXNl cnZlZC4uLiAqLw0KPj4gKwl7IDB4OTEsIDB4OTIgfSwvKiBSZXNlcnZlZC4uLiAqLw0KPj4gKwl7 IFJFR19EQkxDX0dCLCAweDkwIH0sDQo+PiArCXsgUkVHX0RCTENfR1IsIDB4OTAgfSwNCj4+ICsJ eyBPVjk2NTVfUkVHX0FXQl9HUkVFTiwgMHg0MCB9LA0KPj4gKwl7IE9WOTY1NV9SRUdfQURCT0ZG LCAweDAyIH0sDQo+PiArCXsgT1Y5NjU1X1JFR19BRFJPRkYsIDB4MDEgfSwNCj4+ICsJeyBPVjk2 NTVfUkVHX0FER0JPRkYsIDB4MDIgfSwNCj4+ICsJeyBPVjk2NTVfUkVHX0FER0VPRkYsIDB4MDEg fSwNCj4+ICsJeyAweGMxLCAweGM4IH0sLyogUmVzZXJ2ZWQuLi4gKi8NCj4+ICsJeyAweGM2LCAw eDg1IH0sLyogUmVzZXJ2ZWQuLi4gKi8NCj4+ICsJeyBPVjk2NTVfUkVHX0NPTTI0LCAweDgwIH0s DQo+PiArCXsgUkVHX05VTEwsIDB9DQo+PiArfTsNCj4+ICsNCj4+ICtzdGF0aWMgY29uc3Qgc3Ry dWN0IG92OTY1eF9mcmFtZXNpemUgb3Y5NjU1X2ZyYW1lc2l6ZXNbXSA9IHsNCj4+ICsJew0KPj4g KwkJLndpZHRoCQk9IFZHQV9XSURUSCwNCj4+ICsJCS5oZWlnaHQJCT0gVkdBX0hFSUdIVCwNCj4+ ICsJCS5yZWdzCQk9IG92OTY1NV92Z2FfcmVncywNCj4+ICsJCS5tYXhfZXhwX2xpbmVzCT0gNDk4 LA0KPj4gKwl9LCB7DQo+PiArCQkud2lkdGgJCT0gUVZHQV9XSURUSCwNCj4+ICsJCS5oZWlnaHQJ CT0gUVZHQV9IRUlHSFQsDQo+PiArCQkucmVncwkJPSBvdjk2NTVfcXZnYV9yZWdzLA0KPj4gKwkJ Lm1heF9leHBfbGluZXMJPSAyNDgsDQo+PiArCX0sDQo+PiArCXsNCj4+ICsJCS53aWR0aAkJPSBR UVZHQV9XSURUSCwNCj4+ICsJCS5oZWlnaHQJCT0gUVFWR0FfSEVJR0hULA0KPj4gKwkJLnJlZ3MJ CT0gb3Y5NjU1X3FxdmdhX3JlZ3MsDQo+PiArCQkubWF4X2V4cF9saW5lcwk9IDEyNCwNCj4+ICsJ fSwNCj4+ICt9Ow0KPj4gKw0KPj4gK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgb3Y5NjV4X3BpeGZtdCBv djk2NTVfZm9ybWF0c1tdID0gew0KPj4gKwl7IE1FRElBX0JVU19GTVRfUkdCNTY1XzJYOF9MRSwg VjRMMl9DT0xPUlNQQUNFX1NSR0IsIDB4MDh9LA0KPj4gK307DQo+PiArDQo+PiBzdGF0aWMgaW5s aW5lIHN0cnVjdCB2NGwyX3N1YmRldiAqY3RybF90b19zZChzdHJ1Y3QgdjRsMl9jdHJsICpjdHJs KQ0KPj4gew0KPj4gCXJldHVybiAmY29udGFpbmVyX29mKGN0cmwtPmhhbmRsZXIsIHN0cnVjdCBv djk2NXgsIGN0cmxzLmhhbmRsZXIpLT5zZDsNCj4+IEBAIC04OTQsMTIgKzEyNzIsMTYgQEAgc3Rh dGljIGludCBvdjk2NXhfc2V0X3Rlc3RfcGF0dGVybihzdHJ1Y3Qgb3Y5NjV4ICpvdjk2NXgsIGlu dCB2YWx1ZSkNCj4+IHsNCj4+IAlpbnQgcmV0Ow0KPj4gCXU4IHJlZzsNCj4+ICsJdTggYWRkciA9 IChvdjk2NXgtPmlkID09IE9WOTY1NVY1X0lEKSA/DQo+PiArCQkJUkVHX0NPTTMgOiBSRUdfQ09N MjM7DQo+PiArCXU4IG1hc2sgPSAob3Y5NjV4LT5pZCA9PSBPVjk2NTVWNV9JRCkgPw0KPj4gKwkJ CUNPTTNfQ09MT1JCQVIgOiBDT00yM19URVNUX01PREU7DQo+Pg0KPj4gLQlyZXQgPSBvdjk2NXhf cmVhZChvdjk2NXgtPmNsaWVudCwgUkVHX0NPTTIzLCAmcmVnKTsNCj4+ICsJcmV0ID0gb3Y5NjV4 X3JlYWQob3Y5NjV4LT5jbGllbnQsIGFkZHIsICZyZWcpOw0KPj4gCWlmIChyZXQgPCAwKQ0KPj4g CQlyZXR1cm4gcmV0Ow0KPj4gLQlyZWcgPSB2YWx1ZSA/IHJlZyB8IENPTTIzX1RFU1RfTU9ERSA6 IHJlZyAmIH5DT00yM19URVNUX01PREU7DQo+PiAtCXJldHVybiBvdjk2NXhfd3JpdGUob3Y5NjV4 LT5jbGllbnQsIFJFR19DT00yMywgcmVnKTsNCj4+ICsJcmVnID0gdmFsdWUgPyByZWcgfCBtYXNr IDogcmVnICYgfm1hc2s7DQo+PiArCXJldHVybiBvdjk2NXhfd3JpdGUob3Y5NjV4LT5jbGllbnQs IGFkZHIsIHJlZyk7DQo+PiB9DQo+Pg0KPj4gc3RhdGljIGludCBfX2dfdm9sYXRpbGVfY3RybChz dHJ1Y3Qgb3Y5NjV4ICpvdjk2NXgsIHN0cnVjdCB2NGwyX2N0cmwgKmN0cmwpDQo+PiBAQCAtMTEw Miw2ICsxNDg0LDMwIEBAIHN0YXRpYyBpbnQgb3Y5NjV4X2luaXRpYWxpemVfY29udHJvbHMoc3Ry dWN0IG92OTY1eCAqb3Y5NjV4KQ0KPj4gCXJldHVybiAwOw0KPj4gfQ0KPj4NCj4+ICtzdGF0aWMg aW50IG92OTY1NV9pbml0aWFsaXplX2NvbnRyb2xzKHN0cnVjdCBvdjk2NXggKm92OTY1eCkNCj4+ ICt7DQo+PiArCWNvbnN0IHN0cnVjdCB2NGwyX2N0cmxfb3BzICpvcHMgPSAmb3Y5NjV4X2N0cmxf b3BzOw0KPj4gKwlzdHJ1Y3Qgb3Y5NjV4X2N0cmxzICpjdHJscyA9ICZvdjk2NXgtPmN0cmxzOw0K Pj4gKwlzdHJ1Y3QgdjRsMl9jdHJsX2hhbmRsZXIgKmhkbCA9ICZjdHJscy0+aGFuZGxlcjsNCj4+ ICsJaW50IHJldDsNCj4+ICsNCj4+ICsJcmV0ID0gdjRsMl9jdHJsX2hhbmRsZXJfaW5pdChoZGws IDE2KTsNCj4+ICsJaWYgKHJldCA8IDApDQo+PiArCQlyZXR1cm4gcmV0Ow0KPj4gKw0KPj4gKwl2 NGwyX2N0cmxfbmV3X3N0ZF9tZW51X2l0ZW1zKGhkbCwgb3BzLCBWNEwyX0NJRF9URVNUX1BBVFRF Uk4sDQo+PiArCQkJCSAgICAgQVJSQVlfU0laRSh0ZXN0X3BhdHRlcm5fbWVudSkgLSAxLCAwLCAw LA0KPj4gKwkJCQkgICAgIHRlc3RfcGF0dGVybl9tZW51KTsNCj4+ICsJaWYgKGhkbC0+ZXJyb3Ip IHsNCj4+ICsJCXJldCA9IGhkbC0+ZXJyb3I7DQo+PiArCQl2NGwyX2N0cmxfaGFuZGxlcl9mcmVl KGhkbCk7DQo+PiArCQlyZXR1cm4gcmV0Ow0KPj4gKwl9DQo+PiArDQo+PiArCW92OTY1eC0+c2Qu Y3RybF9oYW5kbGVyID0gaGRsOw0KPj4gKwlyZXR1cm4gMDsNCj4+ICt9DQo+PiArDQo+PiAvKg0K Pj4gICAqIFY0TDIgc3ViZGV2IHZpZGVvIGFuZCBwYWQgbGV2ZWwgb3BlcmF0aW9ucw0KPj4gICAq Lw0KPj4gQEAgLTE1MTgsOSArMTkyNCwxNSBAQCBzdGF0aWMgaW50IG92OTY1eF9kZXRlY3Rfc2Vu c29yKHN0cnVjdCB2NGwyX3N1YmRldiAqc2QpDQo+Pg0KPj4gCWlmICghcmV0KSB7DQo+PiAJCW92 OTY1eC0+aWQgPSBPVjk2NVhfSUQocGlkLCB2ZXIpOw0KPj4gLQkJaWYgKG92OTY1eC0+aWQgPT0g T1Y5NjUwX0lEIHx8IG92OTY1eC0+aWQgPT0gT1Y5NjUyX0lEKSB7DQo+PiArCQlzd2l0Y2ggKG92 OTY1eC0+aWQpIHsNCj4+ICsJCWNhc2UgT1Y5NjUwX0lEOg0KPj4gKwkJY2FzZSBPVjk2NTJfSUQ6 DQo+PiAJCQl2NGwyX2luZm8oc2QsICJGb3VuZCBPViUwNFggc2Vuc29yXG4iLCBvdjk2NXgtPmlk KTsNCj4+IC0JCX0gZWxzZSB7DQo+PiArCQkJYnJlYWs7DQo+PiArCQljYXNlIE9WOTY1NVY1X0lE Og0KPj4gKwkJCXY0bDJfaW5mbyhzZCwgIkZvdW5kIE9WJTA0WCBzZW5zb3JcbiIsIG92OTY1eC0+ aWQgLSAyKTsNCj4+ICsJCQlicmVhazsNCj4+ICsJCWRlZmF1bHQ6DQo+PiAJCQl2NGwyX2Vycihz ZCwgIlNlbnNvciBkZXRlY3Rpb24gZmFpbGVkICglMDRYLCAlZClcbiIsDQo+PiAJCQkJIG92OTY1 eC0+aWQsIHJldCk7DQo+PiAJCQlyZXQgPSAtRU5PREVWOw0KPj4gQEAgLTE1OTgsMTggKzIwMTAs MjggQEAgc3RhdGljIGludCBvdjk2NXhfcHJvYmUoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwN Cj4+IAlpZiAocmV0IDwgMCkNCj4+IAkJZ290byBlcnJfbWU7DQo+Pg0KPj4gLQlvdjk2NXgtPmlu aXRfcmVncyA9IG92OTY1eF9pbml0X3JlZ3M7DQo+PiAtCW92OTY1eC0+aW5pdGlhbGl6ZV9jb250 cm9scyA9IG92OTY1eF9pbml0aWFsaXplX2NvbnRyb2xzOw0KPj4gLQlvdjk2NXgtPmZyYW1lc2l6 ZXMgPSBvdjk2NXhfZnJhbWVzaXplczsNCj4+IC0Jb3Y5NjV4LT5uYl9vZl9mcmFtZXNpemVzID0g QVJSQVlfU0laRShvdjk2NXhfZnJhbWVzaXplcyk7DQo+PiAtCW92OTY1eC0+Zm9ybWF0cyA9IG92 OTY1eF9mb3JtYXRzOw0KPj4gLQlvdjk2NXgtPm5iX29mX2Zvcm1hdHMgPSBBUlJBWV9TSVpFKG92 OTY1eF9mb3JtYXRzKTsNCj4+IC0Jb3Y5NjV4LT5pbnRlcnZhbHMgPSBvdjk2NXhfaW50ZXJ2YWxz Ow0KPj4gLQlvdjk2NXgtPm5iX29mX2ludGVydmFscyA9IEFSUkFZX1NJWkUob3Y5NjV4X2ludGVy dmFscyk7DQo+PiAtCW92OTY1eC0+Zml2ID0gJm92OTY1eF9pbnRlcnZhbHNbMF07DQo+PiAtCW92 OTY1eC0+c2V0X2ZyYW1lX2ludGVydmFsID0gX19vdjk2NXhfc2V0X2ZyYW1lX2ludGVydmFsOw0K Pj4gLQlvdjk2NXgtPnVwZGF0ZV9leHBvc3VyZV9jdHJsID0gb3Y5NjV4X3VwZGF0ZV9leHBvc3Vy ZV9jdHJsOw0KPj4gLQlvdjk2NXgtPnNldF9wYXJhbXMgPSBfX292OTY1eF9zZXRfcGFyYW1zOw0K Pj4gKwlpZiAob3Y5NjV4LT5pZCAhPSBPVjk2NTVWNV9JRCkgew0KPj4gKwkJb3Y5NjV4LT5pbml0 X3JlZ3MgPSBvdjk2NXhfaW5pdF9yZWdzOw0KPj4gKwkJb3Y5NjV4LT5pbml0aWFsaXplX2NvbnRy b2xzID0gb3Y5NjV4X2luaXRpYWxpemVfY29udHJvbHM7DQo+PiArCQlvdjk2NXgtPmZyYW1lc2l6 ZXMgPSBvdjk2NXhfZnJhbWVzaXplczsNCj4+ICsJCW92OTY1eC0+bmJfb2ZfZnJhbWVzaXplcyA9 IEFSUkFZX1NJWkUob3Y5NjV4X2ZyYW1lc2l6ZXMpOw0KPj4gKwkJb3Y5NjV4LT5mb3JtYXRzID0g b3Y5NjV4X2Zvcm1hdHM7DQo+PiArCQlvdjk2NXgtPm5iX29mX2Zvcm1hdHMgPSBBUlJBWV9TSVpF KG92OTY1eF9mb3JtYXRzKTsNCj4+ICsJCW92OTY1eC0+aW50ZXJ2YWxzID0gb3Y5NjV4X2ludGVy dmFsczsNCj4+ICsJCW92OTY1eC0+bmJfb2ZfaW50ZXJ2YWxzID0gQVJSQVlfU0laRShvdjk2NXhf aW50ZXJ2YWxzKTsNCj4+ICsJCW92OTY1eC0+Zml2ID0gJm92OTY1eF9pbnRlcnZhbHNbMF07DQo+ PiArCQlvdjk2NXgtPnNldF9mcmFtZV9pbnRlcnZhbCA9IF9fb3Y5NjV4X3NldF9mcmFtZV9pbnRl cnZhbDsNCj4+ICsJCW92OTY1eC0+dXBkYXRlX2V4cG9zdXJlX2N0cmwgPSBvdjk2NXhfdXBkYXRl X2V4cG9zdXJlX2N0cmw7DQo+PiArCQlvdjk2NXgtPnNldF9wYXJhbXMgPSBfX292OTY1eF9zZXRf cGFyYW1zOw0KPj4gKwl9IGVsc2Ugew0KPj4gKwkJb3Y5NjV4LT5pbml0X3JlZ3MgPSBvdjk2NTVf aW5pdF9yZWdzOw0KPj4gKwkJb3Y5NjV4LT5pbml0aWFsaXplX2NvbnRyb2xzID0gb3Y5NjU1X2lu aXRpYWxpemVfY29udHJvbHM7DQo+PiArCQlvdjk2NXgtPmZyYW1lc2l6ZXMgPSBvdjk2NTVfZnJh bWVzaXplczsNCj4+ICsJCW92OTY1eC0+bmJfb2ZfZnJhbWVzaXplcyA9IEFSUkFZX1NJWkUob3Y5 NjU1X2ZyYW1lc2l6ZXMpOw0KPj4gKwkJb3Y5NjV4LT5mb3JtYXRzID0gb3Y5NjU1X2Zvcm1hdHM7 DQo+PiArCQlvdjk2NXgtPm5iX29mX2Zvcm1hdHMgPSBBUlJBWV9TSVpFKG92OTY1NV9mb3JtYXRz KTsNCj4+ICsJCW92OTY1eC0+c2V0X3BhcmFtcyA9IG92OTY1eF9zZXRfZnJhbWVfc2l6ZTsNCj4+ ICsJfTsNCj4+DQo+PiAJb3Y5NjV4LT5mcmFtZV9zaXplID0gJm92OTY1eC0+ZnJhbWVzaXplc1sw XTsNCj4+IAlvdjk2NXhfZ2V0X2RlZmF1bHRfZm9ybWF0KG92OTY1eCwgJm92OTY1eC0+Zm9ybWF0 KTsNCj4+IEBAIC0xNjUyLDYgKzIwNzQsNyBAQCBzdGF0aWMgaW50IG92OTY1eF9yZW1vdmUoc3Ry dWN0IGkyY19jbGllbnQgKmNsaWVudCkNCj4+IHN0YXRpYyBjb25zdCBzdHJ1Y3QgaTJjX2Rldmlj ZV9pZCBvdjk2NXhfaWRbXSA9IHsNCj4+IAl7ICJPVjk2NTAiLCAweDk2NTAgfSwNCj4+IAl7ICJP Vjk2NTIiLCAweDk2NTIgfSwNCj4+ICsJeyAiT1Y5NjU1IiwgMHg5NjU1IH0sDQo+IA0KPiBpMmMg ZGV2aWNlIGlkcyBzaG91bGQgYmUgbG93ZXIgY2FzZSB0byBtYXRjaCBjb21wYXRpYmxlLXN0cmlu Z3MgaW4gRFQgZm9yDQo+IGF1dG9tYXRpYyBtb2Rwcm9iaW5nLg0KPiANCj4gUGxlYXNlIHBpY2sv bWVyZ2UvY29weSZwYXN0ZQ0KPiANCj4gPGh0dHA6Ly9naXQuZ29sZGVsaWNvLmNvbS8/cD1ndGEw NC1rZXJuZWwuZ2l0O2E9YmxvYmRpZmY7Zj1kcml2ZXJzL21lZGlhL2kyYy9vdjk2NTAuYztoPWMz MTBjYmVlMTMxNjY1ODkzZDJkMWRmMGFiMTI0NmJkOWIxZDQxZmU7aHA9ZWQ1ZDBhNTNhOWM3MjAz NmQ2ZTAxNzA5NGI2ODExMWI1ZWI3ZjAwZDtoYj0xMTViOWM1OTIwMmFhMmZiMWZlY2I2OTFlYmVl ZjUxMjIwZDM2M2I4O2hwYj1kYThhZTJiMDM4YTQ0OGM4ZjgyMmIzYTRmMjBlZDM3OGRiNmQyOTM0 Pg0KPiANCj4gV2l0aCB0aGlzIGNoYW5nZSBJIGdldDoNCj4gDQo+IHJvb3RAbGV0dXg6fiMgZG1l c2d8ZmdyZXAgb3Y5Ng0KPiBbICAgMTIuNzI3NjAwXSBvdjk2NXg6IEZvdW5kIE9WOTY1NSBzZW5z b3INCj4gWyAgIDEyLjc0NzcxMV0gb3Y5NjV4IDEtMDAzMDogb3Y5NjV4IGRyaXZlciBwcm9iZWQN Cj4gcm9vdEBsZXR1eDp+Iw0KPiANCj4gZHVyaW5nIHByb2JlLg0KPiANCg0KVGhhbmtzIGZvciBw YXRjaCwgSSdsbCBmaXggaW4gdjIgIQ0KDQo+PiAJeyAvKiBzZW50aW5lbCAqLyB9DQo+PiB9Ow0K Pj4gTU9EVUxFX0RFVklDRV9UQUJMRShpMmMsIG92OTY1eF9pZCk7DQo+PiBAQCAtMTY1OSw2ICsy MDgyLDcgQEAgc3RhdGljIGludCBvdjk2NXhfcmVtb3ZlKHN0cnVjdCBpMmNfY2xpZW50ICpjbGll bnQpDQo+PiBzdGF0aWMgY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCBvdjk2NXhfb2ZfbWF0Y2hb XSA9IHsNCj4+IAl7IC5jb21wYXRpYmxlID0gIm92dGksb3Y5NjUwIiwgLmRhdGEgPSAodm9pZCAq KTB4OTY1MCB9LA0KPj4gCXsgLmNvbXBhdGlibGUgPSAib3Z0aSxvdjk2NTIiLCAuZGF0YSA9ICh2 b2lkICopMHg5NjUyIH0sDQo+PiArCXsgLmNvbXBhdGlibGUgPSAib3Z0aSxvdjk2NTUiLCAuZGF0 YSA9ICh2b2lkICopMHg5NjU1IH0sDQo+PiAJeyAvKiBzZW50aW5lbCAqLyB9DQo+PiB9Ow0KPj4g TU9EVUxFX0RFVklDRV9UQUJMRShvZiwgb3Y5NjV4X29mX21hdGNoKTsNCj4+IC0tIA0KPj4gMS45 LjENCj4+DQo+IA== -- To unsubscribe from this list: send the line "unsubscribe devicetree" in the body of a message to majordomo-u79uwXL29TY76Z2rM5mHXA@public.gmane.org More majordomo info at http://vger.kernel.org/majordomo-info.html From mboxrd@z Thu Jan 1 00:00:00 1970 Return-path: Received: from mx08-00178001.pphosted.com ([91.207.212.93]:33324 "EHLO mx07-00178001.pphosted.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1751391AbdFZLtt (ORCPT ); Mon, 26 Jun 2017 07:49:49 -0400 From: Hugues FRUCHET To: "H. Nikolaus Schaller" CC: Sylwester Nawrocki , Guennadi Liakhovetski , Rob Herring , Mark Rutland , Maxime Coquelin , Alexandre TORGUE , Mauro Carvalho Chehab , Hans Verkuil , "devicetree@vger.kernel.org" , "linux-arm-kernel@lists.infradead.org" , "linux-kernel@vger.kernel.org" , "linux-media@vger.kernel.org" , Benjamin Gaignard , Yannick FERTRE Subject: Re: [PATCH v1 6/6] [media] ov9650: add support of OV9655 variant Date: Mon, 26 Jun 2017 11:49:07 +0000 Message-ID: References: <1498143942-12682-1-git-send-email-hugues.fruchet@st.com> <1498143942-12682-7-git-send-email-hugues.fruchet@st.com> In-Reply-To: Content-Language: en-US Content-Type: text/plain; charset="utf-8" Content-ID: Content-Transfer-Encoding: base64 MIME-Version: 1.0 Sender: linux-media-owner@vger.kernel.org List-ID: DQoNCk9uIDA2LzI2LzIwMTcgMDg6MDMgQU0sIEguIE5pa29sYXVzIFNjaGFsbGVyIHdyb3RlOg0K PiANCj4+IEFtIDIyLjA2LjIwMTcgdW0gMTc6MDUgc2NocmllYiBIdWd1ZXMgRnJ1Y2hldCA8aHVn dWVzLmZydWNoZXRAc3QuY29tPjoNCj4+DQo+PiBBZGQgYSBmaXJzdCBzdXBwb3J0IG9mIE9WOTY1 NSB2YXJpYW50Lg0KPj4gQmVjYXVzZSBvZiByZWdpc3RlciBzZXQgc2xpZ2h0bHkgZGlmZmVyZW50 IGZyb20gT1Y5NjUwLzk2NTIsDQo+PiBub3QgYWxsIG9mIHRoZSBkcml2ZXIgZmVhdHVyZXMgYXJl IHN1cHBvcnRlZCAoY29udHJvbHMpLg0KPj4gU3VwcG9ydGVkIHJlc29sdXRpb25zIGFyZSBsaW1p dGVkIHRvIFZHQSwgUVZHQSwgUVFWR0EuDQo+PiBTdXBwb3J0ZWQgZm9ybWF0IGlzIGxpbWl0ZWQg dG8gUkdCNTY1Lg0KPj4gQ29udHJvbHMgYXJlIGxpbWl0ZWQgdG8gY29sb3IgYmFyIHRlc3QgcGF0 dGVybiBmb3IgdGVzdCBwdXJwb3NlLg0KPj4NCj4+IFNpZ25lZC1vZmYtYnk6IEguIE5pa29sYXVz IFNjaGFsbGVyIDxobnNAZ29sZGVsaWNvLmNvbT4NCj4+IFNpZ25lZC1vZmYtYnk6IEh1Z3VlcyBG cnVjaGV0IDxodWd1ZXMuZnJ1Y2hldEBzdC5jb20+DQo+PiAtLS0NCj4+IGRyaXZlcnMvbWVkaWEv aTJjL0tjb25maWcgIHwgICA0ICstDQo+PiBkcml2ZXJzL21lZGlhL2kyYy9vdjk2NTAuYyB8IDQ4 NiArKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKystLS0NCj4+IDIgZmls ZXMgY2hhbmdlZCwgNDU3IGluc2VydGlvbnMoKyksIDMzIGRlbGV0aW9ucygtKQ0KPj4NCj4+IGRp ZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2kyYy9LY29uZmlnIGIvZHJpdmVycy9tZWRpYS9pMmMv S2NvbmZpZw0KPj4gaW5kZXggZWZlYTE0ZC4uYThmNjM4YyAxMDA2NDQNCj4+IC0tLSBhL2RyaXZl cnMvbWVkaWEvaTJjL0tjb25maWcNCj4+ICsrKyBiL2RyaXZlcnMvbWVkaWEvaTJjL0tjb25maWcN Cj4+IEBAIC01OTQsMTEgKzU5NCwxMSBAQCBjb25maWcgVklERU9fT1Y3NjcwDQo+PiAJICBjb250 cm9sbGVyLg0KPj4NCj4+IGNvbmZpZyBWSURFT19PVjk2NTANCj4+IC0JdHJpc3RhdGUgIk9tbmlW aXNpb24gT1Y5NjUwL09WOTY1MiBzZW5zb3Igc3VwcG9ydCINCj4+ICsJdHJpc3RhdGUgIk9tbmlW aXNpb24gT1Y5NjUwL09WOTY1Mi9PVjk2NTUgc2Vuc29yIHN1cHBvcnQiDQo+PiAJZGVwZW5kcyBv biBHUElPTElCICYmIEkyQyAmJiBWSURFT19WNEwyICYmIFZJREVPX1Y0TDJfU1VCREVWX0FQSQ0K Pj4gCS0tLWhlbHAtLS0NCj4+IAkgIFRoaXMgaXMgYSBWNEwyIHNlbnNvci1sZXZlbCBkcml2ZXIg Zm9yIHRoZSBPbW5pdmlzaW9uDQo+PiAtCSAgT1Y5NjUwIGFuZCBPVjk2NTIgY2FtZXJhIHNlbnNv cnMuDQo+PiArCSAgT1Y5NjUwIGFuZCBPVjk2NTIgYW5kIE9WOTY1NSBjYW1lcmEgc2Vuc29ycy4N Cj4+DQo+PiBjb25maWcgVklERU9fVlM2NjI0DQo+PiAJdHJpc3RhdGUgIlNUIFZTNjYyNCBzZW5z b3Igc3VwcG9ydCINCj4+IGRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2kyYy9vdjk2NTAuYyBi L2RyaXZlcnMvbWVkaWEvaTJjL292OTY1MC5jDQo+PiBpbmRleCBhOWQyNjhkLi5jMDgxOWFmIDEw MDY0NA0KPj4gLS0tIGEvZHJpdmVycy9tZWRpYS9pMmMvb3Y5NjUwLmMNCj4+ICsrKyBiL2RyaXZl cnMvbWVkaWEvaTJjL292OTY1MC5jDQo+PiBAQCAtMSw1ICsxLDUgQEANCj4+IC8qDQo+PiAtICog T21uaXZpc2lvbiBPVjk2NTAvT1Y5NjUyIENNT1MgSW1hZ2UgU2Vuc29yIGRyaXZlcg0KPj4gKyAq IE9tbml2aXNpb24gT1Y5NjUwL09WOTY1Mi9PVjk2NTUgQ01PUyBJbWFnZSBTZW5zb3IgZHJpdmVy DQo+PiAgICoNCj4+ICAgKiBDb3B5cmlnaHQgKEMpIDIwMTMsIFN5bHdlc3RlciBOYXdyb2NraSA8 c3lsdmVzdGVyLm5hd3JvY2tpQGdtYWlsLmNvbT4NCj4+ICAgKg0KPj4gQEAgLTcsNiArNywxNSBA QA0KPj4gICAqIGJ5IFZsYWRpbWlyIEZvbm92Lg0KPj4gICAqIENvcHlyaWdodCAoYykgMjAxMCwg VmxhZGltaXIgRm9ub3YNCj4+ICAgKg0KPj4gKyAqDQo+PiArICogQ29weXJpZ2h0IChDKSBTVE1p Y3JvZWxlY3Ryb25pY3MgU0EgMjAxNw0KPj4gKyAqIEF1dGhvcjogSHVndWVzIEZydWNoZXQgPGh1 Z3Vlcy5mcnVjaGV0QHN0LmNvbT4gZm9yIFNUTWljcm9lbGVjdHJvbmljcy4NCj4+ICsgKg0KPj4g KyAqIE9WOTY1NSBpbml0aWFsIHN1cHBvcnQgYmFzZWQgb24gYSBkcml2ZXIgd3JpdHRlbiBieSBI LiBOaWtvbGF1cyBTY2hhbGxlcjoNCj4+ICsgKiAgIGh0dHA6Ly9naXQuZ29sZGVsaWNvLmNvbS8/ cD1ndGEwNC1rZXJuZWwuZ2l0O2E9c2hvcnRsb2c7aD1yZWZzL2hlYWRzL3dvcmsvaG5zL3ZpZGVv L292OTY1NQ0KPj4gKyAqIE9WOTY1NSByZWdpc3RlcnMgc2VxdWVuY2UgZnJvbSBTVE0zMkN1YmVG NyBlbWJlZGRlZCBzb2Z0d2FyZSwgc2VlOg0KPj4gKyAqICAgaHR0cHM6Ly9kZXZlbG9wZXIubWJl ZC5vcmcvdGVhbXMvU1QvY29kZS9CU1BfRElTQ09fRjc0Nk5HL2ZpbGUvZTFkOWRhN2ZlODU2L0Ry aXZlcnMvQlNQL0NvbXBvbmVudHMvb3Y5NjU1L292OTY1NS5jDQo+PiArICoNCj4+ICAgKiBUaGlz IHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29y IG1vZGlmeQ0KPj4gICAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVi bGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzDQo+PiAgICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNv ZnR3YXJlIEZvdW5kYXRpb24uDQo+PiBAQCAtNTgsMTQgKzY3LDIxIEBADQo+PiAjZGVmaW5lIFJF R19QSUQJCQkweDBhCS8qIFByb2R1Y3QgSUQgTVNCICovDQo+PiAjZGVmaW5lIFJFR19WRVIJCQkw eDBiCS8qIFByb2R1Y3QgSUQgTFNCICovDQo+PiAjZGVmaW5lIFJFR19DT00zCQkweDBjDQo+PiAt I2RlZmluZSAgQ09NM19TV0FQCQkweDQwDQo+PiArI2RlZmluZSAgQ09NM19DT0xPUkJBUgkJMHg4 MA0KPj4gKyNkZWZpbmUgIENPTTNfUkdCNTY1CQkweDAwDQo+PiArI2RlZmluZSAgQ09NM19TV0FQ CQkweDQwCS8qIERvZXNuJ3Qgd29yayBpbiBSR0IgKi8NCj4+ICsjZGVmaW5lICBDT00zX1JFU0VU QgkJMHgwOA0KPj4gI2RlZmluZSAgQ09NM19WQVJJT1BJWEVMMQkweDA0DQo+PiArI2RlZmluZSAg T1Y5NjU1X1NJTkdMRUZSQU1FCTB4MDENCj4+ICNkZWZpbmUgUkVHX0NPTTQJCTB4MGQJLyogVmFy aW8gUGl4ZWxzICAqLw0KPj4gI2RlZmluZSAgQ09NNF9WQVJJT1BJWEVMMgkweDgwDQo+PiArI2Rl ZmluZSAgT1Y5NjU1X1RSSVNUQVRFCQkvKiBzZWVtcyB0byBoYXZlIGEgZGlmZmVyZW50IGZ1bmN0 aW9uICovDQo+PiAjZGVmaW5lIFJFR19DT001CQkweDBlCS8qIFN5c3RlbSBjbG9jayBvcHRpb25z ICovDQo+PiAjZGVmaW5lICBDT001X1NMQVZFX01PREUJMHgxMA0KPj4gLSNkZWZpbmUgIENPTTVf U1lTVEVNQ0xPQ0s0OE1IWgkweDgwDQo+PiArI2RlZmluZSAgQ09NNV9TWVNURU1DTE9DSzQ4TUha CTB4ODAJLyogbm90IG9uIE9WOTY1NSAqLw0KPj4gKyNkZWZpbmUgIE9WOTY1NV9FWFBPU1VSRVNU RVAJMHgwMQ0KPj4gI2RlZmluZSBSRUdfQ09NNgkJMHgwZgkvKiBIUkVGICYgQURCTEMgb3B0aW9u cyAqLw0KPj4gKyNkZWZpbmUgIENPTTZfQkxDX09QVElDQUwJMHg0MAkvKiBPcHRpY2FsIGJsYWNr ICovDQo+PiAjZGVmaW5lIFJFR19BRUNICQkweDEwCS8qIEV4cG9zdXJlIHZhbHVlLCBBRUNbOToy XSAqLw0KPj4gI2RlZmluZSBSRUdfQ0xLUkMJCTB4MTEJLyogQ2xvY2sgY29udHJvbCAqLw0KPj4g I2RlZmluZSAgQ0xLX0VYVAkJMHg0MAkvKiBVc2UgZXh0ZXJuYWwgY2xvY2sgZGlyZWN0bHkgKi8N Cj4+IEBAIC03NCwxMyArOTAsMTggQEANCj4+ICNkZWZpbmUgIENPTTdfUkVTRVQJCTB4ODANCj4+ ICNkZWZpbmUgIENPTTdfRk1UX01BU0sJCTB4MzgNCj4+ICNkZWZpbmUgIENPTTdfRk1UX1ZHQQkJ MHg0MA0KPj4gLSNkZWZpbmUJIENPTTdfRk1UX0NJRgkJMHgyMA0KPj4gKyNkZWZpbmUgIENPTTdf Rk1UX0NJRgkJMHgyMA0KPj4gI2RlZmluZSAgQ09NN19GTVRfUVZHQQkJMHgxMA0KPj4gI2RlZmlu ZSAgQ09NN19GTVRfUUNJRgkJMHgwOA0KPj4gLSNkZWZpbmUJIENPTTdfUkdCCQkweDA0DQo+PiAt I2RlZmluZQkgQ09NN19ZVVYJCTB4MDANCj4+IC0jZGVmaW5lCSBDT003X0JBWUVSCQkweDAxDQo+ PiAtI2RlZmluZQkgQ09NN19QQkFZRVIJCTB4MDUNCj4+ICsjZGVmaW5lICBDT003X1JHQgkJMHgw NA0KPj4gKyNkZWZpbmUgIENPTTdfWVVWCQkweDAwDQo+PiArI2RlZmluZSAgQ09NN19CQVlFUgkJ MHgwMQ0KPj4gKyNkZWZpbmUgIENPTTdfUEJBWUVSCQkweDA1DQo+PiArI2RlZmluZSAgT1Y5NjU1 X0NPTTdfVkdBCTB4NjANCj4+ICsjZGVmaW5lICBPVjk2NTVfQ09NN19SQVdSR0IJMHgwMAkvKiBk aWZmZXJlbnQgZm9ybWF0IGVuY29kaW5nICovDQo+PiArI2RlZmluZSAgT1Y5NjU1X0NPTTdfUkFX UkdCSU5UCTB4MDENCj4+ICsjZGVmaW5lICBPVjk2NTVfQ09NN19ZVVYJMHgwMg0KPj4gKyNkZWZp bmUgIE9WOTY1NV9DT003X1JHQgkweDAzDQo+PiAjZGVmaW5lIFJFR19DT004CQkweDEzCS8qIEFH Qy9BRUMgb3B0aW9ucyAqLw0KPj4gI2RlZmluZSAgQ09NOF9GQVNUQUVDCQkweDgwCS8qIEVuYWJs ZSBmYXN0IEFHQy9BRUMgKi8NCj4+ICNkZWZpbmUgIENPTThfQUVDU1RFUAkJMHg0MAkvKiBVbmxp bWl0ZWQgQUVDIHN0ZXAgc2l6ZSAqLw0KPj4gQEAgLTg5LDE0ICsxMTAsMjMgQEANCj4+ICNkZWZp bmUgIENPTThfQVdCCQkweDAyCS8qIFdoaXRlIGJhbGFuY2UgZW5hYmxlICovDQo+PiAjZGVmaW5l ICBDT004X0FFQwkJMHgwMQkvKiBBdXRvIGV4cG9zdXJlIGVuYWJsZSAqLw0KPj4gI2RlZmluZSBS RUdfQ09NOQkJMHgxNAkvKiBHYWluIGNlaWxpbmcgKi8NCj4+IC0jZGVmaW5lICBDT005X0dBSU5f Q0VJTF9NQVNLCTB4NzAJLyogKi8NCj4+ICsjZGVmaW5lICBDT005X0dBSU5fQ0VJTF9NQVNLCTB4 NzANCj4+ICsjZGVmaW5lICBDT005X0dBSU5fQ0VJTF8xNlgJMHgzMA0KPj4gKyNkZWZpbmUgIE9W OTY1NV9DT005X0VYUFRJTUlORwkweDA4DQo+PiArI2RlZmluZSAgT1Y5NjU1X0NPTTlfVlNZTkNE Uk9QCTB4MDQNCj4+ICsjZGVmaW5lICBPVjk2NTVfQ09NOV9BRUNEUk9QCTB4MDINCj4+ICNkZWZp bmUgUkVHX0NPTTEwCQkweDE1CS8qIFBDTEssIEhSRUYsIEhTWU5DIHNpZ25hbHMgcG9sYXJpdHkg Ki8NCj4+ICsjZGVmaW5lICBPVjk2NTVfU0xBVkVfUElOCTB4ODAJLyogU0xIUy9TTFZTIGluc3Rl YWQgb2YgUkVTRVRCL1BXRE4gKi8NCj4+ICNkZWZpbmUgIENPTTEwX0hTWU5DCQkweDQwCS8qIEhT WU5DIGluc3RlYWQgb2YgSFJFRiAqLw0KPj4gI2RlZmluZSAgQ09NMTBfUENMS19IQgkJMHgyMAkv KiBTdXBwcmVzcyBQQ0xLIG9uIGhvcml6IGJsYW5rICovDQo+PiAtI2RlZmluZSAgQ09NMTBfSFJF Rl9SRVYJCTB4MDgJLyogUmV2ZXJzZSBIUkVGICovDQo+PiArI2RlZmluZSAgT1Y5NjU1X0NPTTEw X1BDTEtfUkVWCQkweDEwCS8qIFBDTEsgcmV2ZXJzZSAqLw0KPj4gKyNkZWZpbmUgIENPTTEwX0hS RUZfUkVWCTB4MDgJLyogUmV2ZXJzZSBIUkVGICovDQo+PiAjZGVmaW5lICBDT00xMF9WU19MRUFE CQkweDA0CS8qIFZTWU5DIG9uIGNsb2NrIGxlYWRpbmcgZWRnZSAqLw0KPj4gKyNkZWZpbmUgIE9W OTY1NV9DT00xMF9SRVNFVF9PUFRJT04JMHgwNAkvKiBSZXNldCBzaWduYWwgZW5kIHBvaW50ICov DQo+PiAjZGVmaW5lICBDT00xMF9WU19ORUcJCTB4MDIJLyogVlNZTkMgbmVnYXRpdmUgKi8NCj4+ ICNkZWZpbmUgIENPTTEwX0hTX05FRwkJMHgwMQkvKiBIU1lOQyBuZWdhdGl2ZSAqLw0KPj4gKyNk ZWZpbmUgT1Y5NjU1X1JFRzE2CQkweDE2CS8qIGR1bW15IGZyYW1lIGFuZCBibGFua2luZyAqLw0K Pj4gKyNkZWZpbmUgICBPVjk2NTVfUkVHMTZfRFVNTVlfOAkweDIwCS8qIGR1bW15IGZyYW1lIHdo ZW4gZ2FpbiA+IDggKi8NCj4+ICNkZWZpbmUgUkVHX0hTVEFSVAkJMHgxNwkvKiBIb3JpeiBzdGFy dCBoaWdoIGJpdHMgKi8NCj4+ICNkZWZpbmUgUkVHX0hTVE9QCQkweDE4CS8qIEhvcml6IHN0b3Ag aGlnaCBiaXRzICovDQo+PiAjZGVmaW5lIFJFR19WU1RBUlQJCTB4MTkJLyogVmVydCBzdGFydCBo aWdoIGJpdHMgKi8NCj4+IEBAIC0xMTcsNiArMTQ3LDcgQEANCj4+ICNkZWZpbmUgUkVHX0JCSUFT CQkweDI3CS8qIEIgY2hhbm5lbCBvdXRwdXQgYmlhcyAqLw0KPj4gI2RlZmluZSBSRUdfR0JCSUFT CQkweDI4CS8qIEdiIGNoYW5uZWwgb3V0cHV0IGJpYXMgKi8NCj4+ICNkZWZpbmUgUkVHX0dSQ09N CQkweDI5CS8qIEFuYWxvZyBCTEMgJiByZWd1bGF0b3IgKi8NCj4+ICsjZGVmaW5lIE9WOTY1NV9Q UkVHQUlOCQkweDI5DQo+PiAjZGVmaW5lIFJFR19FWEhDSAkJMHgyYQkvKiBEdW1teSBwaXhlbCBp bnNlcnQgTVNCICovDQo+PiAjZGVmaW5lIFJFR19FWEhDTAkJMHgyYgkvKiBEdW1teSBwaXhlbCBp bnNlcnQgTFNCICovDQo+PiAjZGVmaW5lIFJFR19SQklBUwkJMHgyYwkvKiBSIGNoYW5uZWwgb3V0 cHV0IGJpYXMgKi8NCj4+IEBAIC0xMjcsMTIgKzE1OCwzMCBAQA0KPj4gI2RlZmluZSBSRUdfSFNZ RU4JCTB4MzEJLyogSFNZTkMgZmFsbGluZyBlZGdlIGRlbGF5IExTQiovDQo+PiAjZGVmaW5lIFJF R19IUkVGCQkweDMyCS8qIEhSRUYgcGllY2VzICovDQo+PiAjZGVmaW5lIFJFR19DSExGCQkweDMz CS8qIHJlc2VydmVkICovDQo+PiArI2RlZmluZSBPVjk2NTVfQ0xLRgkJMHgzMwkvKiBBcnJheSBj dXJyZW50IGNvbnRyb2wgKi8NCj4+ICsjZGVmaW5lIE9WOTY1NV9BUkVGMQkJMHgzNAkvKiBBcnJh eSByZWZlcmVuY2UgY29udHJvbCAqLw0KPj4gKyNkZWZpbmUgT1Y5NjU1X0FSRUYyCQkweDM1CS8q IEFycmF5IHJlZmVyZW5jZSBjb250cm9sICovDQo+PiArI2RlZmluZSBPVjk2NTVfQVJFRjMJCTB4 MzYJLyogQXJyYXkgcmVmZXJlbmNlIGNvbnRyb2wgKi8NCj4+ICNkZWZpbmUgUkVHX0FEQwkJCTB4 MzcJLyogcmVzZXJ2ZWQgKi8NCj4+ICsjZGVmaW5lIE9WOTY1NV9BREMJCTB4MzcJLyogQURDIENv bnRyb2wgMSAoUmFuZ2UgYWRqdXN0bWVudCkgKi8NCj4+ICNkZWZpbmUgUkVHX0FDT00JCTB4MzgJ LyogcmVzZXJ2ZWQgKi8NCj4+IC0jZGVmaW5lIFJFR19PRk9OCQkweDM5CS8qIFBvd2VyIGRvd24g cmVnaXN0ZXIgKi8NCj4+ICsjZGVmaW5lIE9WOTY1NV9BREMyCQkweDM4CS8qIEFEQyBDb250cm9s IDIgKFJhbmdlIGFkanVzdG1lbnQpICovDQo+PiArI2RlZmluZSBSRUdfT0ZPTgkJMHgzOQkvKiBQ b3dlciBkb3duIHJlZ2lzdGVyIChvdjk2NTAgb25seSkgKi8NCj4+ICNkZWZpbmUgIE9GT05fUFdS RE4JCTB4MDgJLyogUG93ZXIgZG93biBiaXQgKi8NCj4+ICsjZGVmaW5lIE9WOTY1NV9BUkVGNAkJ MHgzOQkvKiBBcnJheSByZWZlcmVuY2UgY29udHJvbCAqLw0KPj4gI2RlZmluZSBSRUdfVFNMQgkJ MHgzYQkvKiBZVVZVIGZvcm1hdCAqLw0KPj4gKyNkZWZpbmUgIE9WOTY1NV9QQ0xLREVMQVkyTlMJ MHg0MA0KPj4gKyNkZWZpbmUgIE9WOTY1NV9QQ0xLREVMQVk0TlMJMHg4MA0KPj4gKyNkZWZpbmUg IE9WOTY1NV9QQ0xLREVMQVk2TlMJMHhjMA0KPj4gKyNkZWZpbmUgIE9WOTY1NV9PVVRSRVZFUlNF CTB4MjANCj4+ICsjZGVmaW5lICBPVjk2NTVfRklYRURVVgkweDEwDQo+PiAjZGVmaW5lICBUU0xC X1lVWVZfTUFTSwkJMHgwYwkvKiBVWVZZIG9yIFZZVVkgLSBzZWUgY29tMTMgKi8NCj4+ICsjZGVm aW5lICBUU0xCX1lVWVYJCTB4MDANCj4+ICsjZGVmaW5lICBUU0xCX1lWWVUJCTB4MDQNCj4+ICsj ZGVmaW5lICBUU0xCX1ZZVVkJCTB4MDgNCj4+ICsjZGVmaW5lICBUU0xCX1VZVlkJCTB4MGMNCj4+ ICsjZGVmaW5lICBPVjk2NTVfQkFORElOR0FVVE8JMHgwMg0KPj4gKw0KPj4gI2RlZmluZSBSRUdf Q09NMTEJCTB4M2IJLyogTmlnaHQgbW9kZSwgYmFuZGluZyBmaWx0ZXIgZW5hYmxlICovDQo+PiAj ZGVmaW5lICBDT00xMV9OSUdIVAkJMHg4MAkvKiBOaWdodCBtb2RlIGVuYWJsZSAqLw0KPj4gI2Rl ZmluZSAgQ09NMTFfTk1GUgkJMHg2MAkvKiBUd28gYml0IE5NIGZyYW1lIHJhdGUgKi8NCj4+IEBA IC0xNDIsMjUgKzE5MSwzOCBAQA0KPj4gI2RlZmluZSAgQ09NMTJfSFJFRgkJMHg4MAkvKiBIUkVG IGFsd2F5cyAqLw0KPj4gI2RlZmluZSBSRUdfQ09NMTMJCTB4M2QJLyogR2FtbWEgc2VsZWN0aW9u LCBDb2xvciBtYXRyaXggZW4uICovDQo+PiAjZGVmaW5lICBDT00xM19HQU1NQQkJMHg4MAkvKiBH YW1tYSBlbmFibGUgKi8NCj4+IC0jZGVmaW5lCSBDT00xM19VVlNBVAkJMHg0MAkvKiBVViBzYXR1 cmF0aW9uIGF1dG8gYWRqdXN0bWVudCAqLw0KPj4gKyNkZWZpbmUgIENPTTEzX1VWU0FUCQkweDQw CS8qIFVWIHNhdHVyYXRpb24gYXV0byBhZGp1c3RtZW50ICovDQo+PiArI2RlZmluZSAgQ09NMTNf WV9ERUxBWQkJMHgwOAkvKiBEZWxheSBZIGNoYW5uZWwgKi8NCj4+ICNkZWZpbmUgIENPTTEzX1VW U1dBUAkJMHgwMQkvKiBWIGJlZm9yZSBVIC0gdy9UU0xCICovDQo+PiAjZGVmaW5lIFJFR19DT00x NAkJMHgzZQkvKiBFZGdlIGVuaGFuY2VtZW50IG9wdGlvbnMgKi8NCj4+ICNkZWZpbmUgIENPTTE0 X0VER0VfRU4JCTB4MDINCj4+ICNkZWZpbmUgIENPTTE0X0VFRl9YMgkJMHgwMQ0KPj4gKyNkZWZp bmUgT1Y5NjU1X1JFR19DT00xNAkweDNlCS8qIHBpeGVsIGNvcnJlY3Rpb24vem9vbSBPTi9PRkYg c2VsLiAqLw0KPj4gKyNkZWZpbmUgIE9WOTY1NV9DT00xNF9CTEFDS19QSVgJMHgwOAkvKiBCbGFj ayBwaXhlbCBjb3JyZWN0aW9uICovDQo+PiArI2RlZmluZSAgT1Y5NjU1X0NPTTE0X1dISVRFX1BJ WAkweDA0CS8qIFdoaXRlIHBpeGVsIGNvcnJlY3Rpb24gKi8NCj4+ICsjZGVmaW5lICBPVjk2NTVf Q09NMTRfWk9PTQkweDAyCS8qIFpvb20gZnVuY3Rpb24gT04gKi8NCj4+ICNkZWZpbmUgUkVHX0VE R0UJCTB4M2YJLyogRWRnZSBlbmhhbmNlbWVudCBmYWN0b3IgKi8NCj4+ICNkZWZpbmUgIEVER0Vf RkFDVE9SX01BU0sJMHgwZg0KPj4gI2RlZmluZSBSRUdfQ09NMTUJCTB4NDAJLyogT3V0cHV0IHJh bmdlLCBSR0IgNTU1LzU2NSAqLw0KPj4gI2RlZmluZSAgQ09NMTVfUjEwRjAJCTB4MDAJLyogRGF0 YSByYW5nZSAxMCB0byBGMCAqLw0KPj4gLSNkZWZpbmUJIENPTTE1X1IwMUZFCQkweDgwCS8qIDAx IHRvIEZFICovDQo+PiArI2RlZmluZSAgQ09NMTVfUjAxRkUJCTB4ODAJLyogMDEgdG8gRkUgKi8N Cj4+ICNkZWZpbmUgIENPTTE1X1IwMEZGCQkweGMwCS8qIDAwIHRvIEZGICovDQo+PiAjZGVmaW5l ICBDT00xNV9SR0I1NjUJCTB4MTAJLyogUkdCNTY1IG91dHB1dCAqLw0KPj4gI2RlZmluZSAgQ09N MTVfUkdCNTU1CQkweDMwCS8qIFJHQjU1NSBvdXRwdXQgKi8NCj4+ICNkZWZpbmUgIENPTTE1X1NX QVBSQgkJMHgwNAkvKiBTd2FwIFImQiAqLw0KPj4gI2RlZmluZSBSRUdfQ09NMTYJCTB4NDEJLyog Q29sb3IgbWF0cml4IGNvZWZmIG9wdGlvbnMgKi8NCj4+ICNkZWZpbmUgUkVHX0NPTTE3CQkweDQy CS8qIFNpbmdsZSBmcmFtZSBvdXQsIGJhbmRpbmcgZmlsdGVyICovDQo+PiArI2RlZmluZSBPVjk2 NTVfUkVHX0NPTTE3CTB4NDIJLyogRGVub2lzZSwgZWRnZSwgYXV0byBnYWluLCAuLi4gKi8NCj4+ ICsjZGVmaW5lICAgT1Y5NjU1X0NPTTE3X0VER0VfQVVUTwkweDQwCS8qIEVkZ2UgYXV0byAqLw0K Pj4gKyNkZWZpbmUgICBPVjk2NTVfQ09NMTdfREVOT0lTRV9BVVRPCTB4ODAJLyogRGVub2lzZSBh dXRvICovDQo+PiArI2RlZmluZSBPVjk2NTVfUkVHX1JTVkQoX19uKQkoMHg0MyArIChfX24pIC0g MSkgLyogcmVzZXJ2ZWQgYnV0IHVzZWQuLi4gKi8NCj4+IC8qIG4gPSAxLi4uOSwgMHg0Zi4uMHg1 NyAqLw0KPj4gLSNkZWZpbmUJUkVHX01UWChfX24pCQkoMHg0ZiArIChfX24pIC0gMSkNCj4+ICsj ZGVmaW5lIFJFR19NVFgoX19uKQkJKDB4NGYgKyAoX19uKSAtIDEpDQo+PiAjZGVmaW5lIFJFR19N VFhTCQkweDU4DQo+PiArI2RlZmluZSBSRUdfQVdCT1AoX19uKQkJKDB4NTkgKyAoX19uKSAtIDEp IC8qIEFXQiBjb250cm9sIG9wdGlvbnMgKi8NCj4+ICsjZGVmaW5lIFJFR19CTE1UCQkweDVGCS8q IEFXQiBCbHVlIENvbXBvbmVudCBHYWluIExpbWl0ICovDQo+PiArI2RlZmluZSBSRUdfUkxNVAkJ MHg2MAkvKiBBV0IgUmVkIENvbXBvbmVudCBHYWluIExpbWl0ICovDQo+PiArI2RlZmluZSBSRUdf R0xNVAkJMHg2MQkvKiBBV0IgR3JlZW4gQ29tcG9uZW50IEdhaW4gTGltaXQgKi8NCj4+IC8qIExl bnMgQ29ycmVjdGlvbiBPcHRpb24gMS4uLjUsIF9fbiA9IDAuLi41ICovDQo+PiAjZGVmaW5lIFJF R19MQ0MoX19uKQkJKDB4NjIgKyAoX19uKSAtIDEpDQo+PiAjZGVmaW5lICBMQ0M1X0xDQ19FTkFC TEUJMHgwMQkvKiBMQ0M1LCBlbmFibGUgbGVucyBjb3JyZWN0aW9uICovDQo+PiBAQCAtMTcwLDEw ICsyMzIsMjYgQEANCj4+ICNkZWZpbmUgUkVHX0hWCQkJMHg2OQkvKiBNYW51YWwgYmFuZGluZyBm aWx0ZXIgTVNCICovDQo+PiAjZGVmaW5lIFJFR19NQkQJCQkweDZhCS8qIE1hbnVhbCBiYW5kaW5n IGZpbHRlciB2YWx1ZSAqLw0KPj4gI2RlZmluZSBSRUdfREJMVgkJMHg2YgkvKiByZXNlcnZlZCAq Lw0KPj4gKyNkZWZpbmUgT1Y5NjU1X1JFR19EQkxWCQkweDZiCS8qIFBMTCwgRFZERCByZWd1IGJ5 cGFzcywgYmFuZGdhcCAqLw0KPj4gKyNkZWZpbmUgIE9WOTY1NV9EQkxWX0JBTkRHQVAJMHgwYQkv KiBkZWZhdWx0IHZhbHVlICovDQo+PiArI2RlZmluZSAgT1Y5NjU1X0RCTFZfTERPX0JZUEFTUwkw eDEwDQo+PiArI2RlZmluZSAgT1Y5NjU1X0RCTFZfUExMX0JZUEFTUwkweDAwDQo+PiArI2RlZmlu ZSAgT1Y5NjU1X0RCTFZfUExMXzRYCTB4NDANCj4+ICsjZGVmaW5lICBPVjk2NTVfREJMVl9QTExf NlgJMHg4MA0KPj4gKyNkZWZpbmUgIE9WOTY1NV9EQkxWX1BMTF84WAkweGMwDQo+PiAjZGVmaW5l IFJFR19HU1AJCQkweDZjCS8qIEdhbW1hIGN1cnZlICovDQo+PiAjZGVmaW5lICBHU1BfTEVOCQkx NQ0KPj4gKyNkZWZpbmUgT1Y5NjU1X1JFR19ETlNUSAkweDcwCS8qIERlLW5vaXNlIEZ1bmN0aW9u IFRocmVzaG9sZCBBZGouICovDQo+PiArI2RlZmluZSBPVjk2NTVfUkVHX1BPSURYCTB4NzIJLyog UGl4ZWwgb3V0cHV0IGluZGV4ICovDQo+PiArI2RlZmluZSBPVjk2NTVfUkVHX1BDS0RWCTB4NzMJ LyogUGl4ZWwgQ2xvY2sgT3V0cHV0IFNlbGVjdGlvbiAqLw0KPj4gKyNkZWZpbmUgT1Y5NjU1X1JF R19YSU5EWAkweDc0CS8qIEhvcml6b250YWwgU2NhbGluZyBEb3duIENvZWZmLiAqLw0KPj4gKyNk ZWZpbmUgT1Y5NjU1X1JFR19ZSU5EWAkweDc1CS8qIFZlcnRpY2FsIFNjYWxpbmcgRG93biBDb2Vm Zi4gKi8NCj4+ICsjZGVmaW5lIE9WOTY1NV9SRUdfU0xPUAkJMHg3QQkvKiBHYW1tYSBDdXJ2ZSBI aWdoZXN0IFNlZ21lbnQgU2xvcGUgKi8NCj4+ICsjZGVmaW5lIE9WOTY1NV9SRUdfR0FNKF9fbikJ KDB4N0IgKyAoX19uKSAtIDEpCS8qIEdhbW1hIGN1cnZlICovDQo+PiAjZGVmaW5lIFJFR19HU1QJ CQkweDdjCS8qIEdhbW1hIGN1cnZlICovDQo+PiAjZGVmaW5lICBHU1RfTEVOCQkxNQ0KPj4gKyNk ZWZpbmUgT1Y5NjU1X1JFR19DT00xOAkweDhiCS8qIFpvb20gbW9kZSBpbiBWR0EgKi8NCj4+ICsj ZGVmaW5lIE9WOTY1NV9SRUdfQ09NMTkJMHg4YwkvKiBVViBhZGp1c3RtZW50ICovDQo+PiAjZGVm aW5lIFJFR19DT00yMQkJMHg4Yg0KPj4gI2RlZmluZSBSRUdfQ09NMjIJCTB4OGMJLyogRWRnZSBl bmhhbmNlbWVudCwgZGVub2lzaW5nICovDQo+PiAjZGVmaW5lICBDT00yMl9XSFRQQ09SCQkweDAy CS8qIFdoaXRlIHBpeGVsIGNvcnJlY3Rpb24gZW5hYmxlICovDQo+PiBAQCAtMTgxLDYgKzI1OSw4 IEBADQo+PiAjZGVmaW5lICBDT00yMl9ERU5PSVNFCQkweDEwCS8qIFdoaXRlIHBpeGVsIGNvcnJl Y3Rpb24gb3B0aW9uICovDQo+PiAjZGVmaW5lIFJFR19DT00yMwkJMHg4ZAkvKiBDb2xvciBiYXIg dGVzdCwgY29sb3IgZ2FpbiAqLw0KPj4gI2RlZmluZSAgQ09NMjNfVEVTVF9NT0RFCTB4MTANCj4+ ICsjZGVmaW5lIE9WOTY1NV9SRUdfQ09NMjAJMHg4ZA0KPj4gKyNkZWZpbmUgIE9WOTY1NV9DT00y MF9URVNUX01PREUJMHgxMA0KPj4gI2RlZmluZSBSRUdfREJMQzEJCTB4OGYJLyogRGlnaXRhbCBC TEMgKi8NCj4+ICNkZWZpbmUgUkVHX0RCTENfQgkJMHg5MAkvKiBEaWdpdGFsIEJMQyBCIGNoYW5u ZWwgb2Zmc2V0ICovDQo+PiAjZGVmaW5lIFJFR19EQkxDX1IJCTB4OTEJLyogRGlnaXRhbCBCTEMg UiBjaGFubmVsIG9mZnNldCAqLw0KPj4gQEAgLTE5Myw2ICsyNzMsMTcgQEANCj4+ICNkZWZpbmUg UkVHX0FFQ0hNCQkweGExCS8qIEV4cG9zdXJlIHZhbHVlIC0gYml0cyBBRUNbMTU6MTBdICovDQo+ PiAjZGVmaW5lIFJFR19CRDUwU1QJCTB4YTIJLyogQmFuZGluZyBmaWx0ZXIgdmFsdWUgZm9yIDUw SHogKi8NCj4+ICNkZWZpbmUgUkVHX0JENjBTVAkJMHhhMwkvKiBCYW5kaW5nIGZpbHRlciB2YWx1 ZSBmb3IgNjBIeiAqLw0KPj4gKyNkZWZpbmUgT1Y5NjU1X1JFR19DT00yMQkweGE0CS8qIERpZ2l0 YWwgZ2FpbiAqLw0KPj4gKyNkZWZpbmUgT1Y5NjU1X1JFR19BV0JfR1JFRU4JMHhhNgkvKiBBV0Ig Z3JlZW4gKi8NCj4+ICsjZGVmaW5lIE9WOTY1NV9SRUdfUkVGX0E4CTB4YTgJLyogQW5hbG9nIFJl ZmVyZW5jZSBDb250cm9sICovDQo+PiArI2RlZmluZSBPVjk2NTVfUkVHX1JFRl9BOQkweGE5CS8q IEFuYWxvZyBSZWZlcmVuY2UgQ29udHJvbCAqLw0KPj4gKyNkZWZpbmUgT1Y5NjU1X1JFR19CTEMo X19uKQkoMHhhYyArIChfX24pIC0gMSkgLyogQmxhY2sgTGV2ZWwgQ29udHJvbCAqLw0KPj4gKyNk ZWZpbmUgT1Y5NjU1X1JFR19DVFJMQjQJMHhiNAkvKiBVViBhZGp1c3RtZW50ICovDQo+PiArI2Rl ZmluZSBPVjk2NTVfUkVHX0FEQk9GRgkweGJjCS8qIEFEQyBCIGNoYW5uZWwgb2Zmc2V0IHNldHRp bmcgKi8NCj4+ICsjZGVmaW5lIE9WOTY1NV9SRUdfQURST0ZGCTB4YmQJLyogQURDIFIgY2hhbm5l bCBvZmZzZXQgc2V0dGluZyAqLw0KPj4gKyNkZWZpbmUgT1Y5NjU1X1JFR19BREdCT0ZGCTB4YmUJ LyogQURDIEdiIGNoYW5uZWwgb2Zmc2V0IHNldHRpbmcgKi8NCj4+ICsjZGVmaW5lIE9WOTY1NV9S RUdfQURHRU9GRgkweGJmCS8qIEFEQyBHciBjaGFubmVsIG9mZnNldCBzZXR0aW5nICovDQo+PiAr I2RlZmluZSBPVjk2NTVfUkVHX0NPTTI0CTB4YzcJLyogUGl4ZWwgY2xvY2sgZnJlcXVlbmN5IHNl bGVjdGlvbiAqLw0KPj4gI2RlZmluZSBSRUdfTlVMTAkJMHhmZgkvKiBBcnJheSBlbmQgdG9rZW4g Ki8NCj4+DQo+PiAjZGVmaW5lIERFRl9DTEtSQwkJMHg4MA0KPj4gQEAgLTIwMCw2ICsyOTEsNyBA QA0KPj4gI2RlZmluZSBPVjk2NVhfSUQoX21zYiwgX2xzYikJKChfbXNiKSA8PCA4IHwgKF9sc2Ip KQ0KPj4gI2RlZmluZSBPVjk2NTBfSUQJCTB4OTY1MA0KPj4gI2RlZmluZSBPVjk2NTJfSUQJCTB4 OTY1Mg0KPj4gKyNkZWZpbmUgT1Y5NjU1VjVfSUQJCTB4OTY1Nw0KPj4NCj4+IHN0cnVjdCBvdjk2 NXhfY3RybHMgew0KPj4gCXN0cnVjdCB2NGwyX2N0cmxfaGFuZGxlciBoYW5kbGVyOw0KPj4gQEAg LTQ1OCw2ICs1NTAsMjkyIEBAIHN0cnVjdCBvdjk2NXhfcGl4Zm10IHsNCj4+IAl7eyAxLCAgIDI1 ICB9LCB7IFFWR0FfV0lEVEgsIFFWR0FfSEVJR0hUIH0sIDEgfSwgIC8qIDI1IGZwcyAqLw0KPj4g fTsNCj4+DQo+PiArLyogT1Y5NjU1ICovDQo+PiArc3RhdGljIGNvbnN0IHN0cnVjdCBpMmNfcnYg b3Y5NjU1X2luaXRfcmVnc1tdID0gew0KPj4gKwl7IFJFR19HQUlOLCAweDAwIH0sDQo+PiArCXsg UkVHX0JMVUUsIDB4ODAgfSwNCj4+ICsJeyBSRUdfUkVELCAweDgwIH0sDQo+PiArCXsgUkVHX1ZS RUYsIDB4MDIgfSwNCj4+ICsJeyBSRUdfQ09NMSwgMHgwMyB9LA0KPj4gKwl7IFJFR19DT00yLCAw eDAxIH0sLyogT3V0cHV0IGRyaXZlIHgyICovDQo+PiArCXsgUkVHX0NPTTMsIENPTTNfUkdCNTY1 IH0sLyogT3V0cHV0IGRyaXZlIHgyLCBSR0I1NjUgKi8NCj4+ICsJeyBSRUdfQ09NNSwgMHg2MCB8 IE9WOTY1NV9FWFBPU1VSRVNURVAgfSwvKiAweDYwID8gKi8NCj4+ICsJeyBSRUdfQ09NNiwgQ09N Nl9CTENfT1BUSUNBTCB9LA0KPj4gKwl7IFJFR19DTEtSQywgMHgwMSB9LC8qIEYoaW50ZXJuYWwg Y2xrKSA9IEYoaW5wdXQgY2xrKSAvIDIgKi8NCj4+ICsJeyBSRUdfQ09NNywgT1Y5NjU1X0NPTTdf VkdBIHwgT1Y5NjU1X0NPTTdfWVVWIH0sDQo+PiArCXsgUkVHX0NPTTgsIENPTThfRkFTVEFFQyB8 IENPTThfQUVDU1RFUCB8DQo+PiArCQkJQ09NOF9BR0MgfCBDT004X0FXQiB8IENPTThfQUVDIH0s DQo+PiArCXsgUkVHX0NPTTksIENPTTlfR0FJTl9DRUlMXzE2WCB8IE9WOTY1NV9DT005X0VYUFRJ TUlORyB8DQo+PiArCQkJT1Y5NjU1X0NPTTlfQUVDRFJPUCB9LA0KPj4gKwl7IE9WOTY1NV9SRUcx NiwgT1Y5NjU1X1JFRzE2X0RVTU1ZXzggfCAweDQgfSwNCj4+ICsJeyBSRUdfSFNUQVJULCAweDE4 IH0sDQo+PiArCXsgUkVHX0hTVE9QLCAweDA0IH0sDQo+PiArCXsgUkVHX1ZTVEFSVCwgMHgwMSB9 LA0KPj4gKwl7IFJFR19WU1RPUCwgMHg4MSB9LA0KPj4gKwl7IFJFR19NVkZQLCAweDAwIH0sLyog Tm8gbWlycm9yL2ZsaXAgKi8NCj4+ICsJeyBSRUdfQUVXLCAweDNjIH0sDQo+PiArCXsgUkVHX0FF QiwgMHgzNiB9LA0KPj4gKwl7IFJFR19WUFQsIDB4NzIgfSwNCj4+ICsJeyBSRUdfQkJJQVMsIDB4 MDggfSwNCj4+ICsJeyBSRUdfR0JCSUFTLCAweDA4IH0sDQo+PiArCXsgT1Y5NjU1X1BSRUdBSU4s IDB4MTUgfSwNCj4+ICsJeyBSRUdfRVhIQ0gsIDB4MDAgfSwNCj4+ICsJeyBSRUdfRVhIQ0wsIDB4 MDAgfSwNCj4+ICsJeyBSRUdfUkJJQVMsIDB4MDggfSwNCj4+ICsJeyBSRUdfSFJFRiwgMHgxMiB9 LC8qIFFWR0EgKi8NCj4+ICsJeyBSRUdfQ0hMRiwgMHgwMCB9LA0KPj4gKwl7IE9WOTY1NV9BUkVG MSwgMHgzZiB9LA0KPj4gKwl7IE9WOTY1NV9BUkVGMiwgMHgwMCB9LA0KPj4gKwl7IE9WOTY1NV9B UkVGMywgMHgzYSB9LA0KPj4gKwl7IE9WOTY1NV9BREMyLCAweDcyIH0sDQo+PiArCXsgT1Y5NjU1 X0FSRUY0LCAweDU3IH0sDQo+PiArCXsgUkVHX1RTTEIsIE9WOTY1NV9QQ0xLREVMQVk2TlMgfCBU U0xCX1VZVlkgfSwNCj4+ICsJeyBSRUdfQ09NMTEsIDB4MDQgfSwvKiAweDA0ID8gKi8NCj4+ICsJ eyBSRUdfQ09NMTMsIENPTTEzX0dBTU1BIHwgMHgxMCB8DQo+PiArCQkJQ09NMTNfWV9ERUxBWSB8 IENPTTEzX1VWU1dBUCB9LC8qIDB4MTAgPyAqLw0KPj4gKwl7T1Y5NjU1X1JFR19DT00xNCwgT1Y5 NjU1X0NPTTE0X1pPT00gfSwgLyogUVZHQSAqLw0KPj4gKwl7IFJFR19FREdFLCAweGMxIH0sDQo+ PiArCXsgUkVHX0NPTTE1LCBDT00xNV9SMDBGRiB9LC8qIEZ1bGwgcmFuZ2Ugb3V0cHV0ICovDQo+ PiArCXsgUkVHX0NPTTE2LCAweDQxIH0sLyogMHg0MSA/ICovDQo+PiArCXsgT1Y5NjU1X1JFR19D T00xNywgT1Y5NjU1X0NPTTE3X0VER0VfQVVUTyB8DQo+PiArCQkJT1Y5NjU1X0NPTTE3X0RFTk9J U0VfQVVUTyB9LA0KPj4gKwl7IE9WOTY1NV9SRUdfUlNWRCgxKSwgMHgwYSB9LA0KPj4gKwl7IE9W OTY1NV9SRUdfUlNWRCgyKSwgMHhmMCB9LA0KPj4gKwl7IE9WOTY1NV9SRUdfUlNWRCgzKSwgMHg0 NiB9LA0KPj4gKwl7IE9WOTY1NV9SRUdfUlNWRCg0KSwgMHg2MiB9LA0KPj4gKwl7IE9WOTY1NV9S RUdfUlNWRCg1KSwgMHgyYSB9LA0KPj4gKwl7IE9WOTY1NV9SRUdfUlNWRCg2KSwgMHgzYyB9LA0K Pj4gKwl7IE9WOTY1NV9SRUdfUlNWRCg3KSwgMHhmYyB9LA0KPj4gKwl7IE9WOTY1NV9SRUdfUlNW RCg4KSwgMHhmYyB9LA0KPj4gKwl7IE9WOTY1NV9SRUdfUlNWRCg5KSwgMHg3ZiB9LA0KPj4gKwl7 IE9WOTY1NV9SRUdfUlNWRCgxMCksIDB4N2YgfSwNCj4+ICsJeyBPVjk2NTVfUkVHX1JTVkQoMTEp LCAweDdmIH0sDQo+PiArCXsgUkVHX01UWCgxKSwgMHg5OCB9LA0KPj4gKwl7IFJFR19NVFgoMiks IDB4OTggfSwNCj4+ICsJeyBSRUdfTVRYKDMpLCAweDAwIH0sDQo+PiArCXsgUkVHX01UWCg0KSwg MHgyOCB9LA0KPj4gKwl7IFJFR19NVFgoNSksIDB4NzAgfSwNCj4+ICsJeyBSRUdfTVRYKDYpLCAw eDk4IH0sDQo+PiArCXsgUkVHX01UWFMsIDB4MWEgfSwNCj4+ICsJeyBSRUdfQVdCT1AoMSksIDB4 ODUgfSwNCj4+ICsJeyBSRUdfQVdCT1AoMiksIDB4YTkgfSwNCj4+ICsJeyBSRUdfQVdCT1AoMyks IDB4NjQgfSwNCj4+ICsJeyBSRUdfQVdCT1AoNCksIDB4ODQgfSwNCj4+ICsJeyBSRUdfQVdCT1Ao NSksIDB4NTMgfSwNCj4+ICsJeyBSRUdfQVdCT1AoNiksIDB4MGUgfSwNCj4+ICsJeyBSRUdfQkxN VCwgMHhmMCB9LA0KPj4gKwl7IFJFR19STE1ULCAweGYwIH0sDQo+PiArCXsgUkVHX0dMTVQsIDB4 ZjAgfSwNCj4+ICsJeyBSRUdfTENDKDEpLCAweDAwIH0sDQo+PiArCXsgUkVHX0xDQygyKSwgMHgw MCB9LA0KPj4gKwl7IFJFR19MQ0MoMyksIDB4MDIgfSwNCj4+ICsJeyBSRUdfTENDKDQpLCAweDIw IH0sDQo+PiArCXsgUkVHX0xDQyg1KSwgMHgwMCB9LA0KPj4gKwl7IDB4NjksIDB4MGEgfSwvKiBS ZXNlcnZlZC4uLiAqLw0KPj4gKwl7IE9WOTY1NV9SRUdfREJMViwgT1Y5NjU1X0RCTFZfUExMXzRY IHwgT1Y5NjU1X0RCTFZfTERPX0JZUEFTUyB8DQo+PiArCQkJT1Y5NjU1X0RCTFZfQkFOREdBUCB9 LA0KPj4gKwl7IDB4NmMsIDB4MDQgfSwvKiBSZXNlcnZlZC4uLiAqLw0KPj4gKwl7IDB4NmQsIDB4 NTUgfSwvKiBSZXNlcnZlZC4uLiAqLw0KPj4gKwl7IDB4NmUsIDB4MDAgfSwvKiBSZXNlcnZlZC4u LiAqLw0KPj4gKwl7IDB4NmYsIDB4OWQgfSwvKiBSZXNlcnZlZC4uLiAqLw0KPj4gKwl7IE9WOTY1 NV9SRUdfRE5TVEgsIDB4MjEgfSwNCj4+ICsJeyAweDcxLCAweDc4IH0sLyogUmVzZXJ2ZWQuLi4g Ki8NCj4+ICsJeyBPVjk2NTVfUkVHX1BPSURYLCAweDExIH0sLyogUVZHQSAqLw0KPj4gKwl7IE9W OTY1NV9SRUdfUENLRFYsIDB4MDEgfSwvKiBRVkdBICovDQo+PiArCXsgT1Y5NjU1X1JFR19YSU5E WCwgMHgxMCB9LA0KPj4gKwl7IE9WOTY1NV9SRUdfWUlORFgsIDB4MTAgfSwNCj4+ICsJeyAweDc2 LCAweDAxIH0sLyogUmVzZXJ2ZWQuLi4gKi8NCj4+ICsJeyAweDc3LCAweDAyIH0sLyogUmVzZXJ2 ZWQuLi4gKi8NCj4+ICsJeyAweDdBLCAweDEyIH0sLyogUmVzZXJ2ZWQuLi4gKi8NCj4+ICsJeyBP Vjk2NTVfUkVHX0dBTSgxKSwgMHgwOCB9LA0KPj4gKwl7IE9WOTY1NV9SRUdfR0FNKDIpLCAweDE2 IH0sDQo+PiArCXsgT1Y5NjU1X1JFR19HQU0oMyksIDB4MzAgfSwNCj4+ICsJeyBPVjk2NTVfUkVH X0dBTSg0KSwgMHg1ZSB9LA0KPj4gKwl7IE9WOTY1NV9SRUdfR0FNKDUpLCAweDcyIH0sDQo+PiAr CXsgT1Y5NjU1X1JFR19HQU0oNiksIDB4ODIgfSwNCj4+ICsJeyBPVjk2NTVfUkVHX0dBTSg3KSwg MHg4ZSB9LA0KPj4gKwl7IE9WOTY1NV9SRUdfR0FNKDgpLCAweDlhIH0sDQo+PiArCXsgT1Y5NjU1 X1JFR19HQU0oOSksIDB4YTQgfSwNCj4+ICsJeyBPVjk2NTVfUkVHX0dBTSgxMCksIDB4YWMgfSwN Cj4+ICsJeyBPVjk2NTVfUkVHX0dBTSgxMSksIDB4YjggfSwNCj4+ICsJeyBPVjk2NTVfUkVHX0dB TSgxMiksIDB4YzMgfSwNCj4+ICsJeyBPVjk2NTVfUkVHX0dBTSgxMyksIDB4ZDYgfSwNCj4+ICsJ eyBPVjk2NTVfUkVHX0dBTSgxNCksIDB4ZTYgfSwNCj4+ICsJeyBPVjk2NTVfUkVHX0dBTSgxNSks IDB4ZjIgfSwNCj4+ICsJeyAweDhhLCAweDI0IH0sLyogUmVzZXJ2ZWQuLi4gKi8NCj4+ICsJeyBP Vjk2NTVfUkVHX0NPTTE5LCAweDgwIH0sDQo+PiArCXsgMHg5MCwgMHg3ZCB9LC8qIFJlc2VydmVk Li4uICovDQo+PiArCXsgMHg5MSwgMHg3YiB9LC8qIFJlc2VydmVkLi4uICovDQo+PiArCXsgUkVH X0xDQ0ZCLCAweDAyIH0sDQo+PiArCXsgUkVHX0xDQ0ZSLCAweDAyIH0sDQo+PiArCXsgUkVHX0RC TENfR0IsIDB4N2EgfSwNCj4+ICsJeyBSRUdfREJMQ19HUiwgMHg3OSB9LA0KPj4gKwl7IFJFR19B RUNITSwgMHg0MCB9LA0KPj4gKwl7IE9WOTY1NV9SRUdfQ09NMjEsIDB4NTAgfSwNCj4+ICsJeyAw eGE1LCAweDY4IH0sLyogUmVzZXJ2ZWQuLi4gKi8NCj4+ICsJeyBPVjk2NTVfUkVHX0FXQl9HUkVF TiwgMHg0YSB9LA0KPj4gKwl7IE9WOTY1NV9SRUdfUkVGX0E4LCAweGMxIH0sDQo+PiArCXsgT1Y5 NjU1X1JFR19SRUZfQTksIDB4ZWYgfSwNCj4+ICsJeyAweGFhLCAweDkyIH0sLyogUmVzZXJ2ZWQu Li4gKi8NCj4+ICsJeyAweGFiLCAweDA0IH0sLyogUmVzZXJ2ZWQuLi4gKi8NCj4+ICsJeyBPVjk2 NTVfUkVHX0JMQygxKSwgMHg4MCB9LA0KPj4gKwl7IE9WOTY1NV9SRUdfQkxDKDIpLCAweDgwIH0s DQo+PiArCXsgT1Y5NjU1X1JFR19CTEMoMyksIDB4ODAgfSwNCj4+ICsJeyBPVjk2NTVfUkVHX0JM Qyg0KSwgMHg4MCB9LA0KPj4gKwl7IE9WOTY1NV9SRUdfQkxDKDcpLCAweGYyIH0sDQo+PiArCXsg T1Y5NjU1X1JFR19CTEMoOCksIDB4MjAgfSwNCj4+ICsJeyBPVjk2NTVfUkVHX0NUUkxCNCwgMHgy MCB9LA0KPj4gKwl7IDB4YjUsIDB4MDAgfSwvKiBSZXNlcnZlZC4uLiAqLw0KPj4gKwl7IDB4YjYs IDB4YWYgfSwvKiBSZXNlcnZlZC4uLiAqLw0KPj4gKwl7IDB4YjYsIDB4YWYgfSwvKiBSZXNlcnZl ZC4uLiAqLw0KPj4gKwl7IDB4YmIsIDB4YWUgfSwvKiBSZXNlcnZlZC4uLiAqLw0KPj4gKwl7IE9W OTY1NV9SRUdfQURCT0ZGLCAweDdmIH0sDQo+PiArCXsgT1Y5NjU1X1JFR19BRFJPRkYsIDB4N2Yg fSwNCj4+ICsJeyBPVjk2NTVfUkVHX0FER0JPRkYsIDB4N2YgfSwNCj4+ICsJeyBPVjk2NTVfUkVH X0FER0VPRkYsIDB4N2YgfSwNCj4+ICsJeyBPVjk2NTVfUkVHX0FER0VPRkYsIDB4N2YgfSwNCj4+ ICsJeyAweGMwLCAweGFhIH0sLyogUmVzZXJ2ZWQuLi4gKi8NCj4+ICsJeyAweGMxLCAweGMwIH0s LyogUmVzZXJ2ZWQuLi4gKi8NCj4+ICsJeyAweGMyLCAweDAxIH0sLyogUmVzZXJ2ZWQuLi4gKi8N Cj4+ICsJeyAweGMzLCAweDRlIH0sLyogUmVzZXJ2ZWQuLi4gKi8NCj4+ICsJeyAweGM2LCAweDA1 IH0sLyogUmVzZXJ2ZWQuLi4gKi8NCj4+ICsJeyBPVjk2NTVfUkVHX0NPTTI0LCAweDgxIH0sLyog UVZHQSAqLw0KPj4gKwl7IDB4YzksIDB4ZTAgfSwvKiBSZXNlcnZlZC4uLiAqLw0KPj4gKwl7IDB4 Y2EsIDB4ZTggfSwvKiBSZXNlcnZlZC4uLiAqLw0KPj4gKwl7IDB4Y2IsIDB4ZjAgfSwvKiBSZXNl cnZlZC4uLiAqLw0KPj4gKwl7IDB4Y2MsIDB4ZDggfSwvKiBSZXNlcnZlZC4uLiAqLw0KPj4gKwl7 IDB4Y2QsIDB4OTMgfSwvKiBSZXNlcnZlZC4uLiAqLw0KPj4gKwl7IFJFR19DT003LCBPVjk2NTVf Q09NN19WR0EgfCBPVjk2NTVfQ09NN19SR0IgfSwNCj4+ICsJeyBSRUdfQ09NMTUsIENPTTE1X1JH QjU2NSB9LA0KPj4gKwl7IFJFR19OVUxMLCAwfQ0KPj4gK307DQo+PiArDQo+PiArc3RhdGljIGNv bnN0IHN0cnVjdCBpMmNfcnYgb3Y5NjU1X3F2Z2FfcmVnc1tdID0gew0KPj4gKwl7IFJFR19IUkVG LCAweDEyIH0sDQo+PiArCXsgT1Y5NjU1X1JFR19DT00xNCwgT1Y5NjU1X0NPTTE0X1pPT00gfSwN Cj4+ICsJeyBPVjk2NTVfUkVHX1BPSURYLCAweDExIH0sDQo+PiArCXsgT1Y5NjU1X1JFR19QQ0tE ViwgMHgwMSB9LA0KPj4gKwl7IE9WOTY1NV9SRUdfQ09NMjQsIDB4ODEgfSwNCj4+ICsJeyBSRUdf TlVMTCwgMH0NCj4+ICt9Ow0KPj4gKw0KPj4gK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaTJjX3J2IG92 OTY1NV9xcXZnYV9yZWdzW10gPSB7DQo+PiArCXsgUkVHX0hSRUYsIDB4YTQgfSwNCj4+ICsJeyBS RUdfQ09NMTQsIE9WOTY1NV9DT00xNF9CTEFDS19QSVggfCBPVjk2NTVfQ09NMTRfV0hJVEVfUElY IHwNCj4+ICsJCQlPVjk2NTVfQ09NMTRfWk9PTSB9LA0KPj4gKwl7IE9WOTY1NV9SRUdfUE9JRFgs IDB4MjIgfSwNCj4+ICsJeyBPVjk2NTVfUkVHX1BDS0RWLCAweDAyIH0sDQo+PiArCXsgT1Y5NjU1 X1JFR19DT00yNCwgMHg4MiB9LA0KPj4gKwl7IFJFR19OVUxMLCAwfQ0KPj4gK307DQo+PiArDQo+ PiArc3RhdGljIGNvbnN0IHN0cnVjdCBpMmNfcnYgb3Y5NjU1X3ZnYV9yZWdzW10gPSB7DQo+PiAr CXsgUkVHX0dBSU4sIDB4MTEgfSwNCj4+ICsJeyBSRUdfVlJFRiwgMHgxMiB9LA0KPj4gKwl7IFJF R19CX0FWRSwgMHgyZSB9LA0KPj4gKwl7IFJFR19HQl9BVkUsIDB4MmUgfSwNCj4+ICsJeyBSRUdf R1JfQVZFLCAweDJlIH0sDQo+PiArCXsgUkVHX1JfQVZFLCAweDJlIH0sDQo+PiArCXsgUkVHX0NP TTYsIDB4NDggfSwNCj4+ICsJeyBSRUdfQUVDSCwgMHg3YiB9LA0KPj4gKwl7IFJFR19DTEtSQywg MHgwMyB9LA0KPj4gKwl7IFJFR19DT004LCBDT004X0ZBU1RBRUMgfCBDT004X0FFQ1NURVAgfCBD T004X0JGSUxUIHwNCj4+ICsJCQlDT004X0FHQyB8IENPTThfQVdCIHwgQ09NOF9BRUMgfSwNCj4+ ICsJeyBSRUdfSFNUQVJULCAweDE2IH0sDQo+PiArCXsgUkVHX0hTVE9QLCAweDAyIH0sDQo+PiAr CXsgUkVHX1ZTVEFSVCwgMHgwMSB9LA0KPj4gKwl7IFJFR19WU1RPUCwgMHgzZCB9LA0KPj4gKwl7 IFJFR19NVkZQLCAweDA0IH0sDQo+PiArCXsgUkVHX1lBVkUsIDB4MmUgfSwNCj4+ICsJeyBSRUdf SFJFRiwgMHhmZiB9LA0KPj4gKwl7IE9WOTY1NV9BUkVGMSwgMHgzZCB9LA0KPj4gKwl7IE9WOTY1 NV9BUkVGMywgMHhmYSB9LA0KPj4gKwl7IFJFR19UU0xCLCAweGNjIH0sDQo+PiArCXsgUkVHX0NP TTExLCAweGNjIH0sDQo+PiArCXsgUkVHX0NPTTE0LCAweDBjIH0sDQo+PiArCXsgUkVHX0VER0Us IDB4ODIgfSwNCj4+ICsJeyBSRUdfQ09NMTUsIENPTTE1X1IwMEZGIHwgQ09NMTVfUkdCNTY1IH0s LyogZnVsbCByYW5nZSAqLw0KPj4gKwl7IFJFR19DT00xNiwgMHg0MCB9LA0KPj4gKwl7IE9WOTY1 NV9SRUdfUlNWRCgxKSwgMHgxNCB9LA0KPj4gKwl7IE9WOTY1NV9SRUdfUlNWRCgyKSwgMHhmMCB9 LA0KPj4gKwl7IE9WOTY1NV9SRUdfUlNWRCgzKSwgMHg0NiB9LA0KPj4gKwl7IE9WOTY1NV9SRUdf UlNWRCg0KSwgMHg2MiB9LA0KPj4gKwl7IE9WOTY1NV9SRUdfUlNWRCg1KSwgMHgyYSB9LA0KPj4g Kwl7IE9WOTY1NV9SRUdfUlNWRCg2KSwgMHgzYyB9LA0KPj4gKwl7IE9WOTY1NV9SRUdfUlNWRCg4 KSwgMHhlOSB9LA0KPj4gKwl7IE9WOTY1NV9SRUdfUlNWRCg5KSwgMHhkZCB9LA0KPj4gKwl7IE9W OTY1NV9SRUdfUlNWRCgxMCksIDB4ZGQgfSwNCj4+ICsJeyBPVjk2NTVfUkVHX1JTVkQoMTEpLCAw eGRkIH0sDQo+PiArCXsgT1Y5NjU1X1JFR19SU1ZEKDEyKSwgMHhkZCB9LA0KPj4gKwl7IFJFR19M Q0MoMSksIDB4MDAgfSwNCj4+ICsJeyBSRUdfTENDKDIpLCAweDAwIH0sDQo+PiArCXsgUkVHX0xD QygzKSwgMHgwMiB9LA0KPj4gKwl7IFJFR19MQ0MoNCksIDB4MjAgfSwNCj4+ICsJeyBSRUdfTEND KDUpLCAweDAxIH0sDQo+PiArCXsgUkVHX0dTUCwgMHgwYyB9LA0KPj4gKwl7IDB4NmYsIDB4OWUg fSwvKiBSZXNlcnZlZC4uLiAqLw0KPj4gKwl7IE9WOTY1NV9SRUdfRE5TVEgsIDB4MDYgfSwNCj4+ ICsJeyBPVjk2NTVfUkVHX1BPSURYLCAweDAwIH0sDQo+PiArCXsgT1Y5NjU1X1JFR19QQ0tEViwg MHgwMCB9LA0KPj4gKwl7IE9WOTY1NV9SRUdfWElORFgsIDB4M2EgfSwNCj4+ICsJeyBPVjk2NTVf UkVHX1lJTkRYLCAweDM1IH0sDQo+PiArCXsgT1Y5NjU1X1JFR19TTE9QLCAweDIwIH0sDQo+PiAr CXsgT1Y5NjU1X1JFR19HQU0oMSksIDB4MWMgfSwNCj4+ICsJeyBPVjk2NTVfUkVHX0dBTSgyKSwg MHgyOCB9LA0KPj4gKwl7IE9WOTY1NV9SRUdfR0FNKDMpLCAweDNjIH0sDQo+PiArCXsgT1Y5NjU1 X1JFR19HQU0oNCksIDB4NWEgfSwNCj4+ICsJeyBPVjk2NTVfUkVHX0dBTSg1KSwgMHg2OCB9LA0K Pj4gKwl7IE9WOTY1NV9SRUdfR0FNKDYpLCAweDc2IH0sDQo+PiArCXsgT1Y5NjU1X1JFR19HQU0o NyksIDB4ODAgfSwNCj4+ICsJeyBPVjk2NTVfUkVHX0dBTSg4KSwgMHg4OCB9LA0KPj4gKwl7IE9W OTY1NV9SRUdfR0FNKDkpLCAweDhmIH0sDQo+PiArCXsgT1Y5NjU1X1JFR19HQU0oMTApLCAweDk2 IH0sDQo+PiArCXsgT1Y5NjU1X1JFR19HQU0oMTEpLCAweGEzIH0sDQo+PiArCXsgT1Y5NjU1X1JF R19HQU0oMTIpLCAweGFmIH0sDQo+PiArCXsgT1Y5NjU1X1JFR19HQU0oMTMpLCAweGM0IH0sDQo+ PiArCXsgT1Y5NjU1X1JFR19HQU0oMTQpLCAweGQ3IH0sDQo+PiArCXsgT1Y5NjU1X1JFR19HQU0o MTUpLCAweGU4IH0sDQo+PiArCXsgMHg4YSwgMHgyMyB9LC8qIFJlc2VydmVkLi4uICovDQo+PiAr CXsgT1Y5NjU1X1JFR19DT00xOSwgMHg4ZCB9LA0KPj4gKwl7IDB4OTAsIDB4OTIgfSwvKiBSZXNl cnZlZC4uLiAqLw0KPj4gKwl7IDB4OTEsIDB4OTIgfSwvKiBSZXNlcnZlZC4uLiAqLw0KPj4gKwl7 IFJFR19EQkxDX0dCLCAweDkwIH0sDQo+PiArCXsgUkVHX0RCTENfR1IsIDB4OTAgfSwNCj4+ICsJ eyBPVjk2NTVfUkVHX0FXQl9HUkVFTiwgMHg0MCB9LA0KPj4gKwl7IE9WOTY1NV9SRUdfQURCT0ZG LCAweDAyIH0sDQo+PiArCXsgT1Y5NjU1X1JFR19BRFJPRkYsIDB4MDEgfSwNCj4+ICsJeyBPVjk2 NTVfUkVHX0FER0JPRkYsIDB4MDIgfSwNCj4+ICsJeyBPVjk2NTVfUkVHX0FER0VPRkYsIDB4MDEg fSwNCj4+ICsJeyAweGMxLCAweGM4IH0sLyogUmVzZXJ2ZWQuLi4gKi8NCj4+ICsJeyAweGM2LCAw eDg1IH0sLyogUmVzZXJ2ZWQuLi4gKi8NCj4+ICsJeyBPVjk2NTVfUkVHX0NPTTI0LCAweDgwIH0s DQo+PiArCXsgUkVHX05VTEwsIDB9DQo+PiArfTsNCj4+ICsNCj4+ICtzdGF0aWMgY29uc3Qgc3Ry dWN0IG92OTY1eF9mcmFtZXNpemUgb3Y5NjU1X2ZyYW1lc2l6ZXNbXSA9IHsNCj4+ICsJew0KPj4g KwkJLndpZHRoCQk9IFZHQV9XSURUSCwNCj4+ICsJCS5oZWlnaHQJCT0gVkdBX0hFSUdIVCwNCj4+ ICsJCS5yZWdzCQk9IG92OTY1NV92Z2FfcmVncywNCj4+ICsJCS5tYXhfZXhwX2xpbmVzCT0gNDk4 LA0KPj4gKwl9LCB7DQo+PiArCQkud2lkdGgJCT0gUVZHQV9XSURUSCwNCj4+ICsJCS5oZWlnaHQJ CT0gUVZHQV9IRUlHSFQsDQo+PiArCQkucmVncwkJPSBvdjk2NTVfcXZnYV9yZWdzLA0KPj4gKwkJ Lm1heF9leHBfbGluZXMJPSAyNDgsDQo+PiArCX0sDQo+PiArCXsNCj4+ICsJCS53aWR0aAkJPSBR UVZHQV9XSURUSCwNCj4+ICsJCS5oZWlnaHQJCT0gUVFWR0FfSEVJR0hULA0KPj4gKwkJLnJlZ3MJ CT0gb3Y5NjU1X3FxdmdhX3JlZ3MsDQo+PiArCQkubWF4X2V4cF9saW5lcwk9IDEyNCwNCj4+ICsJ fSwNCj4+ICt9Ow0KPj4gKw0KPj4gK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgb3Y5NjV4X3BpeGZtdCBv djk2NTVfZm9ybWF0c1tdID0gew0KPj4gKwl7IE1FRElBX0JVU19GTVRfUkdCNTY1XzJYOF9MRSwg VjRMMl9DT0xPUlNQQUNFX1NSR0IsIDB4MDh9LA0KPj4gK307DQo+PiArDQo+PiBzdGF0aWMgaW5s aW5lIHN0cnVjdCB2NGwyX3N1YmRldiAqY3RybF90b19zZChzdHJ1Y3QgdjRsMl9jdHJsICpjdHJs KQ0KPj4gew0KPj4gCXJldHVybiAmY29udGFpbmVyX29mKGN0cmwtPmhhbmRsZXIsIHN0cnVjdCBv djk2NXgsIGN0cmxzLmhhbmRsZXIpLT5zZDsNCj4+IEBAIC04OTQsMTIgKzEyNzIsMTYgQEAgc3Rh dGljIGludCBvdjk2NXhfc2V0X3Rlc3RfcGF0dGVybihzdHJ1Y3Qgb3Y5NjV4ICpvdjk2NXgsIGlu dCB2YWx1ZSkNCj4+IHsNCj4+IAlpbnQgcmV0Ow0KPj4gCXU4IHJlZzsNCj4+ICsJdTggYWRkciA9 IChvdjk2NXgtPmlkID09IE9WOTY1NVY1X0lEKSA/DQo+PiArCQkJUkVHX0NPTTMgOiBSRUdfQ09N MjM7DQo+PiArCXU4IG1hc2sgPSAob3Y5NjV4LT5pZCA9PSBPVjk2NTVWNV9JRCkgPw0KPj4gKwkJ CUNPTTNfQ09MT1JCQVIgOiBDT00yM19URVNUX01PREU7DQo+Pg0KPj4gLQlyZXQgPSBvdjk2NXhf cmVhZChvdjk2NXgtPmNsaWVudCwgUkVHX0NPTTIzLCAmcmVnKTsNCj4+ICsJcmV0ID0gb3Y5NjV4 X3JlYWQob3Y5NjV4LT5jbGllbnQsIGFkZHIsICZyZWcpOw0KPj4gCWlmIChyZXQgPCAwKQ0KPj4g CQlyZXR1cm4gcmV0Ow0KPj4gLQlyZWcgPSB2YWx1ZSA/IHJlZyB8IENPTTIzX1RFU1RfTU9ERSA6 IHJlZyAmIH5DT00yM19URVNUX01PREU7DQo+PiAtCXJldHVybiBvdjk2NXhfd3JpdGUob3Y5NjV4 LT5jbGllbnQsIFJFR19DT00yMywgcmVnKTsNCj4+ICsJcmVnID0gdmFsdWUgPyByZWcgfCBtYXNr IDogcmVnICYgfm1hc2s7DQo+PiArCXJldHVybiBvdjk2NXhfd3JpdGUob3Y5NjV4LT5jbGllbnQs IGFkZHIsIHJlZyk7DQo+PiB9DQo+Pg0KPj4gc3RhdGljIGludCBfX2dfdm9sYXRpbGVfY3RybChz dHJ1Y3Qgb3Y5NjV4ICpvdjk2NXgsIHN0cnVjdCB2NGwyX2N0cmwgKmN0cmwpDQo+PiBAQCAtMTEw Miw2ICsxNDg0LDMwIEBAIHN0YXRpYyBpbnQgb3Y5NjV4X2luaXRpYWxpemVfY29udHJvbHMoc3Ry dWN0IG92OTY1eCAqb3Y5NjV4KQ0KPj4gCXJldHVybiAwOw0KPj4gfQ0KPj4NCj4+ICtzdGF0aWMg aW50IG92OTY1NV9pbml0aWFsaXplX2NvbnRyb2xzKHN0cnVjdCBvdjk2NXggKm92OTY1eCkNCj4+ ICt7DQo+PiArCWNvbnN0IHN0cnVjdCB2NGwyX2N0cmxfb3BzICpvcHMgPSAmb3Y5NjV4X2N0cmxf b3BzOw0KPj4gKwlzdHJ1Y3Qgb3Y5NjV4X2N0cmxzICpjdHJscyA9ICZvdjk2NXgtPmN0cmxzOw0K Pj4gKwlzdHJ1Y3QgdjRsMl9jdHJsX2hhbmRsZXIgKmhkbCA9ICZjdHJscy0+aGFuZGxlcjsNCj4+ ICsJaW50IHJldDsNCj4+ICsNCj4+ICsJcmV0ID0gdjRsMl9jdHJsX2hhbmRsZXJfaW5pdChoZGws IDE2KTsNCj4+ICsJaWYgKHJldCA8IDApDQo+PiArCQlyZXR1cm4gcmV0Ow0KPj4gKw0KPj4gKwl2 NGwyX2N0cmxfbmV3X3N0ZF9tZW51X2l0ZW1zKGhkbCwgb3BzLCBWNEwyX0NJRF9URVNUX1BBVFRF Uk4sDQo+PiArCQkJCSAgICAgQVJSQVlfU0laRSh0ZXN0X3BhdHRlcm5fbWVudSkgLSAxLCAwLCAw LA0KPj4gKwkJCQkgICAgIHRlc3RfcGF0dGVybl9tZW51KTsNCj4+ICsJaWYgKGhkbC0+ZXJyb3Ip IHsNCj4+ICsJCXJldCA9IGhkbC0+ZXJyb3I7DQo+PiArCQl2NGwyX2N0cmxfaGFuZGxlcl9mcmVl KGhkbCk7DQo+PiArCQlyZXR1cm4gcmV0Ow0KPj4gKwl9DQo+PiArDQo+PiArCW92OTY1eC0+c2Qu Y3RybF9oYW5kbGVyID0gaGRsOw0KPj4gKwlyZXR1cm4gMDsNCj4+ICt9DQo+PiArDQo+PiAvKg0K Pj4gICAqIFY0TDIgc3ViZGV2IHZpZGVvIGFuZCBwYWQgbGV2ZWwgb3BlcmF0aW9ucw0KPj4gICAq Lw0KPj4gQEAgLTE1MTgsOSArMTkyNCwxNSBAQCBzdGF0aWMgaW50IG92OTY1eF9kZXRlY3Rfc2Vu c29yKHN0cnVjdCB2NGwyX3N1YmRldiAqc2QpDQo+Pg0KPj4gCWlmICghcmV0KSB7DQo+PiAJCW92 OTY1eC0+aWQgPSBPVjk2NVhfSUQocGlkLCB2ZXIpOw0KPj4gLQkJaWYgKG92OTY1eC0+aWQgPT0g T1Y5NjUwX0lEIHx8IG92OTY1eC0+aWQgPT0gT1Y5NjUyX0lEKSB7DQo+PiArCQlzd2l0Y2ggKG92 OTY1eC0+aWQpIHsNCj4+ICsJCWNhc2UgT1Y5NjUwX0lEOg0KPj4gKwkJY2FzZSBPVjk2NTJfSUQ6 DQo+PiAJCQl2NGwyX2luZm8oc2QsICJGb3VuZCBPViUwNFggc2Vuc29yXG4iLCBvdjk2NXgtPmlk KTsNCj4+IC0JCX0gZWxzZSB7DQo+PiArCQkJYnJlYWs7DQo+PiArCQljYXNlIE9WOTY1NVY1X0lE Og0KPj4gKwkJCXY0bDJfaW5mbyhzZCwgIkZvdW5kIE9WJTA0WCBzZW5zb3JcbiIsIG92OTY1eC0+ aWQgLSAyKTsNCj4+ICsJCQlicmVhazsNCj4+ICsJCWRlZmF1bHQ6DQo+PiAJCQl2NGwyX2Vycihz ZCwgIlNlbnNvciBkZXRlY3Rpb24gZmFpbGVkICglMDRYLCAlZClcbiIsDQo+PiAJCQkJIG92OTY1 eC0+aWQsIHJldCk7DQo+PiAJCQlyZXQgPSAtRU5PREVWOw0KPj4gQEAgLTE1OTgsMTggKzIwMTAs MjggQEAgc3RhdGljIGludCBvdjk2NXhfcHJvYmUoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwN Cj4+IAlpZiAocmV0IDwgMCkNCj4+IAkJZ290byBlcnJfbWU7DQo+Pg0KPj4gLQlvdjk2NXgtPmlu aXRfcmVncyA9IG92OTY1eF9pbml0X3JlZ3M7DQo+PiAtCW92OTY1eC0+aW5pdGlhbGl6ZV9jb250 cm9scyA9IG92OTY1eF9pbml0aWFsaXplX2NvbnRyb2xzOw0KPj4gLQlvdjk2NXgtPmZyYW1lc2l6 ZXMgPSBvdjk2NXhfZnJhbWVzaXplczsNCj4+IC0Jb3Y5NjV4LT5uYl9vZl9mcmFtZXNpemVzID0g QVJSQVlfU0laRShvdjk2NXhfZnJhbWVzaXplcyk7DQo+PiAtCW92OTY1eC0+Zm9ybWF0cyA9IG92 OTY1eF9mb3JtYXRzOw0KPj4gLQlvdjk2NXgtPm5iX29mX2Zvcm1hdHMgPSBBUlJBWV9TSVpFKG92 OTY1eF9mb3JtYXRzKTsNCj4+IC0Jb3Y5NjV4LT5pbnRlcnZhbHMgPSBvdjk2NXhfaW50ZXJ2YWxz Ow0KPj4gLQlvdjk2NXgtPm5iX29mX2ludGVydmFscyA9IEFSUkFZX1NJWkUob3Y5NjV4X2ludGVy dmFscyk7DQo+PiAtCW92OTY1eC0+Zml2ID0gJm92OTY1eF9pbnRlcnZhbHNbMF07DQo+PiAtCW92 OTY1eC0+c2V0X2ZyYW1lX2ludGVydmFsID0gX19vdjk2NXhfc2V0X2ZyYW1lX2ludGVydmFsOw0K Pj4gLQlvdjk2NXgtPnVwZGF0ZV9leHBvc3VyZV9jdHJsID0gb3Y5NjV4X3VwZGF0ZV9leHBvc3Vy ZV9jdHJsOw0KPj4gLQlvdjk2NXgtPnNldF9wYXJhbXMgPSBfX292OTY1eF9zZXRfcGFyYW1zOw0K Pj4gKwlpZiAob3Y5NjV4LT5pZCAhPSBPVjk2NTVWNV9JRCkgew0KPj4gKwkJb3Y5NjV4LT5pbml0 X3JlZ3MgPSBvdjk2NXhfaW5pdF9yZWdzOw0KPj4gKwkJb3Y5NjV4LT5pbml0aWFsaXplX2NvbnRy b2xzID0gb3Y5NjV4X2luaXRpYWxpemVfY29udHJvbHM7DQo+PiArCQlvdjk2NXgtPmZyYW1lc2l6 ZXMgPSBvdjk2NXhfZnJhbWVzaXplczsNCj4+ICsJCW92OTY1eC0+bmJfb2ZfZnJhbWVzaXplcyA9 IEFSUkFZX1NJWkUob3Y5NjV4X2ZyYW1lc2l6ZXMpOw0KPj4gKwkJb3Y5NjV4LT5mb3JtYXRzID0g b3Y5NjV4X2Zvcm1hdHM7DQo+PiArCQlvdjk2NXgtPm5iX29mX2Zvcm1hdHMgPSBBUlJBWV9TSVpF KG92OTY1eF9mb3JtYXRzKTsNCj4+ICsJCW92OTY1eC0+aW50ZXJ2YWxzID0gb3Y5NjV4X2ludGVy dmFsczsNCj4+ICsJCW92OTY1eC0+bmJfb2ZfaW50ZXJ2YWxzID0gQVJSQVlfU0laRShvdjk2NXhf aW50ZXJ2YWxzKTsNCj4+ICsJCW92OTY1eC0+Zml2ID0gJm92OTY1eF9pbnRlcnZhbHNbMF07DQo+ PiArCQlvdjk2NXgtPnNldF9mcmFtZV9pbnRlcnZhbCA9IF9fb3Y5NjV4X3NldF9mcmFtZV9pbnRl cnZhbDsNCj4+ICsJCW92OTY1eC0+dXBkYXRlX2V4cG9zdXJlX2N0cmwgPSBvdjk2NXhfdXBkYXRl X2V4cG9zdXJlX2N0cmw7DQo+PiArCQlvdjk2NXgtPnNldF9wYXJhbXMgPSBfX292OTY1eF9zZXRf cGFyYW1zOw0KPj4gKwl9IGVsc2Ugew0KPj4gKwkJb3Y5NjV4LT5pbml0X3JlZ3MgPSBvdjk2NTVf aW5pdF9yZWdzOw0KPj4gKwkJb3Y5NjV4LT5pbml0aWFsaXplX2NvbnRyb2xzID0gb3Y5NjU1X2lu aXRpYWxpemVfY29udHJvbHM7DQo+PiArCQlvdjk2NXgtPmZyYW1lc2l6ZXMgPSBvdjk2NTVfZnJh bWVzaXplczsNCj4+ICsJCW92OTY1eC0+bmJfb2ZfZnJhbWVzaXplcyA9IEFSUkFZX1NJWkUob3Y5 NjU1X2ZyYW1lc2l6ZXMpOw0KPj4gKwkJb3Y5NjV4LT5mb3JtYXRzID0gb3Y5NjU1X2Zvcm1hdHM7 DQo+PiArCQlvdjk2NXgtPm5iX29mX2Zvcm1hdHMgPSBBUlJBWV9TSVpFKG92OTY1NV9mb3JtYXRz KTsNCj4+ICsJCW92OTY1eC0+c2V0X3BhcmFtcyA9IG92OTY1eF9zZXRfZnJhbWVfc2l6ZTsNCj4+ ICsJfTsNCj4+DQo+PiAJb3Y5NjV4LT5mcmFtZV9zaXplID0gJm92OTY1eC0+ZnJhbWVzaXplc1sw XTsNCj4+IAlvdjk2NXhfZ2V0X2RlZmF1bHRfZm9ybWF0KG92OTY1eCwgJm92OTY1eC0+Zm9ybWF0 KTsNCj4+IEBAIC0xNjUyLDYgKzIwNzQsNyBAQCBzdGF0aWMgaW50IG92OTY1eF9yZW1vdmUoc3Ry dWN0IGkyY19jbGllbnQgKmNsaWVudCkNCj4+IHN0YXRpYyBjb25zdCBzdHJ1Y3QgaTJjX2Rldmlj ZV9pZCBvdjk2NXhfaWRbXSA9IHsNCj4+IAl7ICJPVjk2NTAiLCAweDk2NTAgfSwNCj4+IAl7ICJP Vjk2NTIiLCAweDk2NTIgfSwNCj4+ICsJeyAiT1Y5NjU1IiwgMHg5NjU1IH0sDQo+IA0KPiBpMmMg ZGV2aWNlIGlkcyBzaG91bGQgYmUgbG93ZXIgY2FzZSB0byBtYXRjaCBjb21wYXRpYmxlLXN0cmlu Z3MgaW4gRFQgZm9yDQo+IGF1dG9tYXRpYyBtb2Rwcm9iaW5nLg0KPiANCj4gUGxlYXNlIHBpY2sv bWVyZ2UvY29weSZwYXN0ZQ0KPiANCj4gPGh0dHA6Ly9naXQuZ29sZGVsaWNvLmNvbS8/cD1ndGEw NC1rZXJuZWwuZ2l0O2E9YmxvYmRpZmY7Zj1kcml2ZXJzL21lZGlhL2kyYy9vdjk2NTAuYztoPWMz MTBjYmVlMTMxNjY1ODkzZDJkMWRmMGFiMTI0NmJkOWIxZDQxZmU7aHA9ZWQ1ZDBhNTNhOWM3MjAz NmQ2ZTAxNzA5NGI2ODExMWI1ZWI3ZjAwZDtoYj0xMTViOWM1OTIwMmFhMmZiMWZlY2I2OTFlYmVl ZjUxMjIwZDM2M2I4O2hwYj1kYThhZTJiMDM4YTQ0OGM4ZjgyMmIzYTRmMjBlZDM3OGRiNmQyOTM0 Pg0KPiANCj4gV2l0aCB0aGlzIGNoYW5nZSBJIGdldDoNCj4gDQo+IHJvb3RAbGV0dXg6fiMgZG1l c2d8ZmdyZXAgb3Y5Ng0KPiBbICAgMTIuNzI3NjAwXSBvdjk2NXg6IEZvdW5kIE9WOTY1NSBzZW5z b3INCj4gWyAgIDEyLjc0NzcxMV0gb3Y5NjV4IDEtMDAzMDogb3Y5NjV4IGRyaXZlciBwcm9iZWQN Cj4gcm9vdEBsZXR1eDp+Iw0KPiANCj4gZHVyaW5nIHByb2JlLg0KPiANCg0KVGhhbmtzIGZvciBw YXRjaCwgSSdsbCBmaXggaW4gdjIgIQ0KDQo+PiAJeyAvKiBzZW50aW5lbCAqLyB9DQo+PiB9Ow0K Pj4gTU9EVUxFX0RFVklDRV9UQUJMRShpMmMsIG92OTY1eF9pZCk7DQo+PiBAQCAtMTY1OSw2ICsy MDgyLDcgQEAgc3RhdGljIGludCBvdjk2NXhfcmVtb3ZlKHN0cnVjdCBpMmNfY2xpZW50ICpjbGll bnQpDQo+PiBzdGF0aWMgY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCBvdjk2NXhfb2ZfbWF0Y2hb XSA9IHsNCj4+IAl7IC5jb21wYXRpYmxlID0gIm92dGksb3Y5NjUwIiwgLmRhdGEgPSAodm9pZCAq KTB4OTY1MCB9LA0KPj4gCXsgLmNvbXBhdGlibGUgPSAib3Z0aSxvdjk2NTIiLCAuZGF0YSA9ICh2 b2lkICopMHg5NjUyIH0sDQo+PiArCXsgLmNvbXBhdGlibGUgPSAib3Z0aSxvdjk2NTUiLCAuZGF0 YSA9ICh2b2lkICopMHg5NjU1IH0sDQo+PiAJeyAvKiBzZW50aW5lbCAqLyB9DQo+PiB9Ow0KPj4g TU9EVUxFX0RFVklDRV9UQUJMRShvZiwgb3Y5NjV4X29mX21hdGNoKTsNCj4+IC0tIA0KPj4gMS45 LjENCj4+DQo+IA== From mboxrd@z Thu Jan 1 00:00:00 1970 From: hugues.fruchet@st.com (Hugues FRUCHET) Date: Mon, 26 Jun 2017 11:49:07 +0000 Subject: [PATCH v1 6/6] [media] ov9650: add support of OV9655 variant In-Reply-To: References: <1498143942-12682-1-git-send-email-hugues.fruchet@st.com> <1498143942-12682-7-git-send-email-hugues.fruchet@st.com> Message-ID: To: linux-arm-kernel@lists.infradead.org List-Id: linux-arm-kernel.lists.infradead.org On 06/26/2017 08:03 AM, H. Nikolaus Schaller wrote: > >> Am 22.06.2017 um 17:05 schrieb Hugues Fruchet : >> >> Add a first support of OV9655 variant. >> Because of register set slightly different from OV9650/9652, >> not all of the driver features are supported (controls). >> Supported resolutions are limited to VGA, QVGA, QQVGA. >> Supported format is limited to RGB565. >> Controls are limited to color bar test pattern for test purpose. >> >> Signed-off-by: H. Nikolaus Schaller >> Signed-off-by: Hugues Fruchet >> --- >> drivers/media/i2c/Kconfig | 4 +- >> drivers/media/i2c/ov9650.c | 486 ++++++++++++++++++++++++++++++++++++++++++--- >> 2 files changed, 457 insertions(+), 33 deletions(-) >> >> diff --git a/drivers/media/i2c/Kconfig b/drivers/media/i2c/Kconfig >> index efea14d..a8f638c 100644 >> --- a/drivers/media/i2c/Kconfig >> +++ b/drivers/media/i2c/Kconfig >> @@ -594,11 +594,11 @@ config VIDEO_OV7670 >> controller. >> >> config VIDEO_OV9650 >> - tristate "OmniVision OV9650/OV9652 sensor support" >> + tristate "OmniVision OV9650/OV9652/OV9655 sensor support" >> depends on GPIOLIB && I2C && VIDEO_V4L2 && VIDEO_V4L2_SUBDEV_API >> ---help--- >> This is a V4L2 sensor-level driver for the Omnivision >> - OV9650 and OV9652 camera sensors. >> + OV9650 and OV9652 and OV9655 camera sensors. >> >> config VIDEO_VS6624 >> tristate "ST VS6624 sensor support" >> diff --git a/drivers/media/i2c/ov9650.c b/drivers/media/i2c/ov9650.c >> index a9d268d..c0819af 100644 >> --- a/drivers/media/i2c/ov9650.c >> +++ b/drivers/media/i2c/ov9650.c >> @@ -1,5 +1,5 @@ >> /* >> - * Omnivision OV9650/OV9652 CMOS Image Sensor driver >> + * Omnivision OV9650/OV9652/OV9655 CMOS Image Sensor driver >> * >> * Copyright (C) 2013, Sylwester Nawrocki >> * >> @@ -7,6 +7,15 @@ >> * by Vladimir Fonov. >> * Copyright (c) 2010, Vladimir Fonov >> * >> + * >> + * Copyright (C) STMicroelectronics SA 2017 >> + * Author: Hugues Fruchet for STMicroelectronics. >> + * >> + * OV9655 initial support based on a driver written by H. Nikolaus Schaller: >> + * http://git.goldelico.com/?p=gta04-kernel.git;a=shortlog;h=refs/heads/work/hns/video/ov9655 >> + * OV9655 registers sequence from STM32CubeF7 embedded software, see: >> + * https://developer.mbed.org/teams/ST/code/BSP_DISCO_F746NG/file/e1d9da7fe856/Drivers/BSP/Components/ov9655/ov9655.c >> + * >> * This program is free software; you can redistribute it and/or modify >> * it under the terms of the GNU General Public License version 2 as >> * published by the Free Software Foundation. >> @@ -58,14 +67,21 @@ >> #define REG_PID 0x0a /* Product ID MSB */ >> #define REG_VER 0x0b /* Product ID LSB */ >> #define REG_COM3 0x0c >> -#define COM3_SWAP 0x40 >> +#define COM3_COLORBAR 0x80 >> +#define COM3_RGB565 0x00 >> +#define COM3_SWAP 0x40 /* Doesn't work in RGB */ >> +#define COM3_RESETB 0x08 >> #define COM3_VARIOPIXEL1 0x04 >> +#define OV9655_SINGLEFRAME 0x01 >> #define REG_COM4 0x0d /* Vario Pixels */ >> #define COM4_VARIOPIXEL2 0x80 >> +#define OV9655_TRISTATE /* seems to have a different function */ >> #define REG_COM5 0x0e /* System clock options */ >> #define COM5_SLAVE_MODE 0x10 >> -#define COM5_SYSTEMCLOCK48MHZ 0x80 >> +#define COM5_SYSTEMCLOCK48MHZ 0x80 /* not on OV9655 */ >> +#define OV9655_EXPOSURESTEP 0x01 >> #define REG_COM6 0x0f /* HREF & ADBLC options */ >> +#define COM6_BLC_OPTICAL 0x40 /* Optical black */ >> #define REG_AECH 0x10 /* Exposure value, AEC[9:2] */ >> #define REG_CLKRC 0x11 /* Clock control */ >> #define CLK_EXT 0x40 /* Use external clock directly */ >> @@ -74,13 +90,18 @@ >> #define COM7_RESET 0x80 >> #define COM7_FMT_MASK 0x38 >> #define COM7_FMT_VGA 0x40 >> -#define COM7_FMT_CIF 0x20 >> +#define COM7_FMT_CIF 0x20 >> #define COM7_FMT_QVGA 0x10 >> #define COM7_FMT_QCIF 0x08 >> -#define COM7_RGB 0x04 >> -#define COM7_YUV 0x00 >> -#define COM7_BAYER 0x01 >> -#define COM7_PBAYER 0x05 >> +#define COM7_RGB 0x04 >> +#define COM7_YUV 0x00 >> +#define COM7_BAYER 0x01 >> +#define COM7_PBAYER 0x05 >> +#define OV9655_COM7_VGA 0x60 >> +#define OV9655_COM7_RAWRGB 0x00 /* different format encoding */ >> +#define OV9655_COM7_RAWRGBINT 0x01 >> +#define OV9655_COM7_YUV 0x02 >> +#define OV9655_COM7_RGB 0x03 >> #define REG_COM8 0x13 /* AGC/AEC options */ >> #define COM8_FASTAEC 0x80 /* Enable fast AGC/AEC */ >> #define COM8_AECSTEP 0x40 /* Unlimited AEC step size */ >> @@ -89,14 +110,23 @@ >> #define COM8_AWB 0x02 /* White balance enable */ >> #define COM8_AEC 0x01 /* Auto exposure enable */ >> #define REG_COM9 0x14 /* Gain ceiling */ >> -#define COM9_GAIN_CEIL_MASK 0x70 /* */ >> +#define COM9_GAIN_CEIL_MASK 0x70 >> +#define COM9_GAIN_CEIL_16X 0x30 >> +#define OV9655_COM9_EXPTIMING 0x08 >> +#define OV9655_COM9_VSYNCDROP 0x04 >> +#define OV9655_COM9_AECDROP 0x02 >> #define REG_COM10 0x15 /* PCLK, HREF, HSYNC signals polarity */ >> +#define OV9655_SLAVE_PIN 0x80 /* SLHS/SLVS instead of RESETB/PWDN */ >> #define COM10_HSYNC 0x40 /* HSYNC instead of HREF */ >> #define COM10_PCLK_HB 0x20 /* Suppress PCLK on horiz blank */ >> -#define COM10_HREF_REV 0x08 /* Reverse HREF */ >> +#define OV9655_COM10_PCLK_REV 0x10 /* PCLK reverse */ >> +#define COM10_HREF_REV 0x08 /* Reverse HREF */ >> #define COM10_VS_LEAD 0x04 /* VSYNC on clock leading edge */ >> +#define OV9655_COM10_RESET_OPTION 0x04 /* Reset signal end point */ >> #define COM10_VS_NEG 0x02 /* VSYNC negative */ >> #define COM10_HS_NEG 0x01 /* HSYNC negative */ >> +#define OV9655_REG16 0x16 /* dummy frame and blanking */ >> +#define OV9655_REG16_DUMMY_8 0x20 /* dummy frame when gain > 8 */ >> #define REG_HSTART 0x17 /* Horiz start high bits */ >> #define REG_HSTOP 0x18 /* Horiz stop high bits */ >> #define REG_VSTART 0x19 /* Vert start high bits */ >> @@ -117,6 +147,7 @@ >> #define REG_BBIAS 0x27 /* B channel output bias */ >> #define REG_GBBIAS 0x28 /* Gb channel output bias */ >> #define REG_GRCOM 0x29 /* Analog BLC & regulator */ >> +#define OV9655_PREGAIN 0x29 >> #define REG_EXHCH 0x2a /* Dummy pixel insert MSB */ >> #define REG_EXHCL 0x2b /* Dummy pixel insert LSB */ >> #define REG_RBIAS 0x2c /* R channel output bias */ >> @@ -127,12 +158,30 @@ >> #define REG_HSYEN 0x31 /* HSYNC falling edge delay LSB*/ >> #define REG_HREF 0x32 /* HREF pieces */ >> #define REG_CHLF 0x33 /* reserved */ >> +#define OV9655_CLKF 0x33 /* Array current control */ >> +#define OV9655_AREF1 0x34 /* Array reference control */ >> +#define OV9655_AREF2 0x35 /* Array reference control */ >> +#define OV9655_AREF3 0x36 /* Array reference control */ >> #define REG_ADC 0x37 /* reserved */ >> +#define OV9655_ADC 0x37 /* ADC Control 1 (Range adjustment) */ >> #define REG_ACOM 0x38 /* reserved */ >> -#define REG_OFON 0x39 /* Power down register */ >> +#define OV9655_ADC2 0x38 /* ADC Control 2 (Range adjustment) */ >> +#define REG_OFON 0x39 /* Power down register (ov9650 only) */ >> #define OFON_PWRDN 0x08 /* Power down bit */ >> +#define OV9655_AREF4 0x39 /* Array reference control */ >> #define REG_TSLB 0x3a /* YUVU format */ >> +#define OV9655_PCLKDELAY2NS 0x40 >> +#define OV9655_PCLKDELAY4NS 0x80 >> +#define OV9655_PCLKDELAY6NS 0xc0 >> +#define OV9655_OUTREVERSE 0x20 >> +#define OV9655_FIXEDUV 0x10 >> #define TSLB_YUYV_MASK 0x0c /* UYVY or VYUY - see com13 */ >> +#define TSLB_YUYV 0x00 >> +#define TSLB_YVYU 0x04 >> +#define TSLB_VYUY 0x08 >> +#define TSLB_UYVY 0x0c >> +#define OV9655_BANDINGAUTO 0x02 >> + >> #define REG_COM11 0x3b /* Night mode, banding filter enable */ >> #define COM11_NIGHT 0x80 /* Night mode enable */ >> #define COM11_NMFR 0x60 /* Two bit NM frame rate */ >> @@ -142,25 +191,38 @@ >> #define COM12_HREF 0x80 /* HREF always */ >> #define REG_COM13 0x3d /* Gamma selection, Color matrix en. */ >> #define COM13_GAMMA 0x80 /* Gamma enable */ >> -#define COM13_UVSAT 0x40 /* UV saturation auto adjustment */ >> +#define COM13_UVSAT 0x40 /* UV saturation auto adjustment */ >> +#define COM13_Y_DELAY 0x08 /* Delay Y channel */ >> #define COM13_UVSWAP 0x01 /* V before U - w/TSLB */ >> #define REG_COM14 0x3e /* Edge enhancement options */ >> #define COM14_EDGE_EN 0x02 >> #define COM14_EEF_X2 0x01 >> +#define OV9655_REG_COM14 0x3e /* pixel correction/zoom ON/OFF sel. */ >> +#define OV9655_COM14_BLACK_PIX 0x08 /* Black pixel correction */ >> +#define OV9655_COM14_WHITE_PIX 0x04 /* White pixel correction */ >> +#define OV9655_COM14_ZOOM 0x02 /* Zoom function ON */ >> #define REG_EDGE 0x3f /* Edge enhancement factor */ >> #define EDGE_FACTOR_MASK 0x0f >> #define REG_COM15 0x40 /* Output range, RGB 555/565 */ >> #define COM15_R10F0 0x00 /* Data range 10 to F0 */ >> -#define COM15_R01FE 0x80 /* 01 to FE */ >> +#define COM15_R01FE 0x80 /* 01 to FE */ >> #define COM15_R00FF 0xc0 /* 00 to FF */ >> #define COM15_RGB565 0x10 /* RGB565 output */ >> #define COM15_RGB555 0x30 /* RGB555 output */ >> #define COM15_SWAPRB 0x04 /* Swap R&B */ >> #define REG_COM16 0x41 /* Color matrix coeff options */ >> #define REG_COM17 0x42 /* Single frame out, banding filter */ >> +#define OV9655_REG_COM17 0x42 /* Denoise, edge, auto gain, ... */ >> +#define OV9655_COM17_EDGE_AUTO 0x40 /* Edge auto */ >> +#define OV9655_COM17_DENOISE_AUTO 0x80 /* Denoise auto */ >> +#define OV9655_REG_RSVD(__n) (0x43 + (__n) - 1) /* reserved but used... */ >> /* n = 1...9, 0x4f..0x57 */ >> -#define REG_MTX(__n) (0x4f + (__n) - 1) >> +#define REG_MTX(__n) (0x4f + (__n) - 1) >> #define REG_MTXS 0x58 >> +#define REG_AWBOP(__n) (0x59 + (__n) - 1) /* AWB control options */ >> +#define REG_BLMT 0x5F /* AWB Blue Component Gain Limit */ >> +#define REG_RLMT 0x60 /* AWB Red Component Gain Limit */ >> +#define REG_GLMT 0x61 /* AWB Green Component Gain Limit */ >> /* Lens Correction Option 1...5, __n = 0...5 */ >> #define REG_LCC(__n) (0x62 + (__n) - 1) >> #define LCC5_LCC_ENABLE 0x01 /* LCC5, enable lens correction */ >> @@ -170,10 +232,26 @@ >> #define REG_HV 0x69 /* Manual banding filter MSB */ >> #define REG_MBD 0x6a /* Manual banding filter value */ >> #define REG_DBLV 0x6b /* reserved */ >> +#define OV9655_REG_DBLV 0x6b /* PLL, DVDD regu bypass, bandgap */ >> +#define OV9655_DBLV_BANDGAP 0x0a /* default value */ >> +#define OV9655_DBLV_LDO_BYPASS 0x10 >> +#define OV9655_DBLV_PLL_BYPASS 0x00 >> +#define OV9655_DBLV_PLL_4X 0x40 >> +#define OV9655_DBLV_PLL_6X 0x80 >> +#define OV9655_DBLV_PLL_8X 0xc0 >> #define REG_GSP 0x6c /* Gamma curve */ >> #define GSP_LEN 15 >> +#define OV9655_REG_DNSTH 0x70 /* De-noise Function Threshold Adj. */ >> +#define OV9655_REG_POIDX 0x72 /* Pixel output index */ >> +#define OV9655_REG_PCKDV 0x73 /* Pixel Clock Output Selection */ >> +#define OV9655_REG_XINDX 0x74 /* Horizontal Scaling Down Coeff. */ >> +#define OV9655_REG_YINDX 0x75 /* Vertical Scaling Down Coeff. */ >> +#define OV9655_REG_SLOP 0x7A /* Gamma Curve Highest Segment Slope */ >> +#define OV9655_REG_GAM(__n) (0x7B + (__n) - 1) /* Gamma curve */ >> #define REG_GST 0x7c /* Gamma curve */ >> #define GST_LEN 15 >> +#define OV9655_REG_COM18 0x8b /* Zoom mode in VGA */ >> +#define OV9655_REG_COM19 0x8c /* UV adjustment */ >> #define REG_COM21 0x8b >> #define REG_COM22 0x8c /* Edge enhancement, denoising */ >> #define COM22_WHTPCOR 0x02 /* White pixel correction enable */ >> @@ -181,6 +259,8 @@ >> #define COM22_DENOISE 0x10 /* White pixel correction option */ >> #define REG_COM23 0x8d /* Color bar test, color gain */ >> #define COM23_TEST_MODE 0x10 >> +#define OV9655_REG_COM20 0x8d >> +#define OV9655_COM20_TEST_MODE 0x10 >> #define REG_DBLC1 0x8f /* Digital BLC */ >> #define REG_DBLC_B 0x90 /* Digital BLC B channel offset */ >> #define REG_DBLC_R 0x91 /* Digital BLC R channel offset */ >> @@ -193,6 +273,17 @@ >> #define REG_AECHM 0xa1 /* Exposure value - bits AEC[15:10] */ >> #define REG_BD50ST 0xa2 /* Banding filter value for 50Hz */ >> #define REG_BD60ST 0xa3 /* Banding filter value for 60Hz */ >> +#define OV9655_REG_COM21 0xa4 /* Digital gain */ >> +#define OV9655_REG_AWB_GREEN 0xa6 /* AWB green */ >> +#define OV9655_REG_REF_A8 0xa8 /* Analog Reference Control */ >> +#define OV9655_REG_REF_A9 0xa9 /* Analog Reference Control */ >> +#define OV9655_REG_BLC(__n) (0xac + (__n) - 1) /* Black Level Control */ >> +#define OV9655_REG_CTRLB4 0xb4 /* UV adjustment */ >> +#define OV9655_REG_ADBOFF 0xbc /* ADC B channel offset setting */ >> +#define OV9655_REG_ADROFF 0xbd /* ADC R channel offset setting */ >> +#define OV9655_REG_ADGBOFF 0xbe /* ADC Gb channel offset setting */ >> +#define OV9655_REG_ADGEOFF 0xbf /* ADC Gr channel offset setting */ >> +#define OV9655_REG_COM24 0xc7 /* Pixel clock frequency selection */ >> #define REG_NULL 0xff /* Array end token */ >> >> #define DEF_CLKRC 0x80 >> @@ -200,6 +291,7 @@ >> #define OV965X_ID(_msb, _lsb) ((_msb) << 8 | (_lsb)) >> #define OV9650_ID 0x9650 >> #define OV9652_ID 0x9652 >> +#define OV9655V5_ID 0x9657 >> >> struct ov965x_ctrls { >> struct v4l2_ctrl_handler handler; >> @@ -458,6 +550,292 @@ struct ov965x_pixfmt { >> {{ 1, 25 }, { QVGA_WIDTH, QVGA_HEIGHT }, 1 }, /* 25 fps */ >> }; >> >> +/* OV9655 */ >> +static const struct i2c_rv ov9655_init_regs[] = { >> + { REG_GAIN, 0x00 }, >> + { REG_BLUE, 0x80 }, >> + { REG_RED, 0x80 }, >> + { REG_VREF, 0x02 }, >> + { REG_COM1, 0x03 }, >> + { REG_COM2, 0x01 },/* Output drive x2 */ >> + { REG_COM3, COM3_RGB565 },/* Output drive x2, RGB565 */ >> + { REG_COM5, 0x60 | OV9655_EXPOSURESTEP },/* 0x60 ? */ >> + { REG_COM6, COM6_BLC_OPTICAL }, >> + { REG_CLKRC, 0x01 },/* F(internal clk) = F(input clk) / 2 */ >> + { REG_COM7, OV9655_COM7_VGA | OV9655_COM7_YUV }, >> + { REG_COM8, COM8_FASTAEC | COM8_AECSTEP | >> + COM8_AGC | COM8_AWB | COM8_AEC }, >> + { REG_COM9, COM9_GAIN_CEIL_16X | OV9655_COM9_EXPTIMING | >> + OV9655_COM9_AECDROP }, >> + { OV9655_REG16, OV9655_REG16_DUMMY_8 | 0x4 }, >> + { REG_HSTART, 0x18 }, >> + { REG_HSTOP, 0x04 }, >> + { REG_VSTART, 0x01 }, >> + { REG_VSTOP, 0x81 }, >> + { REG_MVFP, 0x00 },/* No mirror/flip */ >> + { REG_AEW, 0x3c }, >> + { REG_AEB, 0x36 }, >> + { REG_VPT, 0x72 }, >> + { REG_BBIAS, 0x08 }, >> + { REG_GBBIAS, 0x08 }, >> + { OV9655_PREGAIN, 0x15 }, >> + { REG_EXHCH, 0x00 }, >> + { REG_EXHCL, 0x00 }, >> + { REG_RBIAS, 0x08 }, >> + { REG_HREF, 0x12 },/* QVGA */ >> + { REG_CHLF, 0x00 }, >> + { OV9655_AREF1, 0x3f }, >> + { OV9655_AREF2, 0x00 }, >> + { OV9655_AREF3, 0x3a }, >> + { OV9655_ADC2, 0x72 }, >> + { OV9655_AREF4, 0x57 }, >> + { REG_TSLB, OV9655_PCLKDELAY6NS | TSLB_UYVY }, >> + { REG_COM11, 0x04 },/* 0x04 ? */ >> + { REG_COM13, COM13_GAMMA | 0x10 | >> + COM13_Y_DELAY | COM13_UVSWAP },/* 0x10 ? */ >> + {OV9655_REG_COM14, OV9655_COM14_ZOOM }, /* QVGA */ >> + { REG_EDGE, 0xc1 }, >> + { REG_COM15, COM15_R00FF },/* Full range output */ >> + { REG_COM16, 0x41 },/* 0x41 ? */ >> + { OV9655_REG_COM17, OV9655_COM17_EDGE_AUTO | >> + OV9655_COM17_DENOISE_AUTO }, >> + { OV9655_REG_RSVD(1), 0x0a }, >> + { OV9655_REG_RSVD(2), 0xf0 }, >> + { OV9655_REG_RSVD(3), 0x46 }, >> + { OV9655_REG_RSVD(4), 0x62 }, >> + { OV9655_REG_RSVD(5), 0x2a }, >> + { OV9655_REG_RSVD(6), 0x3c }, >> + { OV9655_REG_RSVD(7), 0xfc }, >> + { OV9655_REG_RSVD(8), 0xfc }, >> + { OV9655_REG_RSVD(9), 0x7f }, >> + { OV9655_REG_RSVD(10), 0x7f }, >> + { OV9655_REG_RSVD(11), 0x7f }, >> + { REG_MTX(1), 0x98 }, >> + { REG_MTX(2), 0x98 }, >> + { REG_MTX(3), 0x00 }, >> + { REG_MTX(4), 0x28 }, >> + { REG_MTX(5), 0x70 }, >> + { REG_MTX(6), 0x98 }, >> + { REG_MTXS, 0x1a }, >> + { REG_AWBOP(1), 0x85 }, >> + { REG_AWBOP(2), 0xa9 }, >> + { REG_AWBOP(3), 0x64 }, >> + { REG_AWBOP(4), 0x84 }, >> + { REG_AWBOP(5), 0x53 }, >> + { REG_AWBOP(6), 0x0e }, >> + { REG_BLMT, 0xf0 }, >> + { REG_RLMT, 0xf0 }, >> + { REG_GLMT, 0xf0 }, >> + { REG_LCC(1), 0x00 }, >> + { REG_LCC(2), 0x00 }, >> + { REG_LCC(3), 0x02 }, >> + { REG_LCC(4), 0x20 }, >> + { REG_LCC(5), 0x00 }, >> + { 0x69, 0x0a },/* Reserved... */ >> + { OV9655_REG_DBLV, OV9655_DBLV_PLL_4X | OV9655_DBLV_LDO_BYPASS | >> + OV9655_DBLV_BANDGAP }, >> + { 0x6c, 0x04 },/* Reserved... */ >> + { 0x6d, 0x55 },/* Reserved... */ >> + { 0x6e, 0x00 },/* Reserved... */ >> + { 0x6f, 0x9d },/* Reserved... */ >> + { OV9655_REG_DNSTH, 0x21 }, >> + { 0x71, 0x78 },/* Reserved... */ >> + { OV9655_REG_POIDX, 0x11 },/* QVGA */ >> + { OV9655_REG_PCKDV, 0x01 },/* QVGA */ >> + { OV9655_REG_XINDX, 0x10 }, >> + { OV9655_REG_YINDX, 0x10 }, >> + { 0x76, 0x01 },/* Reserved... */ >> + { 0x77, 0x02 },/* Reserved... */ >> + { 0x7A, 0x12 },/* Reserved... */ >> + { OV9655_REG_GAM(1), 0x08 }, >> + { OV9655_REG_GAM(2), 0x16 }, >> + { OV9655_REG_GAM(3), 0x30 }, >> + { OV9655_REG_GAM(4), 0x5e }, >> + { OV9655_REG_GAM(5), 0x72 }, >> + { OV9655_REG_GAM(6), 0x82 }, >> + { OV9655_REG_GAM(7), 0x8e }, >> + { OV9655_REG_GAM(8), 0x9a }, >> + { OV9655_REG_GAM(9), 0xa4 }, >> + { OV9655_REG_GAM(10), 0xac }, >> + { OV9655_REG_GAM(11), 0xb8 }, >> + { OV9655_REG_GAM(12), 0xc3 }, >> + { OV9655_REG_GAM(13), 0xd6 }, >> + { OV9655_REG_GAM(14), 0xe6 }, >> + { OV9655_REG_GAM(15), 0xf2 }, >> + { 0x8a, 0x24 },/* Reserved... */ >> + { OV9655_REG_COM19, 0x80 }, >> + { 0x90, 0x7d },/* Reserved... */ >> + { 0x91, 0x7b },/* Reserved... */ >> + { REG_LCCFB, 0x02 }, >> + { REG_LCCFR, 0x02 }, >> + { REG_DBLC_GB, 0x7a }, >> + { REG_DBLC_GR, 0x79 }, >> + { REG_AECHM, 0x40 }, >> + { OV9655_REG_COM21, 0x50 }, >> + { 0xa5, 0x68 },/* Reserved... */ >> + { OV9655_REG_AWB_GREEN, 0x4a }, >> + { OV9655_REG_REF_A8, 0xc1 }, >> + { OV9655_REG_REF_A9, 0xef }, >> + { 0xaa, 0x92 },/* Reserved... */ >> + { 0xab, 0x04 },/* Reserved... */ >> + { OV9655_REG_BLC(1), 0x80 }, >> + { OV9655_REG_BLC(2), 0x80 }, >> + { OV9655_REG_BLC(3), 0x80 }, >> + { OV9655_REG_BLC(4), 0x80 }, >> + { OV9655_REG_BLC(7), 0xf2 }, >> + { OV9655_REG_BLC(8), 0x20 }, >> + { OV9655_REG_CTRLB4, 0x20 }, >> + { 0xb5, 0x00 },/* Reserved... */ >> + { 0xb6, 0xaf },/* Reserved... */ >> + { 0xb6, 0xaf },/* Reserved... */ >> + { 0xbb, 0xae },/* Reserved... */ >> + { OV9655_REG_ADBOFF, 0x7f }, >> + { OV9655_REG_ADROFF, 0x7f }, >> + { OV9655_REG_ADGBOFF, 0x7f }, >> + { OV9655_REG_ADGEOFF, 0x7f }, >> + { OV9655_REG_ADGEOFF, 0x7f }, >> + { 0xc0, 0xaa },/* Reserved... */ >> + { 0xc1, 0xc0 },/* Reserved... */ >> + { 0xc2, 0x01 },/* Reserved... */ >> + { 0xc3, 0x4e },/* Reserved... */ >> + { 0xc6, 0x05 },/* Reserved... */ >> + { OV9655_REG_COM24, 0x81 },/* QVGA */ >> + { 0xc9, 0xe0 },/* Reserved... */ >> + { 0xca, 0xe8 },/* Reserved... */ >> + { 0xcb, 0xf0 },/* Reserved... */ >> + { 0xcc, 0xd8 },/* Reserved... */ >> + { 0xcd, 0x93 },/* Reserved... */ >> + { REG_COM7, OV9655_COM7_VGA | OV9655_COM7_RGB }, >> + { REG_COM15, COM15_RGB565 }, >> + { REG_NULL, 0} >> +}; >> + >> +static const struct i2c_rv ov9655_qvga_regs[] = { >> + { REG_HREF, 0x12 }, >> + { OV9655_REG_COM14, OV9655_COM14_ZOOM }, >> + { OV9655_REG_POIDX, 0x11 }, >> + { OV9655_REG_PCKDV, 0x01 }, >> + { OV9655_REG_COM24, 0x81 }, >> + { REG_NULL, 0} >> +}; >> + >> +static const struct i2c_rv ov9655_qqvga_regs[] = { >> + { REG_HREF, 0xa4 }, >> + { REG_COM14, OV9655_COM14_BLACK_PIX | OV9655_COM14_WHITE_PIX | >> + OV9655_COM14_ZOOM }, >> + { OV9655_REG_POIDX, 0x22 }, >> + { OV9655_REG_PCKDV, 0x02 }, >> + { OV9655_REG_COM24, 0x82 }, >> + { REG_NULL, 0} >> +}; >> + >> +static const struct i2c_rv ov9655_vga_regs[] = { >> + { REG_GAIN, 0x11 }, >> + { REG_VREF, 0x12 }, >> + { REG_B_AVE, 0x2e }, >> + { REG_GB_AVE, 0x2e }, >> + { REG_GR_AVE, 0x2e }, >> + { REG_R_AVE, 0x2e }, >> + { REG_COM6, 0x48 }, >> + { REG_AECH, 0x7b }, >> + { REG_CLKRC, 0x03 }, >> + { REG_COM8, COM8_FASTAEC | COM8_AECSTEP | COM8_BFILT | >> + COM8_AGC | COM8_AWB | COM8_AEC }, >> + { REG_HSTART, 0x16 }, >> + { REG_HSTOP, 0x02 }, >> + { REG_VSTART, 0x01 }, >> + { REG_VSTOP, 0x3d }, >> + { REG_MVFP, 0x04 }, >> + { REG_YAVE, 0x2e }, >> + { REG_HREF, 0xff }, >> + { OV9655_AREF1, 0x3d }, >> + { OV9655_AREF3, 0xfa }, >> + { REG_TSLB, 0xcc }, >> + { REG_COM11, 0xcc }, >> + { REG_COM14, 0x0c }, >> + { REG_EDGE, 0x82 }, >> + { REG_COM15, COM15_R00FF | COM15_RGB565 },/* full range */ >> + { REG_COM16, 0x40 }, >> + { OV9655_REG_RSVD(1), 0x14 }, >> + { OV9655_REG_RSVD(2), 0xf0 }, >> + { OV9655_REG_RSVD(3), 0x46 }, >> + { OV9655_REG_RSVD(4), 0x62 }, >> + { OV9655_REG_RSVD(5), 0x2a }, >> + { OV9655_REG_RSVD(6), 0x3c }, >> + { OV9655_REG_RSVD(8), 0xe9 }, >> + { OV9655_REG_RSVD(9), 0xdd }, >> + { OV9655_REG_RSVD(10), 0xdd }, >> + { OV9655_REG_RSVD(11), 0xdd }, >> + { OV9655_REG_RSVD(12), 0xdd }, >> + { REG_LCC(1), 0x00 }, >> + { REG_LCC(2), 0x00 }, >> + { REG_LCC(3), 0x02 }, >> + { REG_LCC(4), 0x20 }, >> + { REG_LCC(5), 0x01 }, >> + { REG_GSP, 0x0c }, >> + { 0x6f, 0x9e },/* Reserved... */ >> + { OV9655_REG_DNSTH, 0x06 }, >> + { OV9655_REG_POIDX, 0x00 }, >> + { OV9655_REG_PCKDV, 0x00 }, >> + { OV9655_REG_XINDX, 0x3a }, >> + { OV9655_REG_YINDX, 0x35 }, >> + { OV9655_REG_SLOP, 0x20 }, >> + { OV9655_REG_GAM(1), 0x1c }, >> + { OV9655_REG_GAM(2), 0x28 }, >> + { OV9655_REG_GAM(3), 0x3c }, >> + { OV9655_REG_GAM(4), 0x5a }, >> + { OV9655_REG_GAM(5), 0x68 }, >> + { OV9655_REG_GAM(6), 0x76 }, >> + { OV9655_REG_GAM(7), 0x80 }, >> + { OV9655_REG_GAM(8), 0x88 }, >> + { OV9655_REG_GAM(9), 0x8f }, >> + { OV9655_REG_GAM(10), 0x96 }, >> + { OV9655_REG_GAM(11), 0xa3 }, >> + { OV9655_REG_GAM(12), 0xaf }, >> + { OV9655_REG_GAM(13), 0xc4 }, >> + { OV9655_REG_GAM(14), 0xd7 }, >> + { OV9655_REG_GAM(15), 0xe8 }, >> + { 0x8a, 0x23 },/* Reserved... */ >> + { OV9655_REG_COM19, 0x8d }, >> + { 0x90, 0x92 },/* Reserved... */ >> + { 0x91, 0x92 },/* Reserved... */ >> + { REG_DBLC_GB, 0x90 }, >> + { REG_DBLC_GR, 0x90 }, >> + { OV9655_REG_AWB_GREEN, 0x40 }, >> + { OV9655_REG_ADBOFF, 0x02 }, >> + { OV9655_REG_ADROFF, 0x01 }, >> + { OV9655_REG_ADGBOFF, 0x02 }, >> + { OV9655_REG_ADGEOFF, 0x01 }, >> + { 0xc1, 0xc8 },/* Reserved... */ >> + { 0xc6, 0x85 },/* Reserved... */ >> + { OV9655_REG_COM24, 0x80 }, >> + { REG_NULL, 0} >> +}; >> + >> +static const struct ov965x_framesize ov9655_framesizes[] = { >> + { >> + .width = VGA_WIDTH, >> + .height = VGA_HEIGHT, >> + .regs = ov9655_vga_regs, >> + .max_exp_lines = 498, >> + }, { >> + .width = QVGA_WIDTH, >> + .height = QVGA_HEIGHT, >> + .regs = ov9655_qvga_regs, >> + .max_exp_lines = 248, >> + }, >> + { >> + .width = QQVGA_WIDTH, >> + .height = QQVGA_HEIGHT, >> + .regs = ov9655_qqvga_regs, >> + .max_exp_lines = 124, >> + }, >> +}; >> + >> +static const struct ov965x_pixfmt ov9655_formats[] = { >> + { MEDIA_BUS_FMT_RGB565_2X8_LE, V4L2_COLORSPACE_SRGB, 0x08}, >> +}; >> + >> static inline struct v4l2_subdev *ctrl_to_sd(struct v4l2_ctrl *ctrl) >> { >> return &container_of(ctrl->handler, struct ov965x, ctrls.handler)->sd; >> @@ -894,12 +1272,16 @@ static int ov965x_set_test_pattern(struct ov965x *ov965x, int value) >> { >> int ret; >> u8 reg; >> + u8 addr = (ov965x->id == OV9655V5_ID) ? >> + REG_COM3 : REG_COM23; >> + u8 mask = (ov965x->id == OV9655V5_ID) ? >> + COM3_COLORBAR : COM23_TEST_MODE; >> >> - ret = ov965x_read(ov965x->client, REG_COM23, ®); >> + ret = ov965x_read(ov965x->client, addr, ®); >> if (ret < 0) >> return ret; >> - reg = value ? reg | COM23_TEST_MODE : reg & ~COM23_TEST_MODE; >> - return ov965x_write(ov965x->client, REG_COM23, reg); >> + reg = value ? reg | mask : reg & ~mask; >> + return ov965x_write(ov965x->client, addr, reg); >> } >> >> static int __g_volatile_ctrl(struct ov965x *ov965x, struct v4l2_ctrl *ctrl) >> @@ -1102,6 +1484,30 @@ static int ov965x_initialize_controls(struct ov965x *ov965x) >> return 0; >> } >> >> +static int ov9655_initialize_controls(struct ov965x *ov965x) >> +{ >> + const struct v4l2_ctrl_ops *ops = &ov965x_ctrl_ops; >> + struct ov965x_ctrls *ctrls = &ov965x->ctrls; >> + struct v4l2_ctrl_handler *hdl = &ctrls->handler; >> + int ret; >> + >> + ret = v4l2_ctrl_handler_init(hdl, 16); >> + if (ret < 0) >> + return ret; >> + >> + v4l2_ctrl_new_std_menu_items(hdl, ops, V4L2_CID_TEST_PATTERN, >> + ARRAY_SIZE(test_pattern_menu) - 1, 0, 0, >> + test_pattern_menu); >> + if (hdl->error) { >> + ret = hdl->error; >> + v4l2_ctrl_handler_free(hdl); >> + return ret; >> + } >> + >> + ov965x->sd.ctrl_handler = hdl; >> + return 0; >> +} >> + >> /* >> * V4L2 subdev video and pad level operations >> */ >> @@ -1518,9 +1924,15 @@ static int ov965x_detect_sensor(struct v4l2_subdev *sd) >> >> if (!ret) { >> ov965x->id = OV965X_ID(pid, ver); >> - if (ov965x->id == OV9650_ID || ov965x->id == OV9652_ID) { >> + switch (ov965x->id) { >> + case OV9650_ID: >> + case OV9652_ID: >> v4l2_info(sd, "Found OV%04X sensor\n", ov965x->id); >> - } else { >> + break; >> + case OV9655V5_ID: >> + v4l2_info(sd, "Found OV%04X sensor\n", ov965x->id - 2); >> + break; >> + default: >> v4l2_err(sd, "Sensor detection failed (%04X, %d)\n", >> ov965x->id, ret); >> ret = -ENODEV; >> @@ -1598,18 +2010,28 @@ static int ov965x_probe(struct i2c_client *client, >> if (ret < 0) >> goto err_me; >> >> - ov965x->init_regs = ov965x_init_regs; >> - ov965x->initialize_controls = ov965x_initialize_controls; >> - ov965x->framesizes = ov965x_framesizes; >> - ov965x->nb_of_framesizes = ARRAY_SIZE(ov965x_framesizes); >> - ov965x->formats = ov965x_formats; >> - ov965x->nb_of_formats = ARRAY_SIZE(ov965x_formats); >> - ov965x->intervals = ov965x_intervals; >> - ov965x->nb_of_intervals = ARRAY_SIZE(ov965x_intervals); >> - ov965x->fiv = &ov965x_intervals[0]; >> - ov965x->set_frame_interval = __ov965x_set_frame_interval; >> - ov965x->update_exposure_ctrl = ov965x_update_exposure_ctrl; >> - ov965x->set_params = __ov965x_set_params; >> + if (ov965x->id != OV9655V5_ID) { >> + ov965x->init_regs = ov965x_init_regs; >> + ov965x->initialize_controls = ov965x_initialize_controls; >> + ov965x->framesizes = ov965x_framesizes; >> + ov965x->nb_of_framesizes = ARRAY_SIZE(ov965x_framesizes); >> + ov965x->formats = ov965x_formats; >> + ov965x->nb_of_formats = ARRAY_SIZE(ov965x_formats); >> + ov965x->intervals = ov965x_intervals; >> + ov965x->nb_of_intervals = ARRAY_SIZE(ov965x_intervals); >> + ov965x->fiv = &ov965x_intervals[0]; >> + ov965x->set_frame_interval = __ov965x_set_frame_interval; >> + ov965x->update_exposure_ctrl = ov965x_update_exposure_ctrl; >> + ov965x->set_params = __ov965x_set_params; >> + } else { >> + ov965x->init_regs = ov9655_init_regs; >> + ov965x->initialize_controls = ov9655_initialize_controls; >> + ov965x->framesizes = ov9655_framesizes; >> + ov965x->nb_of_framesizes = ARRAY_SIZE(ov9655_framesizes); >> + ov965x->formats = ov9655_formats; >> + ov965x->nb_of_formats = ARRAY_SIZE(ov9655_formats); >> + ov965x->set_params = ov965x_set_frame_size; >> + }; >> >> ov965x->frame_size = &ov965x->framesizes[0]; >> ov965x_get_default_format(ov965x, &ov965x->format); >> @@ -1652,6 +2074,7 @@ static int ov965x_remove(struct i2c_client *client) >> static const struct i2c_device_id ov965x_id[] = { >> { "OV9650", 0x9650 }, >> { "OV9652", 0x9652 }, >> + { "OV9655", 0x9655 }, > > i2c device ids should be lower case to match compatible-strings in DT for > automatic modprobing. > > Please pick/merge/copy&paste > > > > With this change I get: > > root at letux:~# dmesg|fgrep ov96 > [ 12.727600] ov965x: Found OV9655 sensor > [ 12.747711] ov965x 1-0030: ov965x driver probed > root at letux:~# > > during probe. > Thanks for patch, I'll fix in v2 ! >> { /* sentinel */ } >> }; >> MODULE_DEVICE_TABLE(i2c, ov965x_id); >> @@ -1659,6 +2082,7 @@ static int ov965x_remove(struct i2c_client *client) >> static const struct of_device_id ov965x_of_match[] = { >> { .compatible = "ovti,ov9650", .data = (void *)0x9650 }, >> { .compatible = "ovti,ov9652", .data = (void *)0x9652 }, >> + { .compatible = "ovti,ov9655", .data = (void *)0x9655 }, >> { /* sentinel */ } >> }; >> MODULE_DEVICE_TABLE(of, ov965x_of_match); >> -- >> 1.9.1 >> >